//
//  Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

package entity

import "time"

// FieldWeight represents the weight configuration for a field
type FieldWeight struct {
	Enabled bool    `json:"enabled"`
	Weight  float64 `json:"weight"`
}

// FieldConfig represents the field configuration for skill indexing
type FieldConfig struct {
	Name        FieldWeight `json:"name"`
	Tags        FieldWeight `json:"tags"`
	Description FieldWeight `json:"description"`
	Content     FieldWeight `json:"content"`
}

// DefaultFieldConfig returns the default field configuration
func DefaultFieldConfig() FieldConfig {
	return FieldConfig{
		Name:        FieldWeight{Enabled: true, Weight: 3.0},
		Tags:        FieldWeight{Enabled: true, Weight: 2.0},
		Description: FieldWeight{Enabled: true, Weight: 1.0},
		Content:     FieldWeight{Enabled: false, Weight: 0.5},
	}
}

// SkillSearchConfig represents the search configuration for skills
type SkillSearchConfig struct {
	ID                     string     `gorm:"column:id;primaryKey;size:32" json:"id"`
	TenantID               string     `gorm:"column:tenant_id;size:32;not null;index" json:"tenant_id"`
	SpaceID                string     `gorm:"column:space_id;size:128;not null;default:'default';index" json:"space_id"`
	EmbdID                 string     `gorm:"column:embd_id;size:128;not null" json:"embd_id"`
	Status                 string     `gorm:"column:status;size:1;default:1" json:"status"`
	VectorSimilarityWeight float64    `gorm:"column:vector_similarity_weight;default:0.3" json:"vector_similarity_weight"`
	SimilarityThreshold    float64    `gorm:"column:similarity_threshold;default:0.2" json:"similarity_threshold"`
	FieldConfig            JSONMap    `gorm:"column:field_config;type:json" json:"field_config"`
	RerankID               *string    `gorm:"column:rerank_id;size:128" json:"rerank_id,omitempty"`
	TenantRerankID         *int64     `gorm:"column:tenant_rerank_id" json:"tenant_rerank_id,omitempty"`
	TopK                   int64      `gorm:"column:top_k;default:10" json:"top_k"`
	IndexVersion           string     `gorm:"column:index_version;size:32;default:'1.0.0'" json:"index_version"`
	BaseModel
}

// TableName returns the table name for SkillSearchConfig model
func (SkillSearchConfig) TableName() string {
	return "skill_search_configs"
}

// ToMap converts SkillSearchConfig to a map for JSON response
func (s *SkillSearchConfig) ToMap() map[string]interface{} {
	result := map[string]interface{}{
		"id":                       s.ID,
		"tenant_id":                s.TenantID,
		"space_id":                  s.SpaceID,
		"embd_id":                  s.EmbdID,
		"vector_similarity_weight": s.VectorSimilarityWeight,
		"similarity_threshold":     s.SimilarityThreshold,
		"field_config":             s.FieldConfig,
		"top_k":                    s.TopK,
		"index_version":            s.IndexVersion,
		"status":                   s.Status,
	}

	if s.RerankID != nil {
		result["rerank_id"] = *s.RerankID
	}
	if s.TenantRerankID != nil {
		result["tenant_rerank_id"] = *s.TenantRerankID
	}
	if s.CreateTime != nil {
		result["create_time"] = s.CreateTime
	}
	if s.UpdateTime != nil {
		result["update_time"] = time.UnixMilli(*s.UpdateTime).Format("2006-01-02 15:04:05")
	}

	return result
}

// SkillSearchResult represents a skill search result
type SkillSearchResult struct {
	SkillID      string   `json:"skill_id"`
	FolderID     string   `json:"folder_id"` // File system folder ID for retrieving files
	Name         string   `json:"name"`
	Description  string   `json:"description"`
	Tags         []string `json:"tags"`
	Score        float64  `json:"score"`
	BM25Score    float64  `json:"bm25_score,omitempty"`
	VectorScore  float64  `json:"vector_score,omitempty"`
	IndexVersion string   `json:"index_version,omitempty"`
	CreateTime   int64    `json:"create_time,omitempty"`
	Version      string   `json:"version,omitempty"` // Skill version from index
}
