// 本包保存 user-service MySQL 子存储之间复用的低层工具。
package shared

import (
	"context"
	"database/sql"
	"errors"
	"strings"

	mysqldriver "github.com/go-sql-driver/mysql"
	"hyapp/pkg/xerr"
)

// Queryer 抽象 *sql.DB 和 *sql.Tx 的单行查询能力，便于同一 helper 服务普通查询和事务查询。
type Queryer interface {
	QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
}

// NullableString 统一把空字符串写成 SQL NULL，避免空值参与唯一性或审计语义。
func NullableString(value string) any {
	if strings.TrimSpace(value) == "" {
		return nil
	}

	return value
}

// NullableOperator 让系统修改短号或主数据时可以不携带操作者。
func NullableOperator(operatorUserID int64) any {
	if operatorUserID <= 0 {
		return nil
	}

	return operatorUserID
}

// NullableRegionID 统一把无区域归属写成 SQL NULL，查询投影再转换回 0。
func NullableRegionID(regionID int64) any {
	if regionID <= 0 {
		return nil
	}

	return regionID
}

// MapDisplayDuplicateError 把通用 display_user_id 唯一冲突转换成稳定领域 reason。
func MapDisplayDuplicateError(err error) error {
	var mysqlErr *mysqldriver.MySQLError
	if errors.As(err, &mysqlErr) && mysqlErr.Number == 1062 {
		return xerr.New(xerr.DisplayUserIDExists, "display_user_id already exists")
	}

	return err
}

// MapPrettyDuplicateError 把靓号租约相关唯一冲突转换成靓号不可用。
func MapPrettyDuplicateError(err error) error {
	var mysqlErr *mysqldriver.MySQLError
	if errors.As(err, &mysqlErr) && mysqlErr.Number == 1062 {
		return xerr.New(xerr.DisplayUserIDPrettyNotAvailable, "pretty display_user_id is not available")
	}

	return err
}
