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

import (
	"git.huangwc.com/pig/pig-farm-controller/internal/model"
	"gorm.io/gorm"
)

// OperationHistoryRepo 操作历史仓库接口
type OperationHistoryRepo interface {
	// Create 创建操作历史记录
	Create(history *model.OperationHistory) error

	// FindByUserID 根据用户ID查找操作历史记录
	FindByUserID(userID uint) ([]*model.OperationHistory, error)

	// FindByID 根据ID查找操作历史记录
	FindByID(id uint) (*model.OperationHistory, error)

	// List 获取操作历史记录列表(分页)
	List(offset, limit int) ([]*model.OperationHistory, error)

	// ListByUserID 根据用户ID获取操作历史记录列表(分页)
	ListByUserID(userID uint, offset, limit int) ([]*model.OperationHistory, error)
}

// operationHistoryRepo 操作历史仓库实现
type operationHistoryRepo struct {
	db *gorm.DB
}

// NewOperationHistoryRepo 创建操作历史仓库实例
func NewOperationHistoryRepo(db *gorm.DB) OperationHistoryRepo {
	return &operationHistoryRepo{
		db: db,
	}
}

// Create 创建操作历史记录
func (r *operationHistoryRepo) Create(history *model.OperationHistory) error {
	result := r.db.Create(history)
	return result.Error
}

// FindByUserID 根据用户ID查找操作历史记录
func (r *operationHistoryRepo) FindByUserID(userID uint) ([]*model.OperationHistory, error) {
	var histories []*model.OperationHistory
	result := r.db.Where("user_id = ?", userID).Order("created_at DESC").Find(&histories)
	if result.Error != nil {
		return nil, result.Error
	}
	return histories, nil
}

// FindByID 根据ID查找操作历史记录
func (r *operationHistoryRepo) FindByID(id uint) (*model.OperationHistory, error) {
	var history model.OperationHistory
	result := r.db.First(&history, id)
	if result.Error != nil {
		return nil, result.Error
	}
	return &history, nil
}

// List 获取操作历史记录列表(分页)
func (r *operationHistoryRepo) List(offset, limit int) ([]*model.OperationHistory, error) {
	var histories []*model.OperationHistory
	result := r.db.Offset(offset).Limit(limit).Order("created_at DESC").Find(&histories)
	if result.Error != nil {
		return nil, result.Error
	}
	return histories, nil
}

// ListByUserID 根据用户ID获取操作历史记录列表(分页)
func (r *operationHistoryRepo) ListByUserID(userID uint, offset, limit int) ([]*model.OperationHistory, error) {
	var histories []*model.OperationHistory
	result := r.db.Where("user_id = ?", userID).Offset(offset).Limit(limit).Order("created_at DESC").Find(&histories)
	if result.Error != nil {
		return nil, result.Error
	}
	return histories, nil
}
