package VerifyTemplate

import (
	"ColdVerify_server/lib"
	"ColdVerify_server/logs"
	"errors"
	"fmt"
	_ "github.com/astaxie/beego/cache/redis"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"strconv"
	"strings"
)

// 模版
type VerifyTemplateClass struct {
	Id     int    `orm:"column(ID);size(11);auto;pk"`
	T_fid  int    `orm:"size(200);null"` // 父级分类ID，主类 为 0
	T_name string `orm:"size(256);null"` // 标题
	T_path string `orm:"size(256);null"` // 路径

	T_State int `orm:"size(2);default(1)"` // 0 删除（伪删除）   1 正常

	Children []VerifyTemplateClass `orm:"-"`
}

func (t *VerifyTemplateClass) TableName() string {
	return "verify_template_class" // 数据库名称   // ************** 替换 FormulaList **************
}

func init() {
	//注册模型
	orm.RegisterModel(new(VerifyTemplateClass))
}

type VerifyTemplateClass_R struct {
	Id       int
	T_fid    int                   // 项目 id， VerifyTemplateClass.ID
	T_name   string                // 名称
	T_State  int                   // 0 删除（伪删除）   1 正常（已交付）     2 开发中
	Children []VerifyTemplateClass `orm:"-"`
}

// 获取 ById
func Read_VerifyTemplateClass_ById(id int) (r VerifyTemplateClass, err error) {
	o := orm.NewOrm()
	r = VerifyTemplateClass{Id: id, T_State: 1}
	err = o.Read(&r, "Id", "T_State")
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return r, err
	}
	return r, err
}

// 添加
func Add_VerifyTemplateClass(var_ VerifyTemplateClass) (id int64, err error) {
	o := orm.NewOrm()
	o.Begin()
	id, err = o.Insert(&var_)
	if err != nil {
		o.Rollback()
		return id, err
	}

	T_Path := "/0/" + strconv.Itoa(int(id)) + "/"
	if var_.T_fid != 0 {
		class_r, err := Read_VerifyTemplateClass_ById(var_.T_fid)
		if err != nil {
			o.Rollback()
			return id, err
		}
		T_Path = class_r.T_path + strconv.Itoa(int(id)) + "/"
	}

	var_.Id = int(id)
	var_.T_path = T_Path
	_, err = o.Update(&var_, "T_path")
	if err != nil {
		o.Rollback()
		return id, err
	}
	o.Commit()

	return id, err
}

// 修改
func Update_VerifyTemplateClass(r VerifyTemplateClass, cols ...string) bool {
	o := orm.NewOrm()
	if num, err := o.Update(&r, cols...); err == nil {
		logs.Println("Number of records updated in database:", num)
		return true
	}
	return false
}

// 批量删除
func Delete_VerifyTemplateClass_ByIds(ids []int) bool {
	o := orm.NewOrm()
	o.Begin()
	for _, id := range ids {
		v := VerifyTemplateClass{Id: id, T_State: 0}
		if _, err := o.Update(&v, "T_State"); err != nil {
			o.Rollback()
			return false
		}
	}

	o.Commit()
	return true
}

// 获取列表
func Read_VerifyTemplateClass_List() (r []VerifyTemplateClass) {

	o := orm.NewOrm()
	// 也可以直接使用 Model 结构体作为表名
	var map_r []VerifyTemplateClass
	qs := o.QueryTable(new(VerifyTemplateClass))

	cond := orm.NewCondition()

	cond1 := cond.And("T_State", 1)

	qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&map_r)

	r = VerifyTemplateClass_Call(map_r, 0)

	return r

}

func VerifyTemplateClass_Call(list []VerifyTemplateClass, parentId int) []VerifyTemplateClass {
	res := make([]VerifyTemplateClass, 0)
	for _, v := range list {
		if v.T_fid == parentId {
			v.Children = VerifyTemplateClass_Call(list, v.Id)
			res = append(res, v)
		}
	}
	return res
}

// 通过T_pid查询所有子id
func ReadVerifyTemplateClassIds_T_path(T_path string) (VerifyTemplateClassIds []int) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(VerifyTemplateClass))
	var VerifyTemplateClassList []VerifyTemplateClass
	qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).All(&VerifyTemplateClassList)
	for _, v := range VerifyTemplateClassList {
		VerifyTemplateClassIds = append(VerifyTemplateClassIds, v.Id)
	}
	return VerifyTemplateClassIds
}

// 通过T_path查询所有子验证分类
func ReadVerifyTemplateClassList_T_path(T_path string, parentId int) (r []VerifyTemplateClass) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(VerifyTemplateClass))
	var VerifyTemplateClassList []VerifyTemplateClass
	qs.Filter("T_path__startswith", T_path).Filter("T_State", 1).All(&VerifyTemplateClassList)
	r = VerifyTemplateClass_Call(VerifyTemplateClassList, parentId)
	return r
}

