package models

import (
	"errors"
	"eta_gn/eta_api/global"
	"eta_gn/eta_api/models/report"
	"eta_gn/eta_api/utils"
)

// AddReportAndChapter
// @Description: 新增报告及章节
// @author: Roc
// @datetime 2024-06-06 17:08:34
// @param reportItem *Report
// @param allGrantUserList []*report.ReportGrant
// @param addReportChapterList []AddReportChapter
// @return reportId int64
// @return err error
func AddReportAndChapter(reportItem *Report, allGrantUserList []*report.ReportGrant, addReportChapterList []AddReportChapter) (reportId int64, err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	// 新增报告
	err = to.Create(reportItem).Error
	reportId = int64(reportItem.Id)
	if err != nil {
		return
	}
	reportItem.Id = int(reportId)

	// 新增报告授权
	if len(allGrantUserList) > 0 {
		for _, v := range allGrantUserList {
			v.ReportId = reportItem.Id
		}
		err = to.CreateInBatches(allGrantUserList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 新增报告章节
	if len(addReportChapterList) > 0 {
		for _, addReportChapter := range addReportChapterList {
			// 新增章节
			chapterItem := addReportChapter.ReportChapter
			chapterItem.ReportId = int(reportId)
			//cpId, tmpErr := to.Insert(chapterItem)
			tmpErr := to.Create(chapterItem).Error
			if tmpErr != nil {
				err = tmpErr
				return
			}
			cpId := chapterItem.ReportChapterId
			chapterItem.ReportChapterId = int(cpId)

			// 新增章节授权
			if len(addReportChapter.GrantList) > 0 {
				grantList := addReportChapter.GrantList
				for _, v := range grantList {
					v.ReportChapterId = chapterItem.ReportChapterId
				}
				//_, err = to.InsertMulti(500, grantList)
				err = to.CreateInBatches(grantList, utils.MultiAddNum).Error
				if err != nil {
					return
				}
			}

			// 新增报告章节关联的品种
			if len(addReportChapter.GrantPermissionList) > 0 {
				permissionList := addReportChapter.GrantPermissionList
				for _, v := range permissionList {
					v.ReportChapterId = chapterItem.ReportChapterId
				}
				//_, err = to.InsertMulti(500, permissionList)
				err = to.CreateInBatches(permissionList, utils.MultiAddNum).Error
				if err != nil {
					return
				}
			}

		}
	}

	return
}

// EditReportAndPermission
// @Description: 修改报告的基础信息、授权用户权限
// @author: Roc
// @datetime 2024-06-06 17:11:12
// @param reportInfo *Report
// @param updateCols []string
// @param addReportGrantList []*report.ReportGrant
// @param delReportGrantIdList []int
// @return err error
func EditReportAndPermission(reportInfo *Report, updateCols []string, addReportGrantList []*report.ReportGrant, delReportGrantIdList []int) (err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	// 变更报告章节信息
	if len(updateCols) > 0 {
		err = to.Select(updateCols).Updates(reportInfo).Error
		if err != nil {
			return
		}
	}

	// 新增报告授权用户
	if len(addReportGrantList) > 0 {
		err = to.CreateInBatches(addReportGrantList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 删除报告授权用户
	delNum := len(delReportGrantIdList)
	if delNum > 0 {
		sql := `DELETE FROM report_grant WHERE grant_id IN (` + utils.GetOrmInReplace(delNum) + `)`
		err = to.Exec(sql, delReportGrantIdList).Error
		if err != nil {
			return
		}
	}

	return
}

// AddChapterBaseInfoAndPermission
// @Description: 新增报告章节的基础信息、授权用户权限
// @author: Roc
// @datetime 2024-06-11 15:33:50
// @param reportChapterInfo *ReportChapter
// @param addReportChapterGrantList []*report.ReportChapterGrant
// @param addChapterPermissionMap []*report.ReportChapterPermissionMapping
// @return err error
func AddChapterBaseInfoAndPermission(reportChapterInfo *ReportChapter, addReportChapterGrantList []*report.ReportChapterGrant, addChapterPermissionMap []*report.ReportChapterPermissionMapping) (err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	err = to.Create(reportChapterInfo).Error
	if err != nil {
		return
	}
	lastId := reportChapterInfo.ReportChapterId
	reportChapterInfo.ReportChapterId = int(lastId)

	// 新增报告章节授权用户
	if len(addReportChapterGrantList) > 0 {
		for k, _ := range addReportChapterGrantList {
			addReportChapterGrantList[k].ReportChapterId = reportChapterInfo.ReportChapterId
		}
		err = to.CreateInBatches(addReportChapterGrantList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 新增报告章节关联的品种配置
	if len(addChapterPermissionMap) > 0 {
		for k, _ := range addChapterPermissionMap {
			addChapterPermissionMap[k].ReportChapterId = reportChapterInfo.ReportChapterId
		}

		err = to.CreateInBatches(addChapterPermissionMap, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	return
}

// EditChapterBaseInfoAndPermission
// @Description: 修改报告章节的基础信息、授权用户权限、品种权限
// @author: Roc
// @datetime 2024-06-05 11:45:04
// @param reportChapterInfo *ReportChapter
// @param updateCols []string
// @param addReportChapterGrantList []report.ReportChapterGrant
// @param addChapterPermissionMap []*report.ReportChapterPermissionMapping
// @param delReportChapterGrantIdList []int
// @param delChapterPermissionMappingIdList []int
// @return err error
func EditChapterBaseInfoAndPermission(reportInfo *Report, reportChapterInfo *ReportChapter, updateCols []string, addReportChapterGrantList []*report.ReportChapterGrant, addChapterPermissionMap []*report.ReportChapterPermissionMapping, delReportChapterGrantIdList, delChapterPermissionMappingIdList []int) (err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	// 变更报告的最后编辑人信息
	{
		err = to.Select("LastModifyAdminId", "LastModifyAdminName", "ModifyTime").Updates(reportInfo).Error
		if err != nil {
			return
		}
	}

	// 变更报告章节信息
	if len(updateCols) > 0 {
		err = to.Select(updateCols).Updates(reportChapterInfo).Error
		if err != nil {
			return
		}
	}

	// 新增报告章节授权用户
	if len(addReportChapterGrantList) > 0 {
		err = to.CreateInBatches(addReportChapterGrantList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 删除报告章节授权用户
	delNum := len(delReportChapterGrantIdList)
	if delNum > 0 {
		sql := `DELETE FROM report_chapter_grant WHERE grant_id IN (` + utils.GetOrmInReplace(delNum) + `)`
		err = to.Exec(sql, delReportChapterGrantIdList).Error
		if err != nil {
			return
		}
	}

	// 新增报告章节的品种配置
	if len(addChapterPermissionMap) > 0 {
		err = to.CreateInBatches(addChapterPermissionMap, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 删除报告章节的品种配置
	delNum = len(delChapterPermissionMappingIdList)
	if delNum > 0 {
		sql := `DELETE FROM report_chapter_permission_mapping WHERE report_chapter_permission_mapping_id IN (` + utils.GetOrmInReplace(delNum) + `)`
		err = to.Exec(sql, delChapterPermissionMappingIdList).Error
		if err != nil {
			return
		}
	}

	return
}

// DelChapterAndPermission
// @Description: 删除报告章节、授权用户权限、品种权限
// @author: Roc
// @datetime 2024-06-06 17:25:47
// @param reportInfo *Report
// @param updateReportCols []string
// @param reportChapterInfo *ReportChapter
// @return err error
func DelChapterAndPermission(reportInfo *Report, updateReportCols []string, reportChapterInfo *ReportChapter) (err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	// 变更报告信息
	if len(updateReportCols) > 0 {
		err = to.Select(updateReportCols).Updates(reportInfo).Error
		if err != nil {
			return
		}
	}

	// 删除报告对应章节
	{
		err = to.Delete(reportChapterInfo).Error
		if err != nil {
			return
		}
	}

	// 删除报告章节的授权用户权限
	{
		sql := `DELETE FROM report_chapter_grant WHERE report_chapter_id = ? `
		err = to.Exec(sql, reportChapterInfo.ReportChapterId).Error
		if err != nil {
			return
		}
	}

	// 删除报告章节的品种配置
	{
		sql := `DELETE FROM report_chapter_permission_mapping WHERE report_chapter_id = ? `
		err = to.Exec(sql, reportChapterInfo.ReportChapterId).Error
		if err != nil {
			return
		}
	}

	return
}

// GetReportListCountByAuthorized
// @Description: 获取有权限的报告列表的报告数量
// @author: Roc
// @datetime 2024-05-30 15:14:01
// @param condition string
// @param pars []interface{}
// @return count int
// @return err error
func GetReportListCountByAuthorized(condition string, pars []interface{}) (count int, err error) {
	sql := `SELECT COUNT(1) AS count  FROM report as a 
 WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&count).Error
	return
}

// GetReportListByAuthorized
// @Description: 获取有权限的报告列表的数据
// @author: Roc
// @datetime 2024-05-30 15:15:07
// @param condition string
// @param pars []interface{}
// @param startSize int
// @param pageSize int
// @return items []*ReportList
// @return err error
func GetReportListByAuthorized(condition string, pars []interface{}, startSize, pageSize int) (items []*ReportList, err error) {
	sql := `SELECT id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time,state FROM report as a WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	// 排序:1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过
	sql += ` GROUP BY id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time,state
            ORDER BY  report_create_time DESC LIMIT ?,?`
	pars = append(pars, startSize)
	pars = append(pars, pageSize)
	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
	return
}

// ModifyReportClassifyAndReportChapterTypeByCondition
// @Description:
// @author: Roc
// @datetime 2024-06-17 16:12:44
// @param condition string
// @param pars []interface{}
// @param updateStr string
// @param chapterTypeIdMap map[int]int 当前的章节类型ID ---> 继承的章节类型ID
// @param oldClassifyId int
// @param currClassifyId int
// @param currClassifyName string
// @return err error
func ModifyReportClassifyAndReportChapterTypeByCondition(condition string, pars []interface{}, updateStr string, chapterTypeIdMap map[int]int, oldClassifyId, currClassifyId int, currClassifyName string) (err error) {
	to := global.DmSQL["rddp"].Begin()
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	if condition == `` {
		err = errors.New("condition不能为空")
		return
	}
	// 修改报告的所属分类
	sql := `UPDATE report as a SET ` + updateStr + ` WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	err = to.Exec(sql, pars...).Error
	if err != nil {
		return
	}

	// 修改历史报告中的章节分类归属
	sql = `UPDATE report_chapter set classify_id_first=?,classify_name_first=? where classify_id_first = ?`
	err = to.Exec(sql, currClassifyId, currClassifyName, oldClassifyId).Error
	if err != nil {
		return
	}

	for currTypeId, oldTypeId := range chapterTypeIdMap {
		// 没有章节类型的不处理
		if oldTypeId == 0 {
			continue
		}
		tmpSql := `UPDATE report_chapter set type_id=? where type_id = ?`
		err = to.Exec(tmpSql, currTypeId, oldTypeId).Error
		if err != nil {
			return
		}
	}

	return
}

// EditLayoutImgReq
// @Description: 版图设置请求
type EditLayoutImgReq struct {
	ReportId       int64  `description:"报告id"`
	HeadImg        string `description:"报告头图地址"`
	EndImg         string `description:"报告尾图地址"`
	CanvasColor    string `description:"画布颜色"`
	HeadResourceId int    `description:"版头资源ID"`
	EndResourceId  int    `description:"版尾资源ID"`
}

// MoveReportClassify 转移报告分类
func MoveReportClassify(firstId, secondId, thirdId int, firstName, secondName, thirdName string, originFirst, originSecond int) (err error) {
	sql := `UPDATE report SET classify_id_first = ?, classify_id_second = ?, classify_id_third = ?, classify_name_first = ?, classify_name_second = ?, classify_name_third = ? WHERE classify_id_first = ? AND classify_id_second = ?`
	err = global.DmSQL["rddp"].Exec(sql, firstId, secondId, thirdId, firstName, secondName, thirdName, originFirst, originSecond).Error
	return
}