package data_approve

import (
	"eta_gn/eta_api/global"
	"eta_gn/eta_api/utils"
	"fmt"
	"time"
)

type DataApprove struct {
	DataApproveId int       `gorm:"column:data_approve_id;primary_key"`
	Title         string    `gorm:"column:title"`
	DataType      int       `gorm:"column:data_type"`
	State         int       `gorm:"column:state"` //  '审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回'
	FlowId        int       `gorm:"column:flow_id"`
	FlowVersion   int       `gorm:"column:flow_version"`
	StartNodeId   int       `gorm:"column:start_node_id"`
	CurrNodeId    int       `gorm:"column:curr_node_id"`
	ApplyUserId   int       `gorm:"column:apply_user_id"`
	ApplyUserName string    `gorm:"column:apply_user_name"`
	ApproveRemark string    `gorm:"column:approve_remark"`
	ApproveTime   time.Time `gorm:"column:approve_time"`
	CreateTime    time.Time `gorm:"column:create_time"`
	ModifyTime    time.Time `gorm:"column:update_time"`
}

var DataApproveCols = struct {
	DataApproveId string
	Title         string
	DataType      string // 资产类型:1:指标、2:图表
	State         string //  '审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回'
	FlowId        string
	FlowVersion   string
	StartNodeId   string
	CurrNodeId    string
	ApplyUserId   string
	ApplyUserName string
	ApproveRemark string
	ApproveTime   string
	CreateTime    string
	ModifyTime    string
}{
	DataApproveId: "data_approve_id",
	Title:         "title",
	DataType:      "data_type",
	State:         "state",
	FlowId:        "flow_id",
	FlowVersion:   "flow_version",
	StartNodeId:   "start_node_id",
	CurrNodeId:    "curr_node_id",
	ApplyUserId:   "apply_user_id",
	ApplyUserName: "apply_user_name",
	ApproveRemark: "approve_remark",
	ApproveTime:   "approve_time",
	CreateTime:    "create_time",
	ModifyTime:    "modify_time",
}

type DataApproveItemOrm struct {
	DataApproveId       int       `description:"审批ID"`
	DataApproveRecordId int       `description:"审批记录ID"`
	Title               string    `description:"审批标题"`
	DataType            int       `description:"资产类型"`
	State               int       `description:"审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回"`
	RecordState         int       `description:"审批记录状态:1-待审批;2-已通过;3-已驳回"`
	FlowId              int       `description:"审批流ID"`
	FlowVersion         int       `description:"审批流版本"`
	StartNodeId         int       `description:"开始节点ID"`
	CurrNodeId          int       `description:"当前节点ID"`
	ApplyUserId         int       `description:"申请人ID"`
	ApplyUserName       string    `description:"申请人姓名"`
	ApproveRemark       string    `description:"审批备注"`
	ApproveTime         time.Time `description:"审批时间"`
	HandleTime          time.Time `description:"处理时间"`
	CreateTime          time.Time `description:"创建时间"`
	ModifyTime          time.Time `description:"修改时间"`
	NodeState           int       `description:"当前节点审批状态:1-待审批;2-已审批;3-已驳回;4-已撤回" json:"-"`
	NodeApproveTime     time.Time `description:"当前节点审批时间" json:"-"`
}

func (b *DataApprove) TableName() string {
	return "data_approve"
}

func (b *DataApprove) Update(cols []string) (err error) {
	db := global.DmSQL["data"]
	err = db.Model(b).Select(cols).Updates(b).Error
	return
}

func (b *DataApprove) Create() (err error) {
	db := global.DmSQL["data"]
	err = db.Create(b).Error
	return
}

