// Package service -----------------------------
// @file      : chat.go
// @author    : JJXu
// @contact   : wavingbear@163.com
// @time      : 2025/6/13 19:04
// -------------------------------------------
package logic

import (
	"context"
	"errors"
	"fmt"
	"fonchain-fiee/api/accountFiee"
	"fonchain-fiee/pkg/common/ws"
	"fonchain-fiee/pkg/service"
	"fonchain-fiee/pkg/service/asChat/chatCache"
	"fonchain-fiee/pkg/service/asChat/consts"
	"fonchain-fiee/pkg/service/asChat/dto"
	"go.uber.org/zap"
	"log"
	"sync"
)

var cacheMap = make(map[int64]dto.NewMessageRequest)
var newMessageLocker sync.Mutex

func NewMessage(ctx context.Context, cache *chatCache.ChatCache, sender *accountFiee.ChatUserData, request dto.NewMessageRequest) (err error) {
	newMessageLocker.Lock()
	defer newMessageLocker.Unlock()
	if request.SessionId == "" {
		return errors.New("sessionId不能为空")
	}
	if request.MsgType == 0 {
		return errors.New("msgType不能为空")
	}
	//短时间重复消息不发送
	if request.AtUserId != 0 && request.Robot {
		if msgRecord, ok := cacheMap[request.AtUserId]; ok {
			if msgRecord.SessionId == "" {
				cacheMap[request.AtUserId] = request
			} else {
				fmt.Println(request.LocalStamp - msgRecord.LocalStamp)
				if msgRecord.Message.Text == request.Message.Text && request.LocalStamp-msgRecord.LocalStamp < 10 {
					cacheMap[request.AtUserId] = request
					return nil
				} else {
					cacheMap[request.AtUserId] = request
				}
			}
		} else {
			cacheMap[request.AtUserId] = request
		}
	}

	//存储入库
	if sender.NickName == "" {
		sender.NickName = fmt.Sprintf("未知用户(%d)", sender.ID)
	}
	fmt.Println("NewMessage 3333333333333333333333333333333333")
	var data = accountFiee.ChatRecordData{
		SessionId:  request.SessionId,
		UserId:     sender.ID,
		Name:       sender.NickName,
		Avatar:     sender.Avatar,
		MsgType:    request.MsgType,
		Content:    request.Message.Text,
		LocalStamp: request.LocalStamp,
		Medias:     nil,
		Role:       sender.Role,
	}
	if len(request.Message.Media) > 0 {
		for _, media := range request.Message.Media {
			data.Medias = append(data.Medias, &accountFiee.ChatMediaData{
				ID: media.MediaId,
			})
		}
	}
	fmt.Println("NewMessage 4444444444444444444444444444444444")
	resp, err := service.AccountFieeProvider.CreateChatRecord(ctx, &data)
	if err != nil {
		return errors.New("消息发送失败")
	}
	fmt.Printf("CreateChatRecord resp:%+v\n", resp)
	//录入缓存
	err = cache.AddChatRecord(request.SessionId, resp.Data)
	if err != nil {
		log.Printf("cache.AddChatRecord 失败:%v", err)
		return errors.New("消息发送失败")
	}
	fmt.Println("NewMessage 5 消息数量+1")
	if sender.Role != 3 {
		//新消息数量统计+1
		noticeUserId := consts.ChatRoom.GetUserIdInSession(request.SessionId, sender.ID)
		fmt.Println("NewMessage 5.1 消息数量配置结束")
		fmt.Printf("noticeUserId %+v\n", noticeUserId)
		for _, userId := range noticeUserId {
			fmt.Println("userId")
			_ = cache.IncreaseNewMessageTotal(userId, request.SessionId)
		}
	}
	fmt.Println("NewMessage 6")
	//发送websocket消息提醒通知
	var notice = dto.MessageListType{}
	notice.BuildMessage(resp.Data)
	fmt.Printf("ws消息提醒:%+v\n", notice)
	_, err = consts.ChatRoom.SendSessionMessage(sender, request.SessionId, ws.NewChatMsgType, notice)
	if err != nil {
		log.Print("发送新消息通知失败", zap.Error(err), zap.Any("notice", notice))
	}
	fmt.Println("NewMessage 7 -end")
	return nil
}