package excel

import (
	"eta/eta_api/utils"
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type ReferencedExcelConfig struct {
	ReferencedExcelConfigId int       `orm:"column(referenced_excel_config_id);pk;auto" ` // excel表格配置id
	UniqueCode              string    // 表格唯一编码
	ReferencedId            int       // 被引用的id,报告就是报告id,pptId
	FromScene               int       // 引用类型 1智能研报 2研报列表 3英文研报 4PPT 5英文ppt
	Uuid                    string    // 引用唯一标识
	WidthList               string    // 宽度数组
	HeightList              string    // 高度数组
	OpUserId                int       // 当前编辑操作的用户id
	OpUserName              string    // 当前编辑的用户名称(冗余字段,避免查表)
	CreateTime              time.Time // 创建时间
	Content                 string    // 内容
	ModifyTime              time.Time // 修改时间
}

type ExcelReferencesReq struct {
	UniqueCode   string `description:"表格唯一编码"`
	ReferencedId int    `description:"被引用的ID"`
	FromScene    int    `description:"引用类型 1智能研报 2研报列表 3英文研报 4PPT 5英文PPT"`
	Uuid         string `description:"引用唯一标识"`
	WidthList    string `description:"宽度数组"`
	HeightList   string `description:"高度数组"`
}

// add
func AddReferencedExcelConfig(items []*ReferencedExcelConfig) (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.InsertMulti(len(items), items)
	return
}

// getByCode
func GetReferencedExcelConfigByUniqueCode(uniqueCode string) (item ReferencedExcelConfig, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_excel_unique_code = ? `
	err = o.Raw(sql, uniqueCode).QueryRow(&item)
	return
}

// getByCode
func GetReferencedExcelConfig(referencedId, fromScene int, uniqueCode, uuid string) (item ReferencedExcelConfig, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_id = ? AND from_scene = ? AND unique_code = ? AND  uuid= ? `
	err = o.Raw(sql, referencedId, fromScene, uniqueCode, uuid).QueryRow(&item)
	return
}

// update
func UpdateReferencedExcelConfig(item *ReferencedExcelConfig) (err error) {
	o := orm.NewOrmUsingDB("data")
	_, err = o.Update(item, "WidthList", "HeightList", "OpUserId", "OpUserName", "ModifyTime")
	return
}

// delete
func DeleteReferencedExcelConfig(uniqueCode string) (err error) {
	o := orm.NewOrmUsingDB("data")
	sql := `DELETE FROM referenced_excel_config WHERE unique_code=? `
	_, err = o.Raw(sql, uniqueCode).Exec()
	return
}

// GetReferencedExcelConfigList
// @Description: 根据来源类型和来源id获取所有配置列表
// @author: Roc
// @datetime 2025-01-09 14:31:20
// @param referencedId int
// @param fromScene int
// @return items []ReferencedExcelConfig
// @return err error
func GetReferencedExcelConfigList(referencedId, fromScene int) (items []ReferencedExcelConfig, err error) {
	o := orm.NewOrmUsingDB("data")
	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_id = ? AND from_scene = ? `
	_, err = o.Raw(sql, referencedId, fromScene).QueryRows(&items)

	return
}

// CopyReferencedExcelConfigByReferencedIdAndFromScene
// @Description: 根据原引用Id和引用类型创建新的表格关系
// @author: Roc
// @datetime 2025-01-09 15:02:43
// @param oldReferencedId int
// @param oldFromScene int
// @param newReferencedId int
// @param newFromScene int
// @param sysUserId int
// @param sysUserName string
// @return err error
func CopyReferencedExcelConfigByReferencedIdAndFromScene(oldReferencedId, oldFromScene, newReferencedId, newFromScene, sysUserId int, sysUserName string) (addList []*ReferencedExcelConfig, err error) {
	o := orm.NewOrmUsingDB("data")
	var items []ReferencedExcelConfig
	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_id = ? AND from_scene = ? `
	_, err = o.Raw(sql, oldReferencedId, oldFromScene).QueryRows(&items)
	if err != nil {
		return
	}

	addList = make([]*ReferencedExcelConfig, 0)
	for _, v := range items {
		addList = append(addList, &ReferencedExcelConfig{
			ReferencedExcelConfigId: 0,
			UniqueCode:              v.UniqueCode,
			ReferencedId:            newReferencedId,
			FromScene:               newFromScene,
			Uuid:                    v.Uuid,
			WidthList:               v.WidthList,
			HeightList:              v.HeightList,
			OpUserId:                sysUserId,
			OpUserName:              sysUserName,
			CreateTime:              time.Now(),
			Content:                 v.Content,
			ModifyTime:              time.Now(),
		})
	}
	// 批量复制表格关系
	_, err = o.InsertMulti(utils.MultiAddNum, addList)

	return
}

// CopyReferencedExcelConfigByReferencedIdListAndFromScene
// @Description: 根据原引用Id列表和引用类型创建新的表格关系
// @author: Roc
// @datetime 2025-01-09 17:37:47
// @param oldReferencedIdList []int
// @param oldFromScene int
// @param newReferencedId int
// @param newFromScene int
// @param sysUserId int
// @param sysUserName string
// @return addList []*ReferencedExcelConfig
// @return err error
func CopyReferencedExcelConfigByReferencedIdListAndFromScene(oldReferencedIdList []int, oldFromScene, newReferencedId, newFromScene, sysUserId int, sysUserName string) (addList []*ReferencedExcelConfig, err error) {
	num := len(oldReferencedIdList)
	if num <= 0 {
		return
	}

	o := orm.NewOrmUsingDB("data")
	var items []ReferencedExcelConfig
	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_id in (` + utils.GetOrmInReplace(num) + `) AND from_scene = ? group by unique_code,uuid `
	_, err = o.Raw(sql, oldReferencedIdList, oldFromScene).QueryRows(&items)
	if err != nil {
		return
	}

	addList = make([]*ReferencedExcelConfig, 0)
	for _, v := range items {
		addList = append(addList, &ReferencedExcelConfig{
			ReferencedExcelConfigId: 0,
			UniqueCode:              v.UniqueCode,
			ReferencedId:            newReferencedId,
			FromScene:               newFromScene,
			Uuid:                    v.Uuid,
			WidthList:               v.WidthList,
			HeightList:              v.HeightList,
			OpUserId:                sysUserId,
			OpUserName:              sysUserName,
			CreateTime:              time.Now(),
			Content:                 v.Content,
			ModifyTime:              time.Now(),
		})
	}
	// 批量复制表格关系
	_, err = o.InsertMulti(utils.MultiAddNum, addList)

	return
}