package service

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strings"
	"ycc-server/app/main/api/internal/config"
	"ycc-server/pkg/lzkit/crypto"

	"github.com/tidwall/gjson"
)

type VerificationService struct {
	c                 config.Config
	westDexService    *WestDexService
	apiRequestService *ApiRequestService
}

func NewVerificationService(c config.Config, westDexService *WestDexService, apiRequestService *ApiRequestService) *VerificationService {
	return &VerificationService{
		c:                 c,
		westDexService:    westDexService,
		apiRequestService: apiRequestService,
	}
}

// 二要素
type TwoFactorVerificationRequest struct {
	Name   string
	IDCard string
}
type TwoFactorVerificationResp struct {
	Msg     string                     `json:"msg"`
	Success bool                       `json:"success"`
	Code    int                        `json:"code"`
	Data    *TwoFactorVerificationData `json:"data"` //
}
type TwoFactorVerificationData struct {
	Birthday string `json:"birthday"`
	Result   int    `json:"result"`
	Address  string `json:"address"`
	OrderNo  string `json:"orderNo"`
	Sex      string `json:"sex"`
	Desc     string `json:"desc"`
}

// 三要素
type ThreeFactorVerificationRequest struct {
	Name   string
	IDCard string
	Mobile string
}

// VerificationResult 定义校验结果结构体
type VerificationResult struct {
	Passed bool
	Err    error
}

// ValidationError 定义校验错误类型
type ValidationError struct {
	Message string
}

func (e *ValidationError) Error() string {
	return e.Message
}

func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificationRequest) (*VerificationResult, error) {
	appCode := r.c.Ali.Code
	requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check"

	// 构造查询参数
	data := url.Values{}
	data.Add("name", request.Name)
	data.Add("idcard", request.IDCard)

	req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode()))
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}
	req.Header.Set("Authorization", "APPCODE "+appCode)
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}

	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("请求失败, 状态码: %d", resp.StatusCode)
	}

	respBody, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("响应体读取失败:%v", err)
	}
	var twoFactorVerificationResp TwoFactorVerificationResp
	err = json.Unmarshal(respBody, &twoFactorVerificationResp)
	if err != nil {
		return nil, fmt.Errorf("二要素解析错误: %v", err)
	}

	if !twoFactorVerificationResp.Success {
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "请输入有效的身份证号码"},
		}, nil
	}

	if twoFactorVerificationResp.Code != 200 {
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: twoFactorVerificationResp.Msg},
		}, nil
	}

	if twoFactorVerificationResp.Data.Result == 1 {
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "姓名与身份证不一致"},
		}, nil
	}

	return &VerificationResult{Passed: true, Err: nil}, nil
}

func (r *VerificationService) TwoFactorVerificationWest(request TwoFactorVerificationRequest) (*VerificationResult, error) {

	params := map[string]interface{}{
		"name":    request.Name,
		"id_card": request.IDCard,
	}
	marshal, err := json.Marshal(params)
	if err != nil {
		return nil, fmt.Errorf("二要素参数创建错误: %v", err)
	}
	resp, err := r.apiRequestService.ProcessLayoutIdcardRequest(marshal)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}

	respStr := string(resp)
	if respStr != "0" {
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "姓名与身份证不一致"},
		}, nil
	}

	return &VerificationResult{Passed: true, Err: nil}, nil
}

func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerificationRequest) (*VerificationResult, error) {
	westName, err := crypto.WestDexEncrypt(request.Name, r.c.WestConfig.Key)
	if err != nil {
		return nil, err
	}
	westIDCard, err := crypto.WestDexEncrypt(request.IDCard, r.c.WestConfig.Key)
	if err != nil {
		return nil, err
	}
	westPhone, err := crypto.WestDexEncrypt(request.Mobile, r.c.WestConfig.Key)
	if err != nil {
		return nil, err
	}
	threeElementsReq := map[string]interface{}{
		"data": map[string]interface{}{
			"name":  westName,
			"idNo":  westIDCard,
			"phone": westPhone,
		},
	}
	resp, err := r.westDexService.CallAPI("G15BJ02", threeElementsReq)
	if err != nil {
		return nil, err
	}
	dataResult := gjson.GetBytes(resp, "data.code")
	if !dataResult.Exists() {
		return nil, fmt.Errorf("code 字段不存在")
	}
	code := dataResult.Int()
	switch code {
	case 1000:
	case 1002:
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "姓名、证件号、手机号信息不一致"},
		}, nil
	case 1003:
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "姓名、证件号、手机号信息不一致"},
		}, nil
	case 1004:
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "姓名不正确"},
		}, nil
	case 1005:
		return &VerificationResult{
			Passed: false,
			Err:    &ValidationError{Message: "证件号码不正确"},
		}, nil
	default:
		dataResultMsg := gjson.GetBytes(resp, "data.msg")
		if !dataResultMsg.Exists() {
			return nil, fmt.Errorf("msg字段不存在")
		}
		return nil, fmt.Errorf("三要素核验错误状态响应: %s", dataResultMsg.String())
	}

	return &VerificationResult{Passed: true, Err: nil}, nil
}
