package Wx

import (
	"context"
	"github.com/zeromicro/go-zero/core/errorx"
	"wechat-api/ent"
	"wechat-api/ent/wx"
	"wechat-api/hook"
	"wechat-api/internal/utils/dberrorhandler"

	"github.com/suyuan32/simple-admin-common/msg/errormsg"
	"wechat-api/internal/svc"
	"wechat-api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type CreateWxLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewCreateWxLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateWxLogic {
	return &CreateWxLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *CreateWxLogic) CreateWx(req *types.WxInfo) (*types.BaseMsgResp, error) {
	organizationId := l.ctx.Value("organizationId").(uint64)
	server, err := l.svcCtx.DB.Server.Get(l.ctx, *req.ServerId)
	if err != nil {
		l.Error("获取服务器信息失败", err)
		return nil, err
	}

	hook := hook.NewHook(server.PrivateIP, server.AdminPort, *req.Port)

	portOccupied, err := hook.GetPortOccupiedInfo(*req.Port)
	if err != nil {
		l.Error("获取端口占用信息失败", err)
		return nil, err
	}

	if portOccupied.Occupied != "1" {
		l.Error("端口未使用,请重新扫码登陆", err)
		return nil, err
	}

	loginStatus, err := hook.IsLoginStatus()
	if err != nil {
		return nil, err
	}

	if loginStatus.Onlinestatus == "3" {
		selfInfo, err := hook.GetSelfLoginInfo()
		if err != nil {
			return nil, err
		}

		wxInfo, err := l.svcCtx.DB.Wx.Query().Where(wx.ServerIDEQ(server.ID)).Where(wx.PortEQ(*req.Port)).Limit(1).Only(l.ctx)
		if err != nil && !ent.IsNotFound(err) {
			l.Error("查询微信信息失败", err)
			return nil, err
		}

		var dbErr error
		if ent.IsNotFound(err) {
			if req.Callback != nil && *req.Callback != "" {
				_ = hook.ConfigureMsgRecive("1", *req.Callback)
			}
			_, dbErr = l.svcCtx.DB.Wx.Create().
				SetNotNilServerID(req.ServerId).
				SetNotNilPort(req.Port).
				SetNotNilProcessID(&selfInfo.ProcessID).
				SetNotNilCallback(req.Callback).
				SetNotNilWxid(&selfInfo.Wxid).
				SetNotNilAccount(&selfInfo.Account).
				SetNotNilNickname(&selfInfo.Nickname).
				SetNotNilTel(&selfInfo.Tel).
				SetNotNilHeadBig(&selfInfo.HeadBig).
				SetStatus(1).
				SetOrganizationID(organizationId).
				Save(l.ctx)
		} else {
			if req.Callback != nil && *req.Callback != "" {
				_ = hook.ConfigureMsgRecive("1", *req.Callback)
			}
			_, dbErr = l.svcCtx.DB.Wx.UpdateOneID(wxInfo.ID).
				SetNotNilProcessID(&selfInfo.ProcessID).
				SetNotNilCallback(req.Callback).
				SetNotNilWxid(&selfInfo.Wxid).
				SetNotNilAccount(&selfInfo.Account).
				SetNotNilNickname(&selfInfo.Nickname).
				SetNotNilTel(&selfInfo.Tel).
				SetNotNilHeadBig(&selfInfo.HeadBig).
				SetStatus(1).
				Save(l.ctx)
		}
		if dbErr != nil {
			return nil, dberrorhandler.DefaultEntError(l.Logger, dbErr, req)
		}
	} else {
		l.Error("微信未登录", "loginStatus", loginStatus)
		return nil, errorx.NewDefaultError("微信未登陆,当前登陆状态:" + loginStatus.Onlinestatus + "," + loginStatus.Msg)
	}

	return &types.BaseMsgResp{Msg: errormsg.Success}, nil
}