// 本包承载 user-service 认证链路的 MySQL 持久化。
package auth

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

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

// Repository 是认证数据在 MySQL 上的存储实现。
type Repository struct {
	// db 由父级 MySQL repository 持有，本包只复用连接池。
	db *sql.DB
}

// New 基于共享 MySQL 连接池创建认证存储对象。
func New(db *sql.DB) *Repository {
	return &Repository{db: db}
}

func mapAuthDuplicateError(err error) error {
	var mysqlErr *mysqldriver.MySQLError
	if !errors.As(err, &mysqlErr) || mysqlErr.Number != 1062 {
		// 非 MySQL 重复键错误保持原样返回。
		return err
	}

	// 根据约束名或表名把重复键错误映射成稳定领域 reason。
	message := mysqlErr.Message
	switch {
	case strings.Contains(message, "uk_users_register_device_id"):
		return xerr.New(xerr.DeviceAlreadyRegistered, "device already registered")
	case strings.Contains(message, "password_accounts"):
		return xerr.New(xerr.PasswordAlreadySet, "password already set")
	case strings.Contains(message, "third_party") || strings.Contains(message, "uk_third_party_provider_subject"):
		return xerr.New(xerr.Conflict, "third-party identity already exists")
	case strings.Contains(message, "display") || strings.Contains(message, "uk_users_current_display_user_id"):
		return xerr.New(xerr.DisplayUserIDExists, "display_user_id already exists")
	default:
		return xerr.New(xerr.Conflict, "duplicate key")
	}
}
