package domain

import "time"

// CustomFieldType 自定义字段类型
type CustomFieldType int

const (
	CustomFieldTypeString  CustomFieldType = iota // 字符串
	CustomFieldTypeNumber                        // 数字
	CustomFieldTypeBoolean                       // 布尔
	CustomFieldTypeDate                          // 日期
)

// CustomField 自定义字段定义
type CustomField struct {
	ID          int64           `gorm:"primaryKey;autoIncrement" json:"id"`
	Name       string          `gorm:"type:varchar(50);not null" json:"name"`       // 字段名称
	FieldKey   string          `gorm:"type:varchar(50);uniqueIndex;not null" json:"field_key"` // 字段标识符
	Type       CustomFieldType `gorm:"type:int;not null" json:"type"`               // 字段类型
	Required   bool            `gorm:"default:false" json:"required"`                // 是否必填
	DefaultVal string          `gorm:"type:varchar(255)" json:"default_val"`        // 默认值
	MinLen     int             `gorm:"default:0" json:"min_len"`                    // 最小长度（字符串）
	MaxLen     int             `gorm:"default:255" json:"max_len"`                   // 最大长度（字符串）
	MinVal     float64         `gorm:"default:0" json:"min_val"`                   // 最小值（数字）
	MaxVal     float64         `gorm:"default:0" json:"max_val"`                    // 最大值（数字）
	Options    string          `gorm:"type:varchar(500)" json:"options"`            // 选项列表（逗号分隔）
	Sort       int             `gorm:"default:0" json:"sort"`                       // 排序
	Status     int             `gorm:"type:int;default:1" json:"status"`           // 状态：1启用 0禁用
	CreatedAt  time.Time       `gorm:"autoCreateTime" json:"created_at"`
	UpdatedAt  time.Time       `gorm:"autoUpdateTime" json:"updated_at"`
}

// TableName 指定表名
func (CustomField) TableName() string {
	return "custom_fields"
}

// UserCustomFieldValue 用户自定义字段值
type UserCustomFieldValue struct {
	ID        int64     `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID    int64     `gorm:"not null;index;uniqueIndex:idx_user_field" json:"user_id"`
	FieldID   int64     `gorm:"not null;index;uniqueIndex:idx_user_field" json:"field_id"`
	FieldKey  string    `gorm:"type:varchar(50);not null" json:"field_key"` // 反规范化存储便于查询
	Value     string    `gorm:"type:text" json:"value"`                     // 存储为字符串
	CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
	UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
}

// TableName 指定表名
func (UserCustomFieldValue) TableName() string {
	return "user_custom_field_values"
}

// CustomFieldValueResponse 自定义字段值响应
type CustomFieldValueResponse struct {
	FieldKey string      `json:"field_key"`
	Value    interface{} `json:"value"`
}

// GetValueAsInterface 根据字段类型返回解析后的值
func (v *UserCustomFieldValue) GetValueAsInterface(field *CustomField) interface{} {
	switch field.Type {
	case CustomFieldTypeString:
		return v.Value
	case CustomFieldTypeNumber:
		var f float64
		for _, c := range v.Value {
			if c >= '0' && c <= '9' || c == '.' {
				continue
			}
			return v.Value
		}
		if _, err := parseFloat(v.Value, &f); err == nil {
			return f
		}
		return v.Value
	case CustomFieldTypeBoolean:
		return v.Value == "true" || v.Value == "1"
	case CustomFieldTypeDate:
		t, err := time.Parse("2006-01-02", v.Value)
		if err == nil {
			return t.Format("2006-01-02")
		}
		return v.Value
	default:
		return v.Value
	}
}

func parseFloat(s string, f *float64) (int, error) {
	var sign, decimals int
	varMantissa := 0
	*f = 0

	i := 0
	if i < len(s) && s[i] == '-' {
		sign = 1
		i++
	}

	for ; i < len(s); i++ {
		c := s[i]
		if c == '.' {
			decimals = 1
			continue
		}
		if c < '0' || c > '9' {
			return i, nil
		}
		n := float64(c - '0')
		*f = *f*10 + n
		varMantissa++
	}

	if decimals > 0 {
		for ; decimals > 0; decimals-- {
			*f /= 10
		}
	}

	if sign == 1 {
		*f = -*f
	}

	return i, nil
}
