package service

import (
	"context"
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"shop-api/global"
	"shop-api/model"
	"shop-api/model/request"
	"shop-api/model/response"
	"shop-api/utils"
	"strconv"
	"strings"
	"time"

	"shop-api/initialize/api"

	uuid "github.com/satori/go.uuid"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"golang.org/x/oauth2/instagram"
)

func UserLogin(u *request.UserLogin) (err error, userInter *model.User) {
	var user model.User
	switch u.Type {
	case "1":
		resp, err := global.SMS_CLIENT.VerifyCode(context.Background(), &api.SmsCodeVerifyRequest{
			Phone: u.Phone,
			Code:  u.Code,
		})
		if err != nil {
			return errors.New("验证码验证失败"), nil
		}
		if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {

		} else if resp.Code != 0 {
			return errors.New("验证码验证失败"), nil
		}
		err = global.MG_DB.Where("phone = ? and appid=? and type=?", u.Phone, u.Appid, "customer").Find(&user).Error
		if err != nil {
			return errors.New("获取用户失败"), nil
		}
	case "2":
		code := RedisGet("email_code:" + u.Email)
		if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {

		} else if code != u.Code {
			return errors.New("验证码验证失败"), nil
		}
		err = global.MG_DB.Where("email = ? and appid=? and type=?", u.Email, u.Appid, "customer").Find(&user).Error
		if err != nil {
			return errors.New("获取用户失败"), nil
		}
	}
	if user.UUID == uuid.Nil {
		//用户注册
		user.UUID = uuid.NewV4()
		user.NickName = "独立站用户"
		user.Email = u.Email
		user.Phone = u.Phone
		user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
		user.Appid = u.Appid
		user.Type = "customer"
		user.CountryCode = u.CountryCode
		user.Source = u.Source
		err = global.MG_DB.Model(&model.User{}).Create(&user).Error
		if err != nil {
			return errors.New("注册失败,请稍后再试"), nil
		}
		var wallet model.Wallet
		wallet.UserID = user.UUID.String()
		wallet.Platform = "influencer"
		global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
	}
	return err, &user
}

func UserRegister(u *request.UserRegister) (err error, userInter *model.User) {
	var user model.User
	global.MG_DB.Where("email = ? and appid=? and type=?", u.Email, u.Appid, "customer").Find(&user)
	code := RedisGet("msg_code:" + u.Email)
	if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {

	} else if code != u.Code {
		return errors.New("验证码验证失败"), nil
	}
	if user.UUID == uuid.Nil {
		//用户注册
		user.UUID = uuid.NewV4()
		user.NickName = u.Nickname
		user.Email = u.Email
		user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
		user.Appid = u.Appid
		user.Type = "customer"
		err = global.MG_DB.Model(&model.User{}).Create(&user).Error
		if err != nil {
			return errors.New("注册失败,请稍后再试"), nil
		}
		var wallet model.Wallet
		wallet.UserID = user.UUID.String()
		wallet.Platform = "customer"
		global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
	} else {
		return errors.New("用户已存在"), nil
	}
	return err, &user
}

func UserBandPhone(u *request.UserBandPhone, userID string) (err error) {
	code := RedisGet("msg_code:" + u.Phone)
	if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {

	} else if code != u.Code {
		return errors.New("验证码验证失败")
	}
	err = global.MG_DB.Model(&model.User{}).Where("uuid=?", userID).Update("phone", u.Phone).Error
	if err != nil {
		return errors.New("绑定失败")
	}
	return err
}

func UserPlatformAuth(u *request.UserPlatformAuth, userID string) (err error) {
	var (
		platformJson string
		uMap         = make(map[string]interface{})
	)
	for _, v := range u.Platform {
		if v.Url != "" {
			t := time.Now()
			v.CreatedAt = &t
		}
	}
	platformByte, err := json.Marshal(u.Platform)
	if err != nil {
		return errors.New("平台认证格式不正确")
	}
	platformJson = string(platformByte)
	uMap["platform"] = platformJson
	uMap["tags"] = u.Tags
	err = global.MG_DB.Model(&model.User{}).Where("uuid=?", userID).Updates(uMap).Error
	if err != nil {
		return errors.New("提交失败")
	}
	return nil
}

