package community

import (
	"errors"
	"fmt"
	"hongze/hongze_yb/models/request"
	"hongze/hongze_yb/models/response"
	"hongze/hongze_yb/models/tables/user_record"
	"hongze/hongze_yb/models/tables/yb_community_question"
	"hongze/hongze_yb/models/tables/yb_community_question_audio"
	"hongze/hongze_yb/services/company"
	"hongze/hongze_yb/services/user"
	"hongze/hongze_yb/services/wechat"
	"hongze/hongze_yb/utils"
	"time"
)

// GetQuestionList 获取问答列表
func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, replierUserId int, userInfo user.UserInfo) (resp *response.CommunityQuestionList, err error) {
	condition := make(map[string]interface{})
	condition["is_deleted ="] = 0
	// 用户身份
	isAdmin, _, e := user.GetAdminByUserInfo(userInfo)
	if e != nil {
		err = errors.New("获取用户身份失败 Err:" + e.Error())
		return
	}
	if replierUserId > 0 {
		condition["replier_user_id ="] = replierUserId
		// 回复列表
		if replyStatus > 0 {
			condition["reply_status ="] = replyStatus
		}
	} else {
		// 问题列表
		if onlyMine == 1 {
			if isAdmin {
				condition["replier_user_id ="] = userInfo.UserID
			} else {
				condition["user_id ="] = userInfo.UserID
			}
		} else {
			// 默认只展示已回复的
			condition["reply_status ="] = 3
		}
	}
	if chartPermissionId > 0 {
		condition["chart_permission_id ="] = chartPermissionId
	}
	// 问题列表
	questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
	if e != nil {
		err = errors.New("获取问题列表失败 Err:" + e.Error())
		return
	}
	listLen := len(questionList)
	if listLen == 0 {
		return
	}
	idArr := make([]int, 0)
	for i := 0; i < listLen; i++ {
		idArr = append(idArr, questionList[i].CommunityQuestionID)
	}
	// 音频列表
	audioList, e := yb_community_question_audio.GetListByQuestrionIds(idArr)
	if e != nil {
		err = errors.New("获取音频列表失败 Err:" + e.Error())
		return
	}
	// 用户权限
	authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
	if e != nil {
		err = errors.New("获取用户权限失败 Err:" + e.Error())
		return
	}

	userId := int(userInfo.UserID)
	resp = new(response.CommunityQuestionList)
	respList := make([]*response.CommunityQuestionItem, 0)
	for _, v := range questionList {
		audios := make([]*response.CommunityQuestionAudioItem, 0)
		for _, a := range audioList {
			if a.CommunityQuestionID == v.CommunityQuestionID {
				audios = append(audios, &response.CommunityQuestionAudioItem{
					CommunityQuestionID: a.CommunityQuestionID,
					AudioURL:            a.AudioURL,
					AudioPlaySeconds:    a.AudioPlaySeconds,
					AudioSize:           a.AudioSize,
					Sort:                a.Sort,
				})
			}
		}
		replierRank := fmt.Sprintf("弘则%s研究员", v.ResearchGroupFirstName)
		item := &response.CommunityQuestionItem{
			CommunityQuestionID: v.CommunityQuestionID,
			UserId:              v.UserID,
			QuestionContent:     v.QuestionContent,
			ReplierRealName:     v.ReplierRealName,
			ReplierRank:         replierRank,
			ReplierAvatar:       v.ReplierAvatar,
			ChartPermissionID:   v.CommunityQuestionID,
			ChartPermissionName: v.ChartPermissionName,
			IsRead:              v.IsRead,
			CreateTime:          v.CreateTime.Format(utils.FormatDateTime),
			ReplyTime:           v.ReplyTime.Format(utils.FormatDateTime),
			AuthOk:              authOk,
			PermissionInfo:      permissionInfo,
			AudioList:           audios,
		}
		if !isAdmin && item.IsRead == 0 && item.UserId == userId {
			item.IsTop = 1
		}
		respList = append(respList, item)
	}
	resp.QuestionList = respList
	//resp.PermissionInfo = permissionInfo
	return
}

