package tasks

import (
	"gitee.ltd/lxh/wechat-robot/internal/model"
	"gitee.ltd/lxh/wechat-robot/internal/types"
	messageHandler "gitee.ltd/lxh/wechat-robot/pkg/message"
	"gitee.ltd/lxh/xybot"
	"strings"
	"time"
)

// syncMessage
// @description: 同步指定机器人的消息
// @param containerHost 机器人接口地址
// @param robotWxId 机器人微信Id
// @param robotId 机器人数据Id
func syncMessage(client *xybot.Client, robotId uint) {
	// 获取数据库连接
	db := model.GetDB()

	// 获取新消息
	messages, err := client.Message.Sync()
	if err != nil {
		// 手动处理一下是否离线了
		isOffline := strings.Contains(err.Error(), "用户可能退出") || strings.Contains(err.Error(), "数据[DecryptData]失败")
		if isOffline {
			// 删除定时任务
			DeleteJob(robotId)
			// 修改机器人状态
			db.Model(&model.Robot{}).Where("id = ?", robotId).Update("status", "offline")
		}

		return
	}

	if len(messages) == 0 {
		// 没有消息，直接返回
		return
	}
	//log.Debugf("当前同步机器人Id: %d，消息数量: %d，客户端信息: %+v", robotId, len(messages), client)

	// 处理消息
	//var msg []model.Message
	for _, message := range messages {
		//log.Debugf("当前同步机器人Id: %d，消息内容: %s", robotId, message.Content.String)
		var m model.Message
		m.RobotId = robotId
		m.MsgId = message.NewMsgId
		m.ClientMsgId = message.MsgId
		m.CreateTime = message.CreateTime
		m.CreateAt = time.Unix(int64(message.CreateTime), 0)
		m.Type = types.MessageType(message.MsgType)
		m.Content = message.Content.String
		m.DisplayFullContent = message.PushContent
		m.FromUser = message.FromUserName.String
		m.ToUser = message.ToWxid.String

		// 如果是群聊消息，单独处理一下
		// Sys类型的消息正文不包含微信 Id，所以不需要处理
		if strings.HasSuffix(message.FromUserName.String, "@chatroom") && m.Type != types.MsgTypeSys {
			// 群消息，处理一下消息和发信人
			groupUser := strings.Split(m.Content, "\n")[0]
			groupUser = strings.ReplaceAll(groupUser, ":", "")
			// 如果两个id一致，说明是系统发的
			if m.FromUser != groupUser {
				m.GroupUser = groupUser
			}
			// 用户的操作单独提出来处理一下
			m.Content = strings.Join(strings.Split(m.Content, "\n")[1:], "\n")
		}

		//msg = append(msg, m)
		// 保存入库
		db.Save(&m)

		// 异步处理消息
		go messageHandler.Handler(&m, client)
	}

	// 保存入库
	//db.Save(&msg)
}