func GetProviderList(info *request.AppProvider) (providers []model.ProviderSimple, err error) {
	var (
		application model.Application
		provider    []model.Provider
	)
	err = global.MG_DB.Where("appid=?", info.Appid).Find(&application).Error
	if err != nil {
		return providers, errors.New("获取应用失败")
	}
	if application.ID == 0 {
		return providers, errors.New("应用不存在")
	}
	err = json.Unmarshal([]byte(application.Provider), &provider)
	if err != nil {
		return providers, errors.New("获取应用失败")
	}
	for _, v := range provider {
		providers = append(providers, model.ProviderSimple{
			Name: v.Code,
			Code: v.Code,
		})
	}
	return
}

func UserAuthorized(u *request.UserAuthorized) (Iuser model.User, err error) {
	var (
		aceessToken  string
		userID       string
		provider     model.Provider
		user         model.ProviderUser
		providerList model.ClentProvider
		application  model.Application
	)
	err = global.MG_DB.Where("appid=?", u.Appid).Find(&application).Error
	if err != nil {
		return Iuser, errors.New("获取应用失败")
	}
	if application.ID == 0 {
		return Iuser, errors.New("应用不存在")
	}
	err = json.Unmarshal([]byte(application.Provider), &providerList)
	if err != nil {
		return Iuser, errors.New("获取应用失败")
	}
	switch u.Client {
	case "android":
		for _, v := range providerList.Android {
			if v.Code == u.Platform {
				provider = v
			}
		}
	case "ios":
		for _, v := range providerList.Ios {
			if v.Code == u.Platform {
				provider = v
			}
		}
	default:
		for _, v := range providerList.Web {
			if v.Code == u.Platform {
				provider = v
			}
		}
	}
	if provider.Code == "" {
		return Iuser, errors.New("平台不存在")
	}
	if u.Uuid == "" {
		if u.Code != "" {
			//换取token
			err, aceessToken, userID = GetAccessToken(provider, u.Code)
			if err != nil {
				fmt.Println(err.Error())
				return Iuser, errors.New("获取token失败")
			}
		}
		if u.Token != "" {
			aceessToken = u.Token
		}
		//换取用户信息
		if provider.UserInfoURI != "" {
			err, user = GetUserInfo(provider, aceessToken, userID)
			if err != nil {
				return Iuser, errors.New("获取用户信息失败")
			}
			if user.Avatar == "" {
				user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
			}
		}
	}
	if user.UserID == "" {
		return Iuser, errors.New("授权登录失败")
	}
	//查询用户是否存在
	query := fmt.Sprintf("%s = ? AND appid = ? AND type = ?", provider.Code)
	global.MG_DB.Where(query, user.UserID, u.Appid, "influencer").Find(&Iuser)
	if Iuser.UUID == uuid.Nil {
		//注册
		Iuser.UUID = uuid.NewV4()
		Iuser.NickName = user.NickName
		Iuser.Avatar = user.Avatar
		Iuser.Appid = u.Appid
		Iuser.Type = "influencer"
		switch provider.Code {
		case "tiktok":
			Iuser.Tiktok = user.UserID
		case "facebook":
			Iuser.Facebook = user.UserID
		case "twitter":
			Iuser.Twitter = user.UserID
		case "google":
			Iuser.Google = user.UserID
		case "youtube":
			Iuser.Youtube = user.UserID
		case "instagram":
			Iuser.Instagram = user.UserID
		case "ios":
			Iuser.Ios = user.UserID
			Iuser.NickName = "ios用户"
			Iuser.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
		}
		err = global.MG_DB.Model(&model.User{}).Create(&Iuser).Error
		if err != nil {
			return Iuser, errors.New("注册失败,请稍后再试")
		}
		//添加三方登录标识
		var wallet model.Wallet
		wallet.UserID = Iuser.UUID.String()
		wallet.Platform = "influencer"
		global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
		return Iuser, nil
	}
	return Iuser, nil
}

