package model

import (
	"encoding/json"
	"time"
)

// TableDDLInfo 表结构信息
type TableDDLInfo struct {
	TableName    string         `json:"table_name"`     // 表名
	TableComment string         `json:"table_comment"`  // 表注释
	Columns      []ColumnInfo   `json:"columns"`        // 列信息
	DDL          string         `json:"ddl"`            // 建表DDL
	Indexes      []IndexInfo    `json:"indexes"`        // 索引信息
}

// ColumnInfo 列信息
type ColumnInfo struct {
	ColumnName    string `json:"column_name"`     // 列名
	DataType      string `json:"data_type"`       // 数据类型
	ColumnType    string `json:"column_type"`     // 列类型（含长度）
	IsNullable    string `json:"is_nullable"`     // 是否可空
	DefaultValue  string `json:"default_value"`   // 默认值
	ColumnKey     string `json:"column_key"`      // 主键/索引
	Extra         string `json:"extra"`           // 自增等
	ColumnComment string `json:"column_comment"`  // 列注释
	MappedName    string `json:"mapped_name"`     // 字段中文映射名
}

// IndexInfo 索引信息
type IndexInfo struct {
	IndexName  string `json:"index_name"`  // 索引名
	ColumnName string `json:"column_name"`  // 列名
	NonUnique  int    `json:"non_unique"`  // 是否唯一
	IndexType  string `json:"index_type"`  // 索引类型
}

// SubTableInfo 子表信息
type SubTableInfo struct {
	ID              string          `json:"id"`                 // UUID
	DatabaseID      string          `json:"database_id"`        // 关联的数据库ID
	ParentTable    string          `json:"parent_table"`        // 父表名
	SubTableName    string          `json:"sub_table_name"`     // 子表名
	SubTableComment string          `json:"sub_table_comment"`  // 子表注释
	MappingType     string          `json:"mapping_type" gorm:"type:varchar(20)"`       // 映射类型
	RelationField   string          `json:"relation_field" gorm:"type:varchar(100)"`     // 关联字段
	RelationType    string          `json:"relation_type" gorm:"type:varchar(20)"`       // 关联类型
	Fields         string          `json:"-" gorm:"type:longtext"`                      // 字段映射列表（JSON 格式，内部存储）
	FieldsList     []FieldMapping  `json:"fields" gorm:"-"`           // 字段映射列表（返回给前端）
	DDL            string          `json:"ddl" gorm:"type:longtext"`                   // 建表 DDL
	CreatedAt      time.Time       `json:"created_at"`
	UpdatedAt      time.Time       `json:"updated_at"`
}

// FieldMapping 字段映射
type FieldMapping struct {
	ColumnName string `json:"column_name"` // 列名
	MappedName string `json:"mapped_name"` // 中文映射名
}

// GetFields 获取字段映射列表
func (s *SubTableInfo) GetFields() []FieldMapping {
	if s.Fields == "" {
		return nil
	}
	var fields []FieldMapping
	if err := json.Unmarshal([]byte(s.Fields), &fields); err != nil {
		return nil
	}
	return fields
}

// SetFields 设置字段映射列表
func (s *SubTableInfo) SetFields(fields []FieldMapping) {
	if len(fields) == 0 {
		s.Fields = ""
		return
	}
	data, _ := json.Marshal(fields)
	s.Fields = string(data)
}

// TableName 表名
func (SubTableInfo) TableName() string {
	return "sub_table_info"
}

// CreateSubTableRequest 创建子表请求
type CreateSubTableRequest struct {
	DatabaseID      string          `json:"database_id" binding:"required"`
	ParentTable    string          `json:"parent_table" binding:"required"`
	SubTableName    string          `json:"sub_table_name" binding:"required"`
	SubTableComment string          `json:"sub_table_comment"`
	MappingType     string          `json:"mapping_type"`
	RelationField   string          `json:"relation_field"`
	RelationType    string          `json:"relation_type"`
	Fields          []FieldMapping  `json:"fields"` // 字段映射列表
	DDL            string          `json:"ddl"`   // 建表DDL
}

// UpdateSubTableRequest 更新子表请求
type UpdateSubTableRequest struct {
	ParentTable    string `json:"parent_table"`
	SubTableName    string `json:"sub_table_name"`
	SubTableComment string `json:"sub_table_comment"`
	MappingType     string `json:"mapping_type"`
	RelationField   string `json:"relation_field"`
	RelationType    string `json:"relation_type"`
	DDL            string `json:"ddl"`
}

// SubTableMapping 完整的子表映射配置（存储到文件的格式）
type SubTableMapping struct {
	DatabaseID  string         `json:"database_id"`
	DatabaseName string        `json:"database_name"`
	DBType      string         `json:"db_type"`
	Tables      []SubTableInfo `json:"tables"`
	UpdatedAt   time.Time      `json:"updated_at"`
}
