package auth

import (
	"errors"
	"time"

	"hfb_sys/backend/internal/model"

	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

type UserRepository struct {
	db *gorm.DB
}

func NewUserRepository(db *gorm.DB) *UserRepository {
	return &UserRepository{db: db}
}

func (r *UserRepository) FindByID(id uint64) (*model.User, error) {
	var user model.User
	if err := r.db.First(&user, id).Error; err != nil {
		return nil, err
	}
	return &user, nil
}

func (r *UserRepository) UpdateProfile(id uint64, nickname string, avatarURL string) (*model.User, error) {
	if err := r.db.Model(&model.User{}).Where("id = ?", id).Updates(map[string]any{
		"nickname":   nickname,
		"avatar_url": avatarURL,
	}).Error; err != nil {
		return nil, err
	}
	return r.FindByID(id)
}

func (r *UserRepository) FindOrCreateByPhone(phone string) (*model.User, error) {
	now := time.Now()
	user := model.User{
		Phone:          phone,
		Nickname:       "用户" + phone[len(phone)-4:],
		RealnameStatus: "unverified",
		RiskStatus:     "normal",
		CreditScore:    100,
		Status:         "active",
		LastLoginAt:    &now,
	}

	err := r.db.Clauses(clause.OnConflict{
		Columns:   []clause.Column{{Name: "phone"}},
		DoUpdates: clause.AssignmentColumns([]string{"last_login_at", "updated_at"}),
	}).Create(&user).Error
	if err != nil {
		return nil, err
	}

	var found model.User
	if err := r.db.Where("phone = ?", phone).First(&found).Error; err != nil {
		return nil, err
	}
	return &found, nil
}

func IsNotFound(err error) bool {
	return errors.Is(err, gorm.ErrRecordNotFound)
}