func GetAccessToken(provider model.Provider, Code string) (err error, aceessToken string, userID string) {
	//发送post请求
	switch provider.Code {
	case "tiktok":
		aceessToken, err = GetTiktokAccessToken(provider.ClientID, provider.ClientSecret, Code, provider.RedirectURI)
	case "facebook":
		//facebook可以直接获取token 暂不提供
	case "twitter":
		aceessToken, err = GetTwitterAccessToken(provider.ClientID, provider.ClientSecret, Code, provider.RedirectURI)
	case "google":
		var (
			googleOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
				Endpoint:     google.Endpoint,
			}
			token *oauth2.Token
		)
		token, err = googleOauthConfig.Exchange(context.Background(), Code)
		if err != nil {
			return err, aceessToken, ""
		}
		aceessToken = token.AccessToken
	case "youtube":
		var (
			googleOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
				Endpoint:     google.Endpoint,
			}
			token *oauth2.Token
		)
		fmt.Println(provider, Code)
		token, err = googleOauthConfig.Exchange(context.Background(), Code)
		if err != nil {
			return err, aceessToken, ""
		}
		aceessToken = token.AccessToken
	case "instagram":
		var (
			instagramOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"user_profile"},
				Endpoint:     instagram.Endpoint,
			}
		)
		token, err := instagramOauthConfig.Exchange(context.Background(), Code)
		fmt.Println(token)
		if err != nil {
			return err, aceessToken, ""
		}
		aceessToken = token.AccessToken
		userID = strconv.Itoa(int(token.Extra("user_id").(float64)))
	default:
	}
	return
}

func GetUserInfo(provider model.Provider, aceessToken, userID string) (err error, user model.ProviderUser) {
	switch provider.Code {
	case "tiktok":
		tuser, err := getUserInfo(aceessToken)
		if err != nil {
			fmt.Println("Error:", err)
			return err, user
		}
		user.UserID = tuser.OpenID
		user.NickName = tuser.DisplayName
		user.Avatar = tuser.AvatarURL
		return nil, user
	case "facebook":
		var userID string
		//校验token
		tokenCheckURI := provider.TokenCheckURI + "?input_token=" + aceessToken + "&access_token=" + getAccessToken(provider.ClientID, provider.ClientSecret)
		err, userID := DebugFacebookToken(aceessToken, tokenCheckURI)
		if err != nil {
			return errors.New("token校验失败"), user
		}
		//获取用户信息
		userInfoURI := strings.Replace(provider.UserInfoURI, "USER-ID", userID, 1)
		userInfoURI = userInfoURI + "&access_token=" + getAccessToken(provider.ClientID, provider.ClientSecret)
		faceUser, err := getThirdPartyLoginUserBO(userInfoURI)
		if err != nil {
			return errors.New("获取用户信息失败"), user
		}
		user.UserID = userID
		user.NickName = faceUser.UserName
		user.Email = faceUser.Email
		user.Avatar = faceUser.Picture.Data.URL
		return nil, user
	case "instagram":
		resp, err1 := http.Get(provider.UserInfoURI + userID + fmt.Sprintf("?fields=%v&access_token=%v", "id,username", aceessToken))
		if err1 != nil {
			fmt.Println("Failed to get user info: ", err.Error())
			return
		}

		defer resp.Body.Close()
		content, err1 := io.ReadAll(resp.Body)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		fmt.Println("Response body: ", string(content))
		var googleUser response.TripartiteInstagram
		err1 = json.Unmarshal(content, &googleUser)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		user.UserID = googleUser.ID
		user.NickName = googleUser.Username
	case "twitter":
		user, err = getTwitterUserInfo(provider, aceessToken)
		return err, user
	case "google":
		resp, err1 := http.Get("https://oauth2.googleapis.com/tokeninfo?id_token=" + aceessToken)
		if err1 != nil {
			fmt.Println("Failed to get user info: ", err.Error())
			return
		}

		defer resp.Body.Close()
		content, err1 := io.ReadAll(resp.Body)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		var googleUser response.TripartiteGoogle
		err1 = json.Unmarshal(content, &googleUser)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		user.UserID = googleUser.Sub
		user.NickName = googleUser.Name
		// user.Email = googleUser.Email
		user.Avatar = googleUser.Picture
		fmt.Println("Response body: ", string(content))
	case "youtube":
		resp, err1 := http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + aceessToken)
		fmt.Println("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + aceessToken)
		if err1 != nil {
			fmt.Println("Failed to get user info: ", err1.Error())
			return
		}

		defer resp.Body.Close()
		content, err1 := io.ReadAll(resp.Body)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		var googleUser response.TripartiteGoogle
		err1 = json.Unmarshal(content, &googleUser)
		if err1 != nil {
			fmt.Println("Failed to read response body: ", err1.Error())
			return
		}
		user.UserID = googleUser.ID
		user.NickName = googleUser.Name
		// user.Email = googleUser.Email
		user.Avatar = googleUser.Picture
		fmt.Println("Response body: ", string(content))
	default:
	}
	return
}

