package gencnf

import (
	"fmt"
	"os"
	"path"
	"strings"

	"gopkg.in/yaml.v3"

	"github.com/xxjwxc/gormt/data/config"
	"github.com/xxjwxc/gormt/data/view/model"
	"github.com/xxjwxc/public/mylog"
	"github.com/xxjwxc/public/tools"
)

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

// GenOutPut 输出
func GenOutPut(info *model.DBInfo) {
	path := path.Join(config.GetOutDir(), info.DbName+".yml")
	out, _ := yaml.Marshal(info)

	flag := os.O_CREATE | os.O_WRONLY | os.O_TRUNC
	f, err := os.OpenFile(path, flag, 0666)
	if err != nil {
		mylog.Error(err)
		return
	}
	defer f.Close()
	f.Write(out)
}

// CnfModel yaml model from IModel
var CnfModel cnfModel

type cnfModel struct {
}

// GenModel get model.DBInfo info.获取数据库相关属性
func (m *cnfModel) GenModel() model.DBInfo {
	var dbInfo model.DBInfo
	// getPackageInfo(orm, &dbInfo)
	// 添加逻辑
	dbInfo.PackageName = m.GetPkgName()
	dbInfo.DbName = m.GetDbName()
	return dbInfo
}

// GetDbName get database name.获取数据库名字
func (m *cnfModel) GetDbName() string {
	dir := config.GetDbInfo().Host
	dir = strings.Replace(dir, "\\", "/", -1)
	if len(dir) > 0 {
		if dir[len(dir)-1] == '/' {
			dir = dir[:(len(dir) - 1)]
		}
	}
	var dbName string
	list := strings.Split(dir, "/")
	if len(list) > 0 {
		dbName = list[len(list)-1]
	}
	list = strings.Split(dbName, ".")
	if len(list) > 0 {
		dbName = list[0]
	}

	if len(dbName) == 0 || dbName == "." {
		panic(fmt.Sprintf("%v : db host config err.must file dir", dbName))
	}

	return dbName
}

// GetPkgName package names through config outdir configuration.通过config outdir 配置获取包名
func (m *cnfModel) GetPkgName() string {
	dir := config.GetOutDir()
	dir = strings.Replace(dir, "\\", "/", -1)
	if len(dir) > 0 {
		if dir[len(dir)-1] == '/' {
			dir = dir[:(len(dir) - 1)]
		}
	}
	var pkgName string
	list := strings.Split(dir, "/")
	if len(list) > 0 {
		pkgName = list[len(list)-1]
	}

	if len(pkgName) == 0 || pkgName == "." {
		list = strings.Split(tools.GetModelPath(), "/")
		if len(list) > 0 {
			pkgName = list[len(list)-1]
		}
	}

	return pkgName
}