// AddDataApprove
// @Description: 添加审批单
// @author: Roc
// @datetime 2024-12-06 09:46:04
// @param dataApprove *DataApprove
// @param relationList []*DataApproveRelation
// @return err error
func AddDataApprove(dataApprove *DataApprove, relationList []*DataApproveRelation) (err error) {
	db := global.DmSQL["data"].Begin()
	defer func() {
		if err != nil {
			db.Rollback()
		} else {
			db.Commit()
		}
	}()

	err = db.Create(dataApprove).Error
	if err != nil {
		return
	}

	relationIdList := make([]int, 0)
	// 关联指标
	if len(relationList) > 0 {
		for _, v := range relationList {
			v.DataApproveId = dataApprove.DataApproveId

			relationIdList = append(relationIdList, v.DataId)
		}
		err = db.CreateInBatches(relationList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 更新资产公开状态
	switch dataApprove.DataType {
	case utils.DataApproveTypeEdb:
		sql := `UPDATE edb_info set public_status = ?,modify_time=now()  WHERE edb_info_id in (?) `
		err = global.DmSQL["data"].Exec(sql, utils.DataPublicCommit, relationIdList).Error

	case utils.DataApproveTypeChart:
		sql := `UPDATE chart_info set public_status = ?,modify_time=now()  WHERE chart_info_id in (?) `
		err = global.DmSQL["data"].Exec(sql, utils.DataPublicCommit, relationIdList).Error

	}

	return
}

func GetDataApproveByFlowIdAndVersionId(dataFlowId int, flowVersion int) (item []*DataApprove, err error) {
	db := global.DmSQL["data"]
	err = db.Where("flow_id = ? AND flow_version = ?", dataFlowId, flowVersion).Find(&item).Error
	return
}

func GetDataApproveById(DataApproveId int) (item *DataApprove, err error) {
	db := global.DmSQL["data"]
	err = db.Where("data_approve_id = ?", DataApproveId).First(&item).Error
	return
}

// GetApprovingDataApproveCount 获取待处理的审批分页列表总数
func GetApprovingDataApproveCount(cond string, pars []interface{}) (count int, err error) {
	base := fmt.Sprintf(`SELECT a.data_approve_record_id
		FROM data_approve_record AS a
		JOIN data_approve AS b ON a.data_approve_id = b.data_approve_id AND a.node_id = b.curr_node_id
		WHERE 1 = 1 %s`, cond)
	sql := fmt.Sprintf(`SELECT COUNT(1) FROM (%s) t`, base)
	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
	return
}

// GetApprovingDataApprovePageList 获取待处理的审批列表-分页
func GetApprovingDataApprovePageList(cond string, pars []interface{}, orderRule string, startSize, pageSize int) (items []*DataApproveItemOrm, err error) {
	order := `ORDER BY a.create_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT a.data_approve_record_id, a.state AS record_state, b.*
		FROM data_approve_record AS a
		JOIN data_approve AS b ON a.data_approve_id = b.data_approve_id AND a.node_id = b.curr_node_id
		WHERE 1 = 1 %s %s
		LIMIT ?,?`, cond, order)
	pars = append(pars, startSize, pageSize)
	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
	return
}

// GetApprovedDataApproveCount 获取已处理的审批分页列表总数
func GetApprovedDataApproveCount(cond string, pars []interface{}) (count int, err error) {
	base := fmt.Sprintf(`SELECT a.data_approve_record_id
		FROM data_approve_record AS a
		JOIN data_approve AS b ON a.data_approve_id = b.data_approve_id
		WHERE 1 = 1 %s`, cond)
	sql := fmt.Sprintf(`SELECT COUNT(1) FROM (%s) t`, base)
	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
	return
}

// GetApprovedDataApprovePageList 获取已处理的审批列表-分页
func GetApprovedDataApprovePageList(cond string, pars []interface{}, orderRule string, startSize, pageSize int) (items []*DataApproveItemOrm, err error) {
	order := `ORDER BY a.create_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT a.data_approve_record_id, a.node_state AS record_state,a.node_state,a.node_approve_time, a.node_approve_time AS handle_time, b.*
		FROM data_approve_record AS a
		JOIN data_approve AS b ON a.data_approve_id = b.data_approve_id
		WHERE 1 = 1 %s %s
		LIMIT ?,?`, cond, order)
	pars = append(pars, startSize, pageSize)
	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
	return
}

// GetApplyDataApproveCount 获取我发起的审批分页列表总数
func GetApplyDataApproveCount(cond string, pars []interface{}) (count int, err error) {
	base := fmt.Sprintf(`SELECT a.* FROM data_approve AS a WHERE 1 = 1 %s`, cond)
	sql := fmt.Sprintf(`SELECT COUNT(1) FROM (%s) t`, base)
	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
	return
}

// GetApplyDataApprovePageList 获取我发起的审批列表-分页
func GetApplyDataApprovePageList(cond string, pars []interface{}, orderRule string, startSize, pageSize int) (items []*DataApproveItemOrm, err error) {
	order := `ORDER BY a.create_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT a.*,a.approve_time as handle_time,a.state as record_state FROM data_approve AS a WHERE 1 = 1 %s %s LIMIT ?,?`, cond, order)
	pars = append(pars, startSize, pageSize)
	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
	return
}

func GetDataApproveCountByState(state int) (count int, err error) {
	db := global.DmSQL["data"]
	sql := `SELECT COUNT(*) FROM data_approve WHERE state = ?`
	err = db.Raw(sql, state).Scan(&count).Error
	return
}

// GetListByDataApproveId
// @Description: 根据审批id获取关联的资产(指标、图表)
// @author: Roc
// @datetime 2024-12-05 17:23:39
// @param dataApproveId int
// @return dataIdList []int
// @return err error
func (b *DataApprove) GetByDataApproveId(dataApproveId int) (dataIdList []*DataApproveRelation, err error) {
	sql := `SELECT * FROM data_approve_relation AS a WHERE data_approve_id = ? `
	err = global.DmSQL["data"].Raw(sql, dataApproveId).Scan(&dataIdList).Error
	return
}