func DebugFacebookToken(accessToken, url string) (err error, userID string) {
	// 构建请求
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return err, ""
	}

	// 发送请求
	client := http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err, ""
	}
	defer resp.Body.Close()

	// 读取响应数据
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return err, ""
	}

	// 解析响应数据
	var result map[string]interface{}
	if err := json.Unmarshal(body, &result); err != nil {
		return err, ""
	}
	// 提取 access_token
	userID, ok := result["data"].(map[string]interface{})["user_id"].(string)
	if !ok {
		return errors.New("未能获取有效的user_id"), ""
	}
	return nil, userID
}

func GetTiktokAccessToken(clientKey, clientSecret, code, redirectURI string) (string, error) {
	// 构建请求体
	data := url.Values{}
	data.Set("client_key", clientKey)
	data.Set("client_secret", clientSecret)
	data.Set("code", code)
	data.Set("grant_type", "authorization_code")
	data.Set("redirect_uri", redirectURI)

	// 构建请求
	req, err := http.NewRequest("POST", "https://open.tiktokapis.com/v2/oauth/token", strings.NewReader(data.Encode()))
	if err != nil {
		return "", err
	}

	// 设置请求头
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	// 发送请求
	client := http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	// 读取响应数据
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	// 解析响应数据
	var result map[string]interface{}
	if err := json.Unmarshal(body, &result); err != nil {
		return "", err
	}

	// 检查是否返回错误
	if errorMsg, ok := result["error_description"].(string); ok {
		return "", fmt.Errorf("获取 access token 失败:%s", errorMsg)
	}

	// 提取 access_token
	accessToken, ok := result["access_token"].(string)
	if !ok {
		return "", fmt.Errorf("未能获取有效的 access token")
	}

	return accessToken, nil
}

func GetTwitterAccessToken(clientKey, clientSecret, code, redirectURI string) (string, error) {
	// 构建请求体
	data := url.Values{}
	data.Set("code", code)
	data.Set("grant_type", "authorization_code")
	data.Set("client_id", clientKey)
	data.Set("redirect_uri", redirectURI)
	data.Set("code_verifier", "challenge")

	req, err := http.NewRequest("POST", "https://api.twitter.com/2/oauth2/token", strings.NewReader(data.Encode()))
	if err != nil {
		// handle error
	}
	fmt.Println(data.Encode())
	// 设置请求头
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(clientKey+":"+clientSecret)))

	// 发送请求
	client := http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	// 读取响应数据
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}
	fmt.Println(string(body))
	// 解析响应数据
	var result map[string]interface{}
	if err := json.Unmarshal(body, &result); err != nil {
		return "", err
	}

	// 检查是否返回错误
	if errorMsg, ok := result["error_description"].(string); ok {
		return "", fmt.Errorf("获取 access token 失败:%s", errorMsg)
	}

	// 提取 access_token
	accessToken, ok := result["access_token"].(string)
	if !ok {
		return "", fmt.Errorf("未能获取有效的 access token")
	}

	return accessToken, nil
}

func getThirdPartyLoginUserBO(url string) (model.FacebookUserInfo, error) {
	resp, err := http.Get(url)
	if err != nil {
		return model.FacebookUserInfo{}, err
	}
	defer resp.Body.Close()

	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		return model.FacebookUserInfo{}, fmt.Errorf("Facebook请求查询用户接口失败,响应为%d", resp.StatusCode)
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return model.FacebookUserInfo{}, err
	}

	var userInfo model.FacebookUserInfo
	err = json.Unmarshal(body, &userInfo)
	if err != nil {
		return model.FacebookUserInfo{}, err
	}

	return userInfo, nil
}

func getAccessToken(clientId string, clientSecret string) string {
	return url.QueryEscape(clientId + "|" + clientSecret)
}