// 递归复制节点
func copyVerifyTemplateClass(o orm.Ormer, r *VerifyTemplateClass, newParentId int, parentPath string) (*VerifyTemplateClass, error) {

	// 创建新节点
	verifyTemplateClass := VerifyTemplateClass{
		T_fid:   newParentId,
		T_name:  r.T_name, // 添加副本标识
		T_State: 1,
		// T_path 将在插入后更新
	}

	// 插入数据库
	newVerifyTemplateClassId, err := o.Insert(&verifyTemplateClass)
	if err != nil {
		return nil, err
	}

	newPath := parentPath + strconv.Itoa(verifyTemplateClass.Id) + "/"

	// 更新路径
	verifyTemplateClass.Id = int(newVerifyTemplateClassId)
	verifyTemplateClass.T_path = newPath
	_, err = o.Update(&verifyTemplateClass, "T_path")
	if err != nil {
		return nil, err
	}

	// 复制子节点
	for _, child := range r.Children {
		_, err = copyVerifyTemplateClass(o, &child, verifyTemplateClass.Id, newPath)
		if err != nil {
			return nil, err
		}
	}
	// 分类1
	//  ----模版
	//	--------标签
	// 分类2
	//   -- 子分类
	// 2 复制分类下的模版
	// 3 复制模版下的标签
	VerifyTemplateList, _ := Read_VerifyTemplate_List(r.Id, "", 0, 9999)
	for _, v := range VerifyTemplateList {
		verifyTemplate, is := Read_VerifyTemplate(v.T_VerifyTemplate_id)
		if !is {
			return nil, errors.New("查询验证模版失败")
		}

		newVerifyTemplate := VerifyTemplate{
			T_class: verifyTemplateClass.Id, // 新的分类id
			T_name:  verifyTemplate.T_name,
			T_sort:  verifyTemplate.T_sort,
		}

		newVerifyTemplateId, is := Add_VerifyTemplate(newVerifyTemplate)
		if !is {
			return nil, errors.New("复制验证模版失败")
		}

		// 复制模版下面的标签
		mapList, _ := Read_VerifyTemplateMap_List(v.T_VerifyTemplate_id, 0, 0)
		tempMap := make(map[string]struct{})
		idList := make([]string, len(mapList))
		// 生成mapList长度的T_id
		for i := 0; i < len(mapList); i++ {
			// 生成编号
			rand_x := 0
			T_id := ""
			for true {
				T_id = lib.GetRandstring(4, "", int64(rand_x))
				_, is = Read_VerifyTemplateMap(T_id)
				if !is {
					if _, ok := tempMap[T_id]; !ok {
						break
					}
				}
				rand_x += 1
			}
			tempMap[T_id] = struct{}{}
			idList[i] = T_id
		}
		mapInsertList := make([]VerifyTemplateMap, 0)
		for i, m := range mapList {
			vtm := VerifyTemplateMap{
				T_id:                idList[i],
				T_VerifyTemplate_id: newVerifyTemplateId,
				T_name:              m.T_name,
				T_text:              m.T_text,
				T_label:             m.T_label,
				T_sort:              m.T_sort,
			}

			mapInsertList = append(mapInsertList, vtm)
		}

		_, is = Add_VerifyTemplateMapMulti(mapInsertList)
		if !is {
			return nil, errors.New("复制验证模版标签失败")
		}
	}

	return &verifyTemplateClass, nil
}

func CopyVerifyTemplateClassTree(T_path string, parentId int, T_name string) (newRoot *VerifyTemplateClass, err error) {
	// 获取原始节点及其子树
	o := orm.NewOrm()
	srcNode := ReadVerifyTemplateClassList_T_path(T_path, parentId)
	if len(srcNode) == 0 {
		return nil, errors.New("查询验证模版分类失败")
	}
	srcNode[0].T_name = T_name
	// 开启事务
	err = o.Begin()
	if err != nil {
		o.Rollback()
		return nil, fmt.Errorf("事务启动失败: %v", err)
	}

	s := strings.Split(strings.Trim(T_path, "/"), "/")
	parentPath := fmt.Sprintf("/%s/", strings.Join(s[:len(s)-1], "/"))
	// 递归复制
	newRoot, err = copyVerifyTemplateClass(o, &srcNode[0], parentId, parentPath) // 假设复制到根目录
	if err != nil {
		o.Rollback()
		return nil, err
	}

	// 提交事务
	if err = o.Commit(); err != nil {
		o.Rollback()
		return nil, fmt.Errorf("事务提交失败: %v", err)
	}

	return newRoot, nil
}
