package carriercallback

import (
	"bytes"
	"strings"

	"github.com/bytedance/sonic"
	"gorm.io/gorm"

	"github.com/break/junhong_cmp_fiber/pkg/errors"
	pkgvalidator "github.com/break/junhong_cmp_fiber/pkg/validator"
)

// CMCCRealnameTranslation 是移动实名 JSON 回调的受控语义。
type CMCCRealnameTranslation struct {
	ICCID   string
	BusiSeq string
}

// CMCCRealnameTranslator 解析移动实名成功回调的固定 JSON 结构。
type CMCCRealnameTranslator struct{}

// CMCCCardResolver 复用系统级 ICCID 精确查询约束。
type CMCCCardResolver = CTCCCardResolver

// NewCMCCCardResolver 创建移动回调卡定位器。
func NewCMCCCardResolver(db *gorm.DB) *CMCCCardResolver {
	return NewCTCCCardResolver(db)
}

// NewCMCCRealnameTranslator 创建移动实名回调 Translator。
func NewCMCCRealnameTranslator() *CMCCRealnameTranslator {
	return &CMCCRealnameTranslator{}
}

type cmccRealnamePayload struct {
	Status  string `json:"status"`
	Message string `json:"message"`
	Result  []struct {
		RegStatus string `json:"regStatus"`
		BusiSeq   string `json:"busiSeq"`
		ICCID     string `json:"iccid"`
	} `json:"result"`
}

// Translate 只接受 status=0、message=正确、首条结果实名成功且 ICCID 合法。
func (t *CMCCRealnameTranslator) Translate(body []byte) (CMCCRealnameTranslation, error) {
	var result CMCCRealnameTranslation
	if len(bytes.TrimSpace(body)) == 0 {
		return result, errors.New(errors.CodeInvalidParam, "移动实名回调报文为空")
	}
	var payload cmccRealnamePayload
	if err := sonic.Unmarshal(body, &payload); err != nil {
		return result, errors.Wrap(errors.CodeInvalidParam, err, "移动实名回调 JSON 解析失败")
	}
	if len(payload.Result) > 0 {
		result.BusiSeq = strings.TrimSpace(payload.Result[0].BusiSeq)
		result.ICCID = strings.TrimSpace(payload.Result[0].ICCID)
	}
	if payload.Status != "0" || payload.Message != "正确" || len(payload.Result) == 0 || payload.Result[0].RegStatus != "00000" {
		return result, errors.New(errors.CodeInvalidParam, "移动实名回调业务结果无效")
	}
	if validation := pkgvalidator.ValidateICCIDWithoutCarrier(result.ICCID); !validation.Valid {
		return result, errors.New(errors.CodeInvalidParam, "移动实名回调 ICCID 无效")
	}
	return result, nil
}