func UserAppeal(u *request.UserAppeal, userID string) (err error) {
	var appeal model.UserAppeal
	appeal.UserID = userID
	appeal.Respon = u.Respon
	appeal.Contact = u.Contact
	appeal.Images = u.Images
	appeal.Status = 0
	err = global.MG_DB.Model(&model.UserAppeal{}).Create(&appeal).Error
	if err != nil {
		return errors.New("申诉失败")
	}
	return nil
}

func UserEmail(u *request.UserEmail, userID, appid string) (err error) {
	var (
		user model.User
	)
	code := RedisGet("email_code:" + u.Email)
	if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {

	} else if code != u.Code {
		return errors.New("验证码验证失败")
	}
	err = global.MG_DB.Where("uuid=? and appid=?", userID, appid).Find(&user).Error
	if err != nil {
		return errors.New("获取用户失败")
	}
	if user.UUID == uuid.Nil {
		return errors.New("用户不存在")
	}
	if user.Email != "" {
		return errors.New("邮箱已绑定")
	}
	err = global.MG_DB.Model(&model.User{}).Where("uuid=? and appid=?", userID, appid).Update("email", u.Email).Error
	if err != nil {
		return errors.New("绑定失败")
	}
	return nil
}

func GetProviderAuthUrl(u *request.ProviderAuth) (err error, url string) {
	var (
		provider     model.Provider
		application  model.Application
		providerList model.ClentProvider
	)
	err = global.MG_DB.Where("appid=?", u.Appid).Find(&application).Error
	if err != nil {
		return errors.New("获取应用失败"), ""
	}
	if application.ID == 0 {
		return errors.New("应用不存在"), ""
	}
	err = json.Unmarshal([]byte(application.Provider), &providerList)
	if err != nil {
		return errors.New("获取应用失败"), ""
	}
	switch u.Client {
	case "android":
		for _, v := range providerList.Android {
			if v.Code == u.Platform {
				provider = v
			}
		}
	case "ios":
		for _, v := range providerList.Ios {
			if v.Code == u.Platform {
				provider = v
			}
		}
	default:
		for _, v := range providerList.Web {
			if v.Code == u.Platform {
				provider = v
			}
		}
	}
	if provider.Code == "" {
		return errors.New("平台不存在"), ""
	}
	switch provider.Code {
	case "tiktok":
		url = strings.Replace(provider.AuthURI, "<client_key>", provider.ClientID, 1)
		url = strings.Replace(url, "<scope>", provider.Scope, 1)
		url = strings.Replace(url, "<redirect_uri>", provider.RedirectURI, 1)
		url = strings.Replace(url, "<state>", "tiktok", 1)
	case "facebook":
		url = strings.Replace(provider.AuthURI, "{app-id}", provider.ClientID, 1)
		url = strings.Replace(url, "{redirect-uri}", provider.RedirectURI, 1)
		url = strings.Replace(url, "{state-param}", "facebook", 1)
	case "instagram":
		var (
			instagramOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"user_profile"},
				Endpoint:     instagram.Endpoint,
			}
		)
		url = instagramOauthConfig.AuthCodeURL("instagram")
	case "twitter":
		url = strings.Replace(provider.AuthURI, "<client_id>", provider.ClientID, 1)
		url = strings.Replace(url, "<scope>", provider.Scope, 1)
		url = strings.Replace(url, "<redirect_uri>", provider.RedirectURI, 1)
		url = strings.Replace(url, "<state>", "twitter", 1)
		url = strings.Replace(url, "<code_challenge>", "challenge", 1)
		url = strings.Replace(url, "<code_challenge_method>", "plain", 1)
	case "youtube":
		var (
			googleOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
				Endpoint:     google.Endpoint,
			}
		)
		url = googleOauthConfig.AuthCodeURL("youtube")
	case "google":
		var (
			googleOauthConfig = &oauth2.Config{
				RedirectURL:  provider.RedirectURI,
				ClientID:     provider.ClientID,
				ClientSecret: provider.ClientSecret,
				Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
				Endpoint:     google.Endpoint,
			}
		)
		url = googleOauthConfig.AuthCodeURL("google")
	default:
	}
	fmt.Println(url)
	return nil, url
}

