package domain

import "fmt"

// Field 字段
type Field struct {
	// 字段Id
	// FieldId int `json:"fieldId"`
	// 索引序号
	Index int `json:"index"`
	// 名称
	Name string `json:"name"`
	// 对应数据库名称
	SQLName string `json:"sqlName"`
	// 对应数据库类型
	SQLType string `json:"sqlType"`
	// 描述
	Description string `json:"description"`
	// 标识 1:主表字段 2:手动添加
	Flag int `json:"flag"`
}

func (f *Field) Valid() error {
	if _, ok := SQLTypeMap[f.SQLType]; !ok {
		return fmt.Errorf("unknown sql type:%v", f.SQLType)
	}
	if f.Index == 0 && f.Flag == ManualField {
		return fmt.Errorf("field:%v index is 0", f.Name)
	}
	return nil
}

type Fields []*Field

func (fields Fields) ToMap() map[string]*Field {
	m := make(map[string]*Field)
	for i := range fields {
		m[fields[i].Name] = fields[i]
	}
	return m
}

func (fields Fields) Select(options map[string]interface{}) []*Field {
	var result []*Field
	for _, field := range fields {
		if v, ok := options["flag"]; ok {
			if v.(int) != field.Flag {
				continue
			}
		}
		result = append(result, field)
	}
	return result
}

func ValidFields(fields []*Field) error {
	m := (Fields)(fields).ToMap()
	if len(m) != len(fields) {
		return fmt.Errorf("列名重复发")
	}

	for _, f := range fields {
		if err := f.Valid(); err != nil {
			return err
		}
	}
	return nil
}

func FieldsChange(oldFields []*Field, newFields []*Field) (reserve []*Field, delete []*Field, add []*Field) {
	var oldFieldsMap = (Fields)(oldFields).ToMap()
	var newFieldsMap = (Fields)(newFields).ToMap()

	for _, f := range newFields {
		if _, ok := oldFieldsMap[f.Name]; ok {
			reserve = append(reserve, f)
			continue
		} else {
			add = append(add, f)
			continue
		}
	}

	for _, f := range oldFields {
		if _, ok := newFieldsMap[f.Name]; !ok {
			delete = append(delete, f)
			continue
		}
	}
	return
}