// Package repository 提供数据访问层实现
// 包含各种数据实体的仓库接口和实现
package repository

import (
	"fmt"

	"git.huangwc.com/pig/pig-farm-controller/internal/model"
	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// UserRepo 用户仓库接口
type UserRepo interface {
	// CreateUser 创建新用户
	CreateUser(username, password string) (*model.User, error)

	// FindByUsername 根据用户名查找用户
	FindByUsername(username string) (*model.User, error)

	// FindByID 根据ID查找用户
	FindByID(id uint) (*model.User, error)
}

// userRepo 用户仓库实现
type userRepo struct {
	db *gorm.DB
}

// NewUserRepo 创建用户仓库实例
func NewUserRepo(db *gorm.DB) UserRepo {
	return &userRepo{
		db: db,
	}
}

// CreateUser 创建新用户
func (r *userRepo) CreateUser(username, password string) (*model.User, error) {
	// 检查用户是否已存在
	var existingUser model.User
	result := r.db.Where("username = ?", username).First(&existingUser)
	if result.Error == nil {
		return nil, fmt.Errorf("用户已存在")
	}

	// 对密码进行哈希处理
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return nil, fmt.Errorf("密码加密失败: %v", err)
	}

	// 创建新用户
	user := &model.User{
		Username:     username,
		PasswordHash: string(hashedPassword),
	}

	result = r.db.Create(user)
	if result.Error != nil {
		return nil, fmt.Errorf("用户创建失败: %v", result.Error)
	}

	return user, nil
}

// FindByUsername 根据用户名查找用户
func (r *userRepo) FindByUsername(username string) (*model.User, error) {
	var user model.User
	result := r.db.Where("username = ?", username).First(&user)
	if result.Error != nil {
		return nil, result.Error
	}
	return &user, nil
}

// FindByID 根据ID查找用户
func (r *userRepo) FindByID(id uint) (*model.User, error) {
	var user model.User
	result := r.db.First(&user, id)
	if result.Error != nil {
		return nil, result.Error
	}
	return &user, nil
}
