package beegopro

import (
	"strings"

	"github.com/beego/bee/v2/utils"
)

// parse get the model info
type ModelInfo struct {
	Name      string `json:"name"`      // mysql name
	InputType string `json:"inputType"` // user input type
	MysqlType string `json:"mysqlType"` // mysql type
	GoType    string `json:"goType"`    // go type
	Orm       string `json:"orm"`       // orm tag
	Comment   string `json:"comment"`   // mysql comment
	Extend    string `json:"extend"`    // user extend info
}

func (m ModelInfo) GetColumnKey() (columnKey string) {
	if m.InputType == "auto" || m.Orm == "pk" {
		columnKey = "PRI"
	}
	return
}

func (m ModelInfo) IsPrimaryKey() (flag bool) {
	if m.Orm == "auto" || m.Orm == "pk" || strings.ToLower(m.Name) == "id" {
		flag = true
	}
	return
}

type ModelInfos []ModelInfo

// to render model schemas
func (modelInfos ModelInfos) ToModelSchemas() (output ModelSchemas) {
	output = make(ModelSchemas, 0)
	for i, value := range modelInfos {
		if i == 0 && !value.IsPrimaryKey() {
			inputType, goType, mysqlType, ormTag := getModelType("auto")
			output = append(output, &ModelSchema{
				Name:      "id",
				InputType: inputType,
				ColumnKey: "PRI",
				Comment:   "ID",
				MysqlType: mysqlType,
				GoType:    goType,
				OrmTag:    ormTag,
				Extend:    value.Extend,
			})
		}

		modelSchema := &ModelSchema{
			Name:      value.Name,
			InputType: value.InputType,
			ColumnKey: value.GetColumnKey(),
			MysqlType: value.MysqlType,
			Comment:   value.Comment,
			GoType:    value.GoType,
			OrmTag:    value.Orm,
		}
		output = append(output, modelSchema)
	}
	return
}

type ModelSchema struct {
	Name      string // column name
	InputType string // user input type
	MysqlType string // mysql type
	ColumnKey string // PRI
	Comment   string // comment
	GoType    string // go type
	OrmTag    string // orm tag
	Extend    string
}

type ModelSchemas []*ModelSchema

func (m ModelSchemas) IsExistTime() bool {
	for _, value := range m {
		if value.InputType == "datetime" {
			return true
		}
	}
	return false
}

func (m ModelSchemas) GetPrimaryKey() string {
	camelPrimaryKey := ""
	for _, value := range m {
		if value.ColumnKey == "PRI" {
			camelPrimaryKey = utils.CamelString(value.Name)
		}
	}
	return camelPrimaryKey
}