package gensqlite

import (
	"strings"

	"github.com/xxjwxc/gormt/data/config"

	"github.com/xxjwxc/gormt/data/view/model"
)

// filterModel filter.过滤 gorm.Model
func filterModel(list *[]genColumns) bool {
	if config.GetDBTag() != "gorm" {
		return false
	}

	var _temp []genColumns
	num := 0
	for _, v := range *list {
		if strings.EqualFold(v.Name, "id") ||
			strings.EqualFold(v.Name, "created_at") ||
			strings.EqualFold(v.Name, "updated_at") ||
			strings.EqualFold(v.Name, "deleted_at") {
			num++
		} else {
			_temp = append(_temp, v)
		}
	}

	if num >= 4 {
		*list = _temp
		return true
	}

	return false
}

// fixForeignKey fix foreign key.过滤外键
func fixForeignKey(list []genForeignKey, columuName string, result *[]model.ForeignKey) {
	for _, v := range list {
		if strings.EqualFold(v.ColumnName, columuName) { // find it .找到了
			*result = append(*result, model.ForeignKey{
				TableName:  v.ReferencedTableName,
				ColumnName: v.ReferencedColumnName,
			})
		}
	}
}

// GetModel get model interface. 获取model接口
func GetModel() model.IModel {
	//now just support mysql
	return &SQLiteModel
}

// FixNotes 分析元素表注释
func FixNotes(em *model.ColumnsInfo, note string) {
	b0 := FixElementTag(em, note)        // gorm
	b1 := FixForeignKeyTag(em, em.Notes) // 外键
	if !b0 && b1 {                       // 补偿
		FixElementTag(em, em.Notes) // gorm
	}
}

// FixElementTag 分析元素表注释
func FixElementTag(em *model.ColumnsInfo, note string) bool {
	matches := noteRegex.FindStringSubmatch(note)
	if len(matches) < 2 {
		em.Notes = note
		return false
	}
	em.Notes = note[len(matches[0]):]
	em.Gormt = matches[1]
	return true
}

// FixForeignKeyTag 分析元素表注释(外键)
func FixForeignKeyTag(em *model.ColumnsInfo, note string) bool {
	matches := foreignKeyRegex.FindStringSubmatch(note) // foreign key 外键
	if len(matches) < 2 {
		em.Notes = note
		return false
	}
	em.Notes = note[len(matches[0]):]

	// foreign key 外键
	tmp := strings.Split(matches[1], ".")
	if len(tmp) > 0 {
		em.ForeignKeyList = append(em.ForeignKeyList, model.ForeignKey{
			TableName:  tmp[0],
			ColumnName: tmp[1],
		})
	}

	return true
}
