package repository

import (
	"time"

	"metazone.cc/metalab/internal/model"

	"gorm.io/gorm"
)

// LevelRepo 积分/等级/签到/任务数据访问
type LevelRepo struct {
	db *gorm.DB
}

// NewLevelRepo 构造函数
func NewLevelRepo(db *gorm.DB) *LevelRepo {
	return &LevelRepo{db: db}
}

// FindByID 按 UID 查找用户（实现 userLevelStore 接口）
func (r *LevelRepo) FindByID(id uint) (*model.User, error) {
	var user model.User
	err := r.db.First(&user, id).Error
	if err != nil {
		return nil, err
	}
	return &user, nil
}

// AddExp 原子增加用户经验值
func (r *LevelRepo) AddExp(userID uint, delta int) error {
	return r.db.Model(&model.User{}).
		Where("uid = ?", userID).
		UpdateColumn("exp", gorm.Expr("exp + ?", delta)).Error
}

// FindCheckIn 查询指定自然日的签到记录
func (r *LevelRepo) FindCheckIn(userID uint, date time.Time) (*model.UserCheckIn, error) {
	var ci model.UserCheckIn
	err := r.db.Where("user_id = ? AND date = ?", userID, date).First(&ci).Error
	if err != nil {
		return nil, err
	}
	return &ci, nil
}

// CreateCheckIn 创建签到记录
func (r *LevelRepo) CreateCheckIn(ci *model.UserCheckIn) error {
	return r.db.Create(ci).Error
}

// FindTask 查询用户是否已完成指定任务
func (r *LevelRepo) FindTask(userID uint, taskType string) (*model.UserTask, error) {
	var t model.UserTask
	err := r.db.Where("user_id = ? AND task_type = ?", userID, taskType).First(&t).Error
	if err != nil {
		return nil, err
	}
	return &t, nil
}

// CreateTask 创建任务完成记录
func (r *LevelRepo) CreateTask(task *model.UserTask) error {
	return r.db.Create(task).Error
}
