package cygx

import (
	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strconv"
	"strings"
	"time"
)

type CygxQuestionnaire struct {
	QuestionnaireId  int       `orm:"column(questionnaire_id);pk"`
	ActivityTypeId   int       `description:"活动类型id"`
	ActivityTypeName string    `description:"活动名称"`
	Content          string    `description:"内容"`
	EndTime          time.Time `description:"截止日期"`
	CreateTime       time.Time `description:"创建时间"`
	ModifyTime       time.Time `description:"更新时间"`
	PublishTime      time.Time `description:"发布时间"`
	AdminId          int       `description:"管理员ID"`
	MaxChooseTotal   int       `description:"最多可选几项"`
	OtherThemeTotal  int       `description:"其余主题投票数量"`
}

type CygxQuestionnaireTheme struct {
	QuestionnaireThemeId int       `orm:"column(questionnaire_theme_id);pk"`
	QuestionnaireId      int       `description:"问卷ID"`
	ActivityTheme        string    `description:"活动主题"`
	CreateTime           time.Time `description:"创建时间"`
	ModifyTime           time.Time `description:"更新时间"`
}

type AddCygxQuestionnaireReq struct {
	QuestionnaireId int    `description:"ID"`
	ActivityTypeId  int    `description:"活动类型id"`
	Content         string `description:"内容"`
	EndTime         string `description:"截止日期"`
	MaxChooseTotal  int    `description:"最多可选几项"`
	ListTheme       []*AddCygxQuestionnaireThemeReq
}

type AddCygxQuestionnaireThemeReq struct {
	QuestionnaireThemeId int    `description:"问卷主题ID"`
	ActivityTheme        string `description:"活动主题"`
	VoteTotal            int    `description:"票数"`
}

type CygxQuestionnaireResp struct {
	QuestionnaireId  int    `orm:"column(questionnaire_id);pk"`
	ActivityTypeId   int    `description:"活动类型id"`
	ActivityTypeName string `description:"活动类型名称"`
	Content          string `description:"内容"`
	EndTime          string `description:"截止日期"`
	CreateTime       string `description:"创建时间"`
	ModifyTime       string `description:"更新时间"`
	PublishTime      string `description:"发布时间"`
	AdminId          int    `description:"管理员ID"`
	MaxChooseTotal   int    `description:"最多可选几项"`
	State            string `description:"状态"`
	OtherThemeTotal  int    `description:"其余主题投票数量"`
	ListTheme        []*AddCygxQuestionnaireThemeReq
}

type GetCygxQuestionnaireResp struct {
	Paging *paging.PagingItem `description:"分页数据"`
	List   []*CygxQuestionnaireResp
}

// 添加
func AddCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (newId int64, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	newId, err = to.Insert(item)
	if err != nil {
		return
	}
	//添加主题与问卷ID的关联
	for _, v := range listTheme {
		itemTheme := new(CygxQuestionnaireTheme)
		itemTheme.QuestionnaireId = int(newId)
		itemTheme.ActivityTheme = v.ActivityTheme
		itemTheme.CreateTime = time.Now()
		itemTheme.ModifyTime = time.Now()
		_, err = to.Insert(itemTheme)
		if err != nil {
			return
		}
	}
	return
}

// 编辑
func EditCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	updateParams := make(map[string]interface{})
	updateParams["ActivityTypeId"] = item.ActivityTypeId
	updateParams["ActivityTypeName"] = item.ActivityTypeName
	updateParams["EndTime"] = item.EndTime
	updateParams["ModifyTime"] = time.Now()
	updateParams["MaxChooseTotal"] = item.MaxChooseTotal
	updateParams["Content"] = item.Content
	ptrStructOrTableName := "cygx_questionnaire"
	whereParam := map[string]interface{}{"questionnaire_id": item.QuestionnaireId}
	qs := to.QueryTable(ptrStructOrTableName)
	for expr, exprV := range whereParam {
		qs = qs.Filter(expr, exprV)
	}
	_, err = qs.Update(updateParams)
	if err != nil {
		return
	}

	//如果有减少的就进行删除
	var questionnaireThemeIds []string
	for _, v := range listTheme {
		questionnaireThemeIds = append(questionnaireThemeIds, strconv.Itoa(v.QuestionnaireThemeId))
	}
	sql := `	DELETE FROM cygx_questionnaire_theme WHERE questionnaire_id = ? AND  questionnaire_theme_id NOT IN  (` + strings.Join(questionnaireThemeIds, ",") + `)`
	_, err = to.Raw(sql, item.QuestionnaireId).Exec()
	if err != nil {
		return
	}

	//添加主题与问卷ID的关联
	for _, v := range listTheme {
		if v.QuestionnaireThemeId == 0 {
			itemTheme := new(CygxQuestionnaireTheme)
			itemTheme.QuestionnaireId = item.QuestionnaireId
			itemTheme.ActivityTheme = v.ActivityTheme
			itemTheme.CreateTime = time.Now()
			itemTheme.ModifyTime = time.Now()
			_, err = to.Insert(itemTheme)
			if err != nil {
				return
			}
		} else {
			updateParams := make(map[string]interface{})
			updateParams["ActivityTheme"] = v.ActivityTheme
			updateParams["ModifyTime"] = time.Now()
			ptrStructOrTableName := "cygx_questionnaire_theme"
			whereParam := map[string]interface{}{"questionnaire_theme_id": v.QuestionnaireThemeId}
			qs := to.QueryTable(ptrStructOrTableName)
			for expr, exprV := range whereParam {
				qs = qs.Filter(expr, exprV)
			}
			_, err = qs.Update(updateParams)
			if err != nil {
				return
			}
		}

	}
	return
}

// 获取数量
func GetCygxQuestionnaireCount(condition string, pars []interface{}) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_questionnaire as art WHERE 1= 1  `
	if condition != "" {
		sqlCount += condition
	}
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, pars).QueryRow(&count)
	return
}

// 列表
func GetCygxQuestionnaireList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxQuestionnaireResp, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_questionnaire as art WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` LIMIT ?,?  `
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

type GetCygxQuestionnaireDetailResp struct {
	Detail *CygxQuestionnaireResp
}

// 通过ID获取详情
func GetCygxQuestionnaireDetail(questionnaireId int) (item *CygxQuestionnaireResp, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_questionnaire  WHERE questionnaire_id=? `
	err = o.Raw(sql, questionnaireId).QueryRow(&item)
	return
}

// 列表
func GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId int) (items []*AddCygxQuestionnaireThemeReq, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_questionnaire_theme as art WHERE questionnaire_id = ? `
	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
	return
}