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"
)

// CUCCRealnameRemovalTranslation 是联通解除实名回调的受控语义。
type CUCCRealnameRemovalTranslation struct {
	ICCID       string
	DateChanged string
}

// CUCCRealnameRemovalTranslator 解析外层 data 字符串及其内层 JSON。
type CUCCRealnameRemovalTranslator struct{}

// NewCUCCRealnameRemovalTranslator 创建联通解除实名 Translator。
func NewCUCCRealnameRemovalTranslator() *CUCCRealnameRemovalTranslator {
	return &CUCCRealnameRemovalTranslator{}
}

// Translate 解析并校验联通解除实名报文，不执行任何业务写入。
func (t *CUCCRealnameRemovalTranslator) Translate(body []byte) (CUCCRealnameRemovalTranslation, error) {
	var result CUCCRealnameRemovalTranslation
	if len(bytes.TrimSpace(body)) == 0 {
		return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调报文为空")
	}
	var outer struct {
		Data string `json:"data"`
	}
	if err := sonic.Unmarshal(body, &outer); err != nil {
		return result, errors.Wrap(errors.CodeInvalidParam, err, "联通解除实名外层 JSON 解析失败")
	}
	if strings.TrimSpace(outer.Data) == "" {
		return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调 data 为空")
	}
	var inner struct {
		ICCID       string `json:"iccid"`
		DateChanged string `json:"dateChanged"`
	}
	if err := sonic.Unmarshal([]byte(outer.Data), &inner); err != nil {
		return result, errors.Wrap(errors.CodeInvalidParam, err, "联通解除实名内层 JSON 解析失败")
	}
	result.ICCID = strings.TrimSpace(inner.ICCID)
	result.DateChanged = strings.TrimSpace(inner.DateChanged)
	if validation := pkgvalidator.ValidateICCIDWithoutCarrier(result.ICCID); !validation.Valid {
		return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调 ICCID 无效")
	}
	if result.DateChanged == "" {
		return result, errors.New(errors.CodeInvalidParam, "联通解除实名回调变更时间为空")
	}
	return result, nil
}

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

// NewCUCCCardResolver 创建联通回调卡定位器。
func NewCUCCCardResolver(db *gorm.DB) *CUCCCardResolver {
	return NewCTCCCardResolver(db)
}