// GetQuestionDetail 获取问答详情
func GetQuestionDetail(questionId int, userInfo user.UserInfo) (item *response.CommunityQuestionItem, err error) {
	detail, e := yb_community_question.GetItemById(questionId)
	if e != nil {
		err = errors.New("获取问题详情失败 Err:" + e.Error())
		return
	}
	audioList, e := yb_community_question_audio.GetListByQuestionId(questionId)
	if e != nil {
		err = errors.New("获取问题音频失败 Err:" + e.Error())
		return
	}
	audios := make([]*response.CommunityQuestionAudioItem, 0)
	for _, a := range audioList {
		audios = append(audios, &response.CommunityQuestionAudioItem{
			CommunityQuestionID: a.CommunityQuestionID,
			AudioURL:            a.AudioURL,
			AudioPlaySeconds:    a.AudioPlaySeconds,
			AudioSize:           a.AudioSize,
			Sort:                a.Sort,
		})
	}
	replierRank := fmt.Sprintf("弘则%s研究员", detail.ResearchGroupFirstName)
	// 用户权限
	authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
	if e != nil {
		err = errors.New("获取用户权限失败 Err:" + e.Error())
		return
	}
	item = &response.CommunityQuestionItem{
		CommunityQuestionID: detail.CommunityQuestionID,
		UserId:              detail.UserID,
		QuestionContent:     detail.QuestionContent,
		ReplierRealName:     detail.ReplierRealName,
		ReplierRank:         replierRank,
		ReplierAvatar:       detail.ReplierAvatar,
		ChartPermissionID:   detail.ChartPermissionID,
		ChartPermissionName: detail.ChartPermissionName,
		IsRead:              detail.IsRead,
		CreateTime:          detail.CreateTime.Format(utils.FormatDateTime),
		ReplyTime:           detail.ReplyTime.Format(utils.FormatDateTime),
		AuthOk:              authOk,
		PermissionInfo:      permissionInfo,
		AudioList:           audios,
	}
	return
}

// CreateQuestion 新增问答
func CreateQuestion(userId int, mobile, realName, content string) (err error) {
	// 获取用户公众号openid, 获取不到则置空
	userRecord, e := user_record.GetByUserId(userId, utils.USER_RECORD_PLATFORM_RDDP)
	if e != nil && e == utils.ErrNoRow {
		err = errors.New("获取用户公众号openid失败 Err:" + e.Error())
		return
	}
	openid := ""
	if userRecord != nil {
		openid = userRecord.OpenID
	}
	item := &yb_community_question.YbCommunityQuestion{
		UserID:          userId,
		UserOpenid:      openid,
		Mobile:          mobile,
		RealName:        realName,
		QuestionContent: content,
		ReplyStatus:     1,
	}
	if e := item.Create(); e != nil {
		err = errors.New("新增问题失败 Err:" + e.Error())
	}
	return
}

// ReplyUserQuestion 回复问题
func ReplyUserQuestion(replierId, questionId int, audios []*request.ReplyReqAudioList) (err error) {
	item, e := yb_community_question.GetItemById(questionId)
	if e != nil {
		err = errors.New("获取提问信息失败 Err:" + e.Error())
		return
	}
	if item.ReplyStatus < 2 {
		err = errors.New("回复状态有误")
		return
	}
	if item.ReplierUserID != replierId {
		err = errors.New(fmt.Sprintf("回复人与分配人不匹配, 回复人ID: %d, 分配人ID: %d", item.ReplierUserID, replierId))
		return
	}
	// 问题
	updateCols := make([]string, 0)
	updateCols = append(updateCols, "reply_status", "reply_time", "modify_time")
	nowTime := time.Now().Local()
	item.ReplyStatus = 3
	item.ReplyTime = nowTime
	item.ModifyTime = nowTime
	// 音频
	audioList := make([]*yb_community_question_audio.YbCommunityQuestionAudio, 0)
	for _, v := range audios {
		audioList = append(audioList, &yb_community_question_audio.YbCommunityQuestionAudio{
			CommunityQuestionID: questionId,
			AudioURL:            v.AudioUrl,
			AudioPlaySeconds:    v.AudioPlaySeconds,
			AudioSize:           v.AudioSize,
			Sort:                v.Sort,
			CreateTime:          nowTime,
		})
	}
	if e := yb_community_question.UpdateQuestionAndAudioList(item, updateCols, audioList); e != nil {
		err = errors.New("UpdateQuestionAndAudioList Err:" + e.Error())
		return
	}
	// 推送回复消息给用户
	go wechat.SendQuestionReplyWxMsg(item.CommunityQuestionID, item.UserID, item.UserOpenid, item.QuestionContent)
	return
}

// ReadQuestionReply 回复已读
func ReadQuestionReply(userId int, questionId int) (err error) {
	item, e := yb_community_question.GetItemById(questionId)
	if e != nil {
		err = errors.New("获取提问信息失败 Err:" + e.Error())
		return
	}
	if item.IsRead == 1 {
		return
	}
	if item.UserID == userId {
		updateCols := make([]string, 0)
		updateCols = append(updateCols, "is_read", "modify_time")
		item.IsRead = 1
		item.ModifyTime = time.Now().Local()
		if e = item.Update(updateCols); e != nil {
			err = errors.New("更新问题已读失败 Err:" + e.Error())
		}
	}
	return
}

// GetReplyListTotal 获取问答列表数量统计
func GetReplyListTotal(replierUserId int) (resp *response.CommunityReplyTotal, err error) {
	countList, e := yb_community_question.GetReplierQuestionCount(replierUserId)
	if e != nil {
		err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
		return
	}
	resp = new(response.CommunityReplyTotal)
	for _, v := range countList {
		if v.ReplyStatus == 2 {
			resp.Wait = v.Total
			continue
		}
		if v.ReplyStatus == 3 {
			resp.Replied = v.Total
		}
	}
	resp.Total = resp.Wait + resp.Replied
	return
}