package database

import (
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
	"os"
)

func generateGormDbModel(dsn string, daoPath string) {

	currentPath, _ := os.Getwd()
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	genConfig := gen.Config{
		OutPath:      currentPath + "/dao" + daoPath + "/query",
		ModelPkgPath: currentPath + "/dao" + daoPath + "/model",
		Mode:         gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface,

		//// 表字段可为 null 值时, 对应结体字段使用指针类型
		FieldNullable: false, // generate pointer when field is nullable
		//
		//// 表字段默认值与模型结构体字段零值不一致的字段, 在插入数据时需要赋值该字段值为零值的, 结构体字段须是指针类型才能成功, 即`FieldCoverable:true`配置下生成的结构体字段.
		//// 因为在插入时遇到字段为零值的会被GORM赋予默认值. 如字段`age`表默认值为10, 即使你显式设置为0最后也会被GORM设为10提交.
		//// 如果该字段没有上面提到的插入时赋零值的特殊需要, 则字段为非指针类型使用起来会比较方便.
		//FieldCoverable: false, // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values
		//
		//// 模型结构体字段的数字类型的符号表示是否与表字段的一致, `false`指示都用有符号类型
		//FieldSignable: false, // detect integer field's unsigned type, adjust generated data type
		//// 生成 gorm 标签的字段索引属性
		//FieldWithIndexTag: false, // generate with gorm index tag
		//// 生成 gorm 标签的字段类型属性
		//FieldWithTypeTag: true, // generate with gorm column type tag
	}

	g := gen.NewGenerator(genConfig)

	g.WithImportPkgPath("github.com/shopspring/decimal")

	g.UseDB(db)

	// Add mapping for decimal(64,18) to decimal.Decimal
	// 自定义类型映射
	dataMap := map[string]func(detailType gorm.ColumnType) (dataType string){
		"tinyint":   func(detailType gorm.ColumnType) (dataType string) { return "int64" },
		"smallint":  func(detailType gorm.ColumnType) (dataType string) { return "int64" },
		"mediumint": func(detailType gorm.ColumnType) (dataType string) { return "int64" },
		"bigint":    func(detailType gorm.ColumnType) (dataType string) { return "int64" },
		"int":       func(detailType gorm.ColumnType) (dataType string) { return "int64" },
		"decimal":   func(detailType gorm.ColumnType) (dataType string) { return "decimal.Decimal" }, // 金额类型全部转换为第三方库,github.com/shopspring/decimal
	}
	g.WithDataTypeMap(dataMap)

	// 修改字段名，和系统关键字冲突
	g.WithOpts(gen.FieldRename("table", "MTable"))

	g.GenerateAllTable()

	g.ApplyBasic(g.GenerateAllTable()...)
	g.Execute()
}
