// 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
	//	}
	//}
	fmt.Println("ParseToChatUser ----------- 1")
	var domain string
	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
	var fieeJwtInfo *Claims
	fieeJwtInfo, err = ParseToken(token, m.JWTSecret)
	if err != nil {
		fmt.Printf("fiee token parse err:%v\n", err)
		check = false
	} else {
		check = true
		domain = config.AppConfig.System.Domain
		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)
	}
	fmt.Println("ParseToChatUser ----------- 2")
	if !check { //erp用户校验
		fmt.Println("ParseToChatUser ----------- 2.1")
		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
				domain = e.ErpDomain
				originId = int64(fontreeJwtInfo.ID)
				newChatUser = &accountFiee.ChatUserData{
					NickName: fontreeJwtInfo.NickName,
					Account:  fontreeJwtInfo.Account,
					Role:     2,
					Origin:   e.ErpDomain,
					OriginId: int64(fontreeJwtInfo.ID),
				}
				fmt.Printf("fontree token decrypt success, domain:%s , originId:%d\n", domain, originId)
			}
		}
	}
	fmt.Println("ParseToChatUser ----------- 3")
	if !check {
		fmt.Println("ParseToChatUser ----------- 3.1")
		fmt.Println("fontree token decrypt err:", err)
		code = e.NotLogin
		return
	}
	fmt.Println("ParseToChatUser ----------- 4")
	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("ParseToChatUser ----------- 4.1")
		fmt.Println("获取chat user 失败", err)
		code = e.ErrorNotExistUser
		return
	}
	if userQueryRes.Total == 0 {
		fmt.Println("ParseToChatUser ----------- 4.2")
		createRes, errs := service.AccountFieeProvider.CreateChatUser(c, newChatUser)
		if errs == nil {
			chatUserInfo = createRes.Data
		} else {
			fmt.Println("创建chat user 失败", errs)
			code = e.ErrorNotExistUser
		}
		return
	} else {
		fmt.Println("ParseToChatUser ----------- 4.3")
		chatUserInfo = userQueryRes.List[0]
	}
	return
}