// Package jwt -----------------------------
// @file      : common.go
// @author    : JJXu
// @contact   : wavingbear@163.com
// @time      : 2025/6/12 18:07
// -------------------------------------------
package jwt

import (
	"context"
	"fmt"
	"fonchain-fiee/api/account"
	"fonchain-fiee/api/accountFiee"
	"fonchain-fiee/cmd/config"
	"fonchain-fiee/pkg/common/m"
	"fonchain-fiee/pkg/e"
	"fonchain-fiee/pkg/service"
	"fonchain-fiee/pkg/utils/secret"

	"github.com/gin-gonic/gin"
)

// ParseToChatUser 将token信息转换为聊天室用户信息
func ParseToChatUser(c *gin.Context) (chatUserInfo *accountFiee.ChatUserData, code e.ErrorCodeType) {
	domain := c.GetHeader("Domain")
	if domain == "" {
		domain = c.GetHeader("domain")
		if domain == "" {
			domain = config.AppConfig.System.Domain
		}
	}
	var err error
	token := c.GetHeader(e.Authorization)
	if token == "" {
		fmt.Println("token is empty")
		code = e.NotLogin
		return
	}

	ctx := context.Background()
	var originId int64 = 0
	var newChatUser *accountFiee.ChatUserData
	check := true
	switch domain {
	case config.AppConfig.System.Domain:
		var fieeJwtInfo *Claims
		fieeJwtInfo, err = ParseToken(token, m.JWTSecret)
		if err != nil {
			fmt.Printf("fiee token parse err:%v\n", err)
			check = false
		} else {
			originId = int64(fieeJwtInfo.ID)
			newChatUser = &accountFiee.ChatUserData{
				NickName: fieeJwtInfo.NickName,
				Account:  fieeJwtInfo.Account,
				Role:     1,
				Origin:   config.AppConfig.System.Domain,
				OriginId: int64(fieeJwtInfo.ID),
			}
			domain = config.AppConfig.System.Domain
			fmt.Printf("fiee token decrypt success, domain:%s , originId:%d", domain, originId)
		}
	case e.ErpDomain:
		token, err = secret.GetJwtFromStr(token)
		if err != nil {
			check = false
		} else {
			var fontreeJwtInfo *account.DecryptJwtResponse
			fontreeJwtInfo, err = service.AccountProvider.DecryptJwt(ctx, &account.DecryptJwtRequest{Token: token, Domain: e.ErpDomain})
			if err != nil || fontreeJwtInfo.IsOffline {
				check = false
			} else {
				check = true
				originId = int64(fontreeJwtInfo.ID)
				newChatUser = &accountFiee.ChatUserData{
					NickName: fontreeJwtInfo.NickName,
					Account:  fontreeJwtInfo.Account,
					Role:     2,
					Origin:   e.ErpDomain,
					OriginId: int64(fontreeJwtInfo.ID),
				}
				fmt.Println("fontree token decrypt success, domain:%s , originId:%d", domain, originId)
			}
		}
	}
	if !check {
		fmt.Println("fontree token decrypt err:", err)
		code = e.NotLogin
		return
	}
	var userQueryRes *accountFiee.GetChatUserListResp
	userQueryRes, err = service.AccountFieeProvider.GetChatUserList(c, &accountFiee.GetChatUserListRequest{
		Query:    &accountFiee.ChatUserData{Origin: domain, OriginId: originId},
		Page:     1,
		PageSize: 1,
	})
	if err != nil {
		fmt.Println("获取chat user 失败", err)
		code = e.ErrorNotExistUser
		return
	}
	if userQueryRes.Total == 0 {
		createRes, errs := service.AccountFieeProvider.CreateChatUser(c, newChatUser)
		if errs == nil {
			chatUserInfo = createRes.Data
		} else {
			fmt.Println("创建chat user 失败", errs)
			code = e.ErrorNotExistUser
		}
		return
	}
	chatUserInfo = userQueryRes.List[0]
	return
}