func getUserInfo(token string) (*model.TiktokUser, error) {
	url := "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}

	req.Header.Add("Authorization", "Bearer "+token)

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer res.Body.Close()

	body, err := io.ReadAll(res.Body)
	if err != nil {
		return nil, err
	}

	var response response.TiktokResponse
	err = json.Unmarshal(body, &response)
	if err != nil {
		return nil, err
	}

	if response.Error.Code != "ok" {
		return nil, fmt.Errorf("API error: %s", response.Error.Message)
	}

	return &response.Data.User, nil
}

func getTwitterUserInfo(provider model.Provider, aceessToken string) (model.ProviderUser, error) {
	var result response.TripartiteTwitter
	var user model.ProviderUser
	req, err := http.NewRequest("GET", provider.UserInfoURI, nil)
	if err != nil {
		// handle error
		return user, err
	}

	req.Header.Add("Authorization", "Bearer "+aceessToken)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		// handle error
		return user, err
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		// handle error
		return user, err
	}
	fmt.Println("------twitter", string(body))
	err = json.Unmarshal(body, &result)
	if err != nil {
		// handle error
		fmt.Println("------twitter", err)
		return user, err
	}
	user.UserID = result.Data.ID
	user.NickName = result.Data.Name
	return user, err
}

func getUser(uuid string) (model.User, error) {
	var (
		err    error
		result model.User
	)
	err = global.MG_DB.Model(&model.User{}).Where("uuid = ?", uuid).First(&result).Error
	return result, err
}

