package taxerr

import (
	"errors"
	"git.listensoft.net/tool/jspkit/logger"
	"strings"

	"github.com/go-rod/rod"
)

// FormatLoginError 格式化错误信息
func FormatLoginError(str string) error {
	logger.Info("原始错误信息 - ", str)
	if strings.Contains(str, "短信发送次数超限") {
		return TelSmsOverrun
	}
	if strings.Contains(str, "手机号不在线") {
		return SmsUnOnline
	}
	if strings.Contains(str, "请调用发送验证码") || strings.Contains(str, "您的登录已掉线,请重新授权后再次发起任务") {
		return TelOffline
	}
	if strings.Contains(str, "手机验证码接收失败") || strings.Contains(str, "服务未获取到短信验证码") {
		return SmsCodeNotReceived
	}
	if strings.Contains(str, "连续认证错误次数过多") || strings.Contains(str, "次输入个人用户密码错误") || strings.Contains(str, "次输入密码错误") {
		return PasswdLockError
	}
	if strings.Contains(str, "输入的短信验证码错误") {
		return TelSmsError
	}
	if strings.Contains(str, "输入的个人账号或密码错误") {
		return PasswdError
	}
	if strings.Contains(str, "税局服务繁忙") {
		return TaxAbnormalError(true)
	}
	if strings.Contains(str, "输入的统一社会信用代码或纳税人识别号错误") {
		return TaxNoError
	}
	if strings.Contains(str, "未查询到您与该企业的关联关系") {
		return ComIrrelevantRelationError
	}
	if strings.Contains(str, "未查询到您与该代理企业的关联关系信息") {
		return NewUserV3("税局提示:未查询到您与该代理企业的关联关系信息", "请确认录入的信息是否正确")
	}
	if strings.Contains(str, "办税人登录信息与企业无关联关系") {
		return ComIrrelevantRelationError
	}
	if strings.Contains(str, "税局服务繁忙") || strings.Contains(str, `登录失败~`) || strings.Contains(str, "内部异常:") ||
		strings.Contains(str, "应用令牌无效") || str == "税局服务异常,请稍后重试" ||
		strings.Contains(str, "渠道认证") {
		// {"code":-1,"data":{},"message":"内部异常:error parse true"}
		// {"code":-1,"data":{},"message":"登录失败~syntax error, pos 1, json : Read timed out"}
		return TaxAbnormalError(true)
	}
	if strings.Contains(str, "手机号码不存在") {
		return NewUserV3("税局提示:手机号码不存在", "您可以尝试使用证件号码登录")
	}
	if strings.Contains(str, "您与该企业的绑定关系已过期") {
		return NewUserV3("税局提示:您与该企业的绑定关系已过期", "请重新绑定版税身份后重试")
	}
	if strings.Contains(str, "请在自然人业务入口进行用户注册") {
		return UnRegisteredError
	}
	if strings.Contains(str, "登记企业信息不存在") {
		return NewUserV3("税局提示:登记企业信息不存在", "请核实")
	}
	if strings.Contains(str, "查询到您与该企业的关联关系信息仍未确认,请确认是否扫脸或稍后再试") {
		return NewUserV3(`税局提示:查询到您与该企业的关联关系信息仍未确认,请确认是否扫脸或稍后再试`, "请核实该企业与办税员绑定是否正常")
	}
	if strings.Contains(str, "请先完成扫脸认证") || strings.Contains(str, "请前往税务APP扫脸认证身份") {
		return NewUser(str)
	}
	if strings.Contains(str, "输入的个人账号、密码或报税手机号错误,请重新输入!") {
		return TaxNotMatch
	}
	if strings.Contains(str, `确认成为该企业办税人失败,请在网站自行扫脸验证确认后使用`) {
		return FaceVerifyError
	}
	if strings.Contains(str, "请核对账套内填写的手机号") || strings.Contains(str, "请自行确认为该企业内的身份2") {
		return NewUser(str)
	}
	// 扫码失败或者login一分钟超时后等等待一分钟扫码失败
	if strings.Contains(str, "请登陆后再操作") || strings.Contains(str, "请先完成登录,再执行此项业务") {
		return TaxAbnormalError(true)
	}
	if strings.Contains(str, "不存在用户") || strings.Contains(str, "返回当前用户") {
		return NewUser("代理登录未绑定该企业,请先去税局绑定")
	}
	if strings.Contains(str, "税号错误") {
		return NewUserV3(`输入的纳税人识别号与公司名不匹配`, `请在“企业信息”修改后重试`)
	}
	if strings.Contains(str, "您使用短信验证码过于频繁") || strings.Contains(str, "短信发送申请过于频繁") {
		return NewUser("税局提示:您使用短信验证码过于频繁")
	}
	if strings.Contains(str, "请先完成渠道认证") {
		return NewUserV3(`请先完成渠道认证`, `再执行此项业务`)
	}
	if strings.Contains(str, "格式不对,请检查是否有空格等特殊字符") {
		return NewUser(str)
	}
	return New(str)
}

// TaskErrMsg 尝试从错误中提取任务错误信息
func TaskErrMsg(err error) (string, bool) {
	if se := new(SystemErr); errors.As(err, &se) {
		return se.Msg, true
	}
	if ue := new(UserErr); errors.As(err, &ue) {
		return ue.Msg, true
	}
	return "", false
}

// AsTaskErr 尝试将错误强转为 tax 错误
func AsTaskErr(err error) (error, bool) {
	if se := new(SystemErr); errors.As(err, &se) {
		return se, true
	}
	if ue := new(UserErr); errors.As(err, &ue) {
		return ue, true
	}
	return nil, false
}

func M(err error) {
	if err != nil {
		panic(err)
	}
}

func E[T any](t T, err error) T {
	if err != nil {
		panic(err)
	}
	return t
}

// U 尝试解析 rod.Try 返回 err 的底层 error
func U(err error) error {
	if err == nil {
		return nil
	}
	te := new(rod.TryError)
	if !errors.As(err, &te) {
		return err
	}
	ue := errors.Unwrap(te)
	if ue == nil {
		return te
	}
	return ue
}