package models

import (
	"errors"
	"eta/eta_mobile/models/report"
	"eta/eta_mobile/utils"
	"github.com/beego/beego/v2/client/orm"
)

// 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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

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

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

	// 新增报告章节
	if len(addReportChapterList) > 0 {
		for _, addReportChapter := range addReportChapterList {
			// 新增章节
			chapterItem := addReportChapter.ReportChapter
			chapterItem.ReportId = int(reportId)
			cpId, tmpErr := to.Insert(chapterItem)
			if tmpErr != nil {
				err = tmpErr
				return
			}
			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)
				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)
				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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

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

	// 新增报告授权用户
	if len(addReportGrantList) > 0 {
		_, err = to.InsertMulti(500, addReportGrantList)
		if err != nil {
			return
		}
	}

	// 删除报告授权用户
	delNum := len(delReportGrantIdList)
	if delNum > 0 {
		sql := `DELETE FROM report_grant WHERE grant_id IN (` + utils.GetOrmInReplace(delNum) + `)`
		_, err = to.Raw(sql, delReportGrantIdList).Exec()
		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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

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

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

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

		_, err = to.InsertMulti(500, addChapterPermissionMap)
		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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

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

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

	// 新增报告章节授权用户
	if len(addReportChapterGrantList) > 0 {
		_, err = to.InsertMulti(500, addReportChapterGrantList)
		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.Raw(sql, delReportChapterGrantIdList).Exec()
		if err != nil {
			return
		}
	}

	// 新增报告章节的品种配置
	if len(addChapterPermissionMap) > 0 {
		_, err = to.InsertMulti(500, addChapterPermissionMap)
		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.Raw(sql, delChapterPermissionMappingIdList).Exec()
		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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

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

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

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

	// 删除报告章节的品种配置
	{
		sql := `DELETE FROM report_chapter_permission_mapping WHERE report_chapter_id = ? `
		_, err = to.Raw(sql, reportChapterInfo.ReportChapterId).Exec()
		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) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT COUNT(1) AS count  FROM report as a 
 WHERE 1=1  `
	if condition != "" {
		sql += condition
	}

	err = o.Raw(sql, pars).QueryRow(&count)
	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) {
	o := orm.NewOrmUsingDB("rddp")

	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,modify_time,content_modify_time,report_create_time,state,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time FROM report as a WHERE 1=1  `
	if condition != "" {
		sql += condition
	}
	// 排序：1:未发布；2:已发布；3-待提交；4-待审批；5-已驳回；6-已通过
	sql += ` GROUP BY a.id ORDER BY  report_create_time DESC LIMIT ?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	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) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	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.Raw(sql, pars).Exec()
	if err != nil {
		return
	}

	// 修改历史报告中的章节分类归属
	sql = `UPDATE report_chapter set classify_id_first=?,classify_name_first=? where classify_id_first = ?`
	_, err = to.Raw(sql, currClassifyId, currClassifyName, oldClassifyId).Exec()
	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.Raw(tmpSql, currTypeId, oldTypeId).Exec()
		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"`
}