func AppProviderInit() {
	var (
		clients   model.ClentProvider
		providers []model.Provider
	)
	providers = append(providers, model.Provider{
		Code:         "google",
		ClientID:     "411647813390-7h52imq0t8mk1k48kr72tvces043a1i8.apps.googleusercontent.com",
		ClientSecret: "411647813390-7h52imq0t8mk1k48kr72tvces043a1i8.apps.googleusercontent.com",
		Scope:        "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
		RedirectURI:  "http://localhost:8080/auth/google/callback",
		AuthURI:      "",
		TokenURI:     "",
		UserInfoURI:  "https://www.googleapis.com/oauth2/v2/userinfo",
	})
	providers = append(providers, model.Provider{
		Code:          "facebook",
		ClientID:      "2022993034711459",
		ClientSecret:  "eaab719570279138cf977ac807936f51",
		Scope:         "user_profile",
		RedirectURI:   "http://localhost:8000",
		AuthURI:       "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
		TokenURI:      "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
		TokenCheckURI: "https://graph.facebook.com/debug_token",
		UserInfoURI:   "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
	})
	providers = append(providers, model.Provider{
		Code:         "twitter",
		ClientID:     "kkx47j7W1QBJowXqK10F2dBxw",
		ClientSecret: "kXaP0TFIQ6A2wuH4xbGa8yDonqGAuWAmXa3vSqL5yPVaqU5e7y",
		Scope:        "tweet.read%20users.read",
		RedirectURI:  "https://www.baidu.com",
		AuthURI:      "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
		TokenURI:     "https://api.twitter.com/2/oauth2/token",
		TokenType:    "Bearer",
		UserInfoURI:  "https://api.twitter.com/2/user",
	})
	providers = append(providers, model.Provider{
		Code:         "tiktok",
		ClientID:     "awfcivkstde78lmu",
		ClientSecret: "",
		Scope:        "user.info.basic",
		RedirectURI:  "",
		AuthURI:      "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
		TokenURI:     "https://open.tiktokapis.com/v2/oauth/token?",
		UserInfoURI:  "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
	})
	clients.Android = providers
	providers = []model.Provider{}
	providers = append(providers, model.Provider{
		Code:         "youtube",
		ClientID:     "560948330734-u9lhqedsn90cb3jguopr6afrf64nmejs.apps.googleusercontent.com",
		ClientSecret: "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",
		Scope:        "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
		RedirectURI:  "https://h5-dev.bkbackground.com/loading",
		AuthURI:      "",
		TokenURI:     "",
		UserInfoURI:  "https://www.googleapis.com/oauth2/v2/userinfo",
	})
	providers = append(providers, model.Provider{
		Code:          "facebook",
		ClientID:      "1404974307098155",
		ClientSecret:  "277467943e199b1cdf57ea4835f603a2",
		Scope:         "user_profile",
		RedirectURI:   "https://h5-dev.bkbackground.com/loading",
		AuthURI:       "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
		TokenURI:      "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
		TokenCheckURI: "https://graph.facebook.com/debug_token",
		UserInfoURI:   "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
	})
	providers = append(providers, model.Provider{
		Code:         "twitter",
		ClientID:     "ZEp6VUUwVG9ybl9JampHbHNkYmo6MTpjaQ",
		ClientSecret: "PT_gMm2PQ44QCl3M08AnRr8cm3_98AupHTTRMPTATZFMXQL2aI",
		Scope:        "tweet.read%20users.read",
		RedirectURI:  "https://h5-dev.bkbackground.com/loading",
		AuthURI:      "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
		TokenURI:     "https://api.twitter.com/2/oauth2/token",
		TokenType:    "Bearer",
		UserInfoURI:  "https://api.twitter.com/2/users/me",
	})
	providers = append(providers, model.Provider{
		Code:         "tiktok",
		ClientID:     "awct4oqq4618322e",
		ClientSecret: "Qjv1Q89yexn3FFCbGeqY85UnKFrL2JTW",
		Scope:        "user.info.basic",
		RedirectURI:  "https://h5-dev.bkbackground.com/loading",
		AuthURI:      "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
		TokenURI:     "https://open.tiktokapis.com/v2/oauth/token?",
		UserInfoURI:  "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
	})
	providers = append(providers, model.Provider{
		Code:         "instagram",
		ClientID:     "358175333242276",
		ClientSecret: "96fc00c184619bdc13803fa976bc81fb",
		Scope:        "user_profile",
		RedirectURI:  "https://h5-dev.bkbackground.com/loading",
		AuthURI:      "https://api.instagram.com/oauth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
		TokenURI:     "https://api.instagram.com/oauth/access_token",
		TokenType:    "Bearer",
		UserInfoURI:  "https://graph.instagram.com/v18.0/",
	})
	clients.Web = providers
	providers = []model.Provider{}
	providers = append(providers, model.Provider{
		Code:         "google",
		ClientID:     "10001",
		ClientSecret: "560948330734-6d6vpdv3m4003f1tmodbs5v4lm7nft4q.apps.googleusercontent.com",
		Scope:        "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
		RedirectURI:  "",
		AuthURI:      "",
		TokenURI:     "",
		UserInfoURI:  "https://www.googleapis.com/oauth2/v2/userinfo",
	})
	providers = append(providers, model.Provider{
		Code:          "facebook",
		ClientID:      "2022993034711459",
		ClientSecret:  "eaab719570279138cf977ac807936f51",
		Scope:         "user_profile",
		RedirectURI:   "",
		AuthURI:       "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
		TokenURI:      "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
		TokenCheckURI: "https://graph.facebook.com/debug_token",
		UserInfoURI:   "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
	})
	providers = append(providers, model.Provider{
		Code: "ios",
	})
	// providers = append(providers, model.Provider{
	// 	Code:         "twitter",
	// 	ClientID:     "kkx47j7W1QBJowXqK10F2dBxw",
	// 	ClientSecret: "kXaP0TFIQ6A2wuH4xbGa8yDonqGAuWAmXa3vSqL5yPVaqU5e7y",
	// 	Scope:        "tweet.read%20users.read",
	// 	RedirectURI:  "https://www.baidu.com",
	// 	AuthURI:      "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
	// 	TokenURI:     "https://api.twitter.com/2/oauth2/token",
	// 	TokenType:    "Bearer",
	// 	UserInfoURI:  "https://api.twitter.com/2/user",
	// })
	// providers = append(providers, model.Provider{
	// 	Code:         "tiktok",
	// 	ClientID:     "awfcivkstde78lmu",
	// 	ClientSecret: "",
	// 	Scope:        "user.info.basic",
	// 	RedirectURI:  "",
	// 	AuthURI:      "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
	// 	TokenURI:     "https://open.tiktokapis.com/v2/oauth/token?",
	// 	UserInfoURI:  "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
	// })
	clients.Ios = providers
	providerStr, _ := json.Marshal(clients)
	uMap := make(map[string]interface{})
	uMap["client_id"] = utils.GetInvitationLen(18)
	uMap["client_secret"] = utils.GetInvitationLen(50)
	uMap["provider"] = string(providerStr)
	global.MG_DB.Model(&model.Application{}).Where("appid=?", "appid").Updates(uMap)

}