package command

import (
	"encoding/json"
	"errors"
	"fmt"
	"go-wechat/client"
	"go-wechat/entity"
	"go-wechat/model"
	"go-wechat/utils"
	"go-wechat/vo"
	"gorm.io/gorm"
	"log"
	"strings"
)

// leiGod
// @description: 雷神加速器相关接口
type leiGodI interface {
	binding(string, string, bool) string // 绑定雷神加速器账号
	info() string                        // 账户详情
	pause() string                       // 暂停加速
}

type leiGod struct {
	userId string // 用户Id
}

// newLeiGod
// @description: 创建一个雷神加速器实例
// @param userId
// @return leiGodI
func newLeiGod(userId string) leiGodI {
	return &leiGod{userId: userId}
}

// LeiGodCmd
// @description: 雷神加速器指令
// @param userId
// @param cmd
// @param args
// @return string
func LeiGodCmd(userId, cmd string, args ...string) {
	lg := newLeiGod(userId)

	var replyMsg string
	switch cmd {
	case "绑定", "b":
		var force bool
		if len(args) == 3 && args[2] == "-f" {
			force = true
		}
		replyMsg = lg.binding(args[0], args[1], force)
	case "详情", "i":
		replyMsg = lg.info()
	case "暂停", "p":
		replyMsg = lg.pause()
	default:
		replyMsg = "指令错误"
	}

	// 返回消息
	if strings.TrimSpace(replyMsg) != "" {
		utils.SendMessage(userId, "", replyMsg, 0)
	}
}

// binding
// @description: 绑定雷神加速器账号
// @receiver l
// @param account
// @param password
// @param force
// @return flag
func (l leiGod) binding(account, password string, force bool) (replyMsg string) {
	log.Printf("用户[%s]绑定雷神加速器账号[%s] -> %s", l.userId, account, password)

	// 取出已绑定的账号
	var data entity.PluginData
	client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data)

	var ac vo.LeiGodAccount
	if data.UserId != "" {
		if err := json.Unmarshal([]byte(data.Data), &ac); err != nil {
			log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
			return
		}
		log.Printf("用户[%s]已绑定账号[%s]", l.userId, ac.Account)
	}

	// 如果已经绑定账号,且不是强制绑定,则返回
	if ac.Account != "" && !force {
		replyMsg = "您已绑定账号[" + ac.Account + "],如需更换请使用 -f 参数: \n/雷神 绑定 账号 密码 -f"
		return
	}

	accountStr := fmt.Sprintf("{\"account\": \"%s\", \"password\":\"%s\"}", account, password)

	// 绑定账号
	var err error
	if data.UserId != "" {
		// 修改
		err = client.MySQL.Model(&data).
			Where("user_id = ?", l.userId).
			Where("plugin_code = 'leigod'").
			Update("data", accountStr).Error
	} else {
		// 新增
		data = entity.PluginData{
			UserId:     l.userId,
			PluginCode: "leigod",
			Data:       accountStr,
		}
		err = client.MySQL.Create(&data).Error
	}

	if err != nil {
		log.Printf("用户[%s]绑定雷神账号失败: %v", l.userId, err)
		replyMsg = "绑定失败: " + err.Error()
	} else {
		replyMsg = "绑定成功"
	}

	return
}

// info
// @description: 账户详情
// @receiver l
// @return replyMsg
func (l leiGod) info() (replyMsg string) {
	log.Printf("用户[%s]获取雷神账户详情", l.userId)

	// 取出已绑定的账号
	var data entity.PluginData
	err := client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data).Error
	if err != nil {
		log.Printf("用户[%s]获取雷神账户详情失败: %v", l.userId, err)
		if errors.Is(err, gorm.ErrRecordNotFound) {
			replyMsg = "您还未绑定账号,请先绑定后再使用,绑定指定:\n/雷神 绑定 你的账号 你的密码"
		} else {
			replyMsg = "系统错误: " + err.Error()
		}
		return
	}

	// 解析为结构体
	var ac vo.LeiGodAccount
	if err = json.Unmarshal([]byte(data.Data), &ac); err != nil {
		log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
		replyMsg = "系统炸了,请耐心等待修复"
		return
	}

	lgu := utils.LeiGodUtil(ac.Account, ac.Password)
	if err = lgu.Login(); err != nil {
		return "登录失败: " + err.Error()
	}
	var ui model.LeiGodUserInfoResp
	if ui, err = lgu.Info(); err != nil {
		return "获取详情失败: " + err.Error()
	}
	replyMsg = fmt.Sprintf("#账户 %s\n#剩余时长 %s\n#暂停状态 %s\n#最后暂停时间 %s",
		ui.Mobile, ui.ExpiryTime, ui.PauseStatus, ui.LastPauseTime)
	return
}

// pause
// @description: 暂停加速
// @receiver l
// @return flag
func (l leiGod) pause() (replyMsg string) {
	log.Printf("用户[%s]暂停加速", l.userId)

	// 取出已绑定的账号
	var data entity.PluginData
	err := client.MySQL.Where("user_id = ?", l.userId).Where("plugin_code = 'leigod'").First(&data).Error
	if err != nil {
		log.Printf("用户[%s]获取雷神账户详情失败: %v", l.userId, err)
		if errors.Is(err, gorm.ErrRecordNotFound) {
			replyMsg = "您还未绑定账号,请先绑定后再使用,绑定指定:\n/雷神 绑定 你的账号 你的密码"
		} else {
			replyMsg = "系统错误: " + err.Error()
		}
		return
	}

	// 解析为结构体
	var ac vo.LeiGodAccount
	if err = json.Unmarshal([]byte(data.Data), &ac); err != nil {
		log.Printf("用户[%s]已绑定雷神账号解析失败: %v", l.userId, err)
		replyMsg = "系统炸了,请耐心等待修复"
		return
	}

	lgu := utils.LeiGodUtil(ac.Account, ac.Password)
	if err = lgu.Login(); err != nil {
		return "登录失败: " + err.Error()
	}
	if err = lgu.Pause(); err != nil {
		return "暂停失败: " + err.Error()
	}

	return "暂停成功"
}