package recipe

import (
	"context"
	"errors"
	"fmt"

	"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"

	"gorm.io/gorm"
)

// 定义领域特定的错误
var (
	ErrPigAgeStageInUse    = fmt.Errorf("猪年龄阶段正在被猪类型使用，无法删除")
	ErrPigAgeStageNotFound = fmt.Errorf("猪年龄阶段不存在")
)

// PigAgeStageService 定义了猪年龄阶段领域的核心业务服务接口
type PigAgeStageService interface {
	CreatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error
	GetPigAgeStageByID(ctx context.Context, id uint32) (*models.PigAgeStage, error)
	UpdatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error
	DeletePigAgeStage(ctx context.Context, id uint32) error
	ListPigAgeStages(ctx context.Context, opts repository.PigAgeStageListOptions, page, pageSize int) ([]models.PigAgeStage, int64, error)
}

// pigAgeStageServiceImpl 是 PigAgeStageService 的实现
type pigAgeStageServiceImpl struct {
	ctx         context.Context
	pigTypeRepo repository.PigTypeRepository // PigAgeStage 相关的操作目前在 PigTypeRepository 中
}

// NewPigAgeStageService 创建一个新的 PigAgeStageService 实例
func NewPigAgeStageService(ctx context.Context, pigTypeRepo repository.PigTypeRepository) PigAgeStageService {
	return &pigAgeStageServiceImpl{
		ctx:         ctx,
		pigTypeRepo: pigTypeRepo,
	}
}

// CreatePigAgeStage 实现了创建猪年龄阶段的核心业务逻辑
func (s *pigAgeStageServiceImpl) CreatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error {
	serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreatePigAgeStage")
	if err := s.pigTypeRepo.CreatePigAgeStage(serviceCtx, ageStage); err != nil {
		return fmt.Errorf("创建猪年龄阶段失败: %w", err)
	}
	return nil
}

// GetPigAgeStageByID 实现了获取单个猪年龄阶段的逻辑
func (s *pigAgeStageServiceImpl) GetPigAgeStageByID(ctx context.Context, id uint32) (*models.PigAgeStage, error) {
	serviceCtx := logs.AddFuncName(ctx, s.ctx, "GetPigAgeStageByID")

	ageStage, err := s.pigTypeRepo.GetPigAgeStageByID(serviceCtx, id)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, ErrPigAgeStageNotFound
		}
		return nil, fmt.Errorf("获取猪年龄阶段失败: %w", err)
	}
	return ageStage, nil
}

// UpdatePigAgeStage 实现了更新猪年龄阶段的核心业务逻辑
func (s *pigAgeStageServiceImpl) UpdatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error {
	serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdatePigAgeStage")
	if err := s.pigTypeRepo.UpdatePigAgeStage(serviceCtx, ageStage); err != nil {
		return fmt.Errorf("更新猪年龄阶段失败: %w", err)
	}
	return nil
}

// DeletePigAgeStage 实现了删除猪年龄阶段的核心业务逻辑
func (s *pigAgeStageServiceImpl) DeletePigAgeStage(ctx context.Context, id uint32) error {
	serviceCtx := logs.AddFuncName(ctx, s.ctx, "DeletePigAgeStage")

	// 检查是否有猪类型关联到该年龄阶段
	opts := repository.PigTypeListOptions{AgeStageID: &id}
	pigTypes, _, err := s.pigTypeRepo.ListPigTypes(serviceCtx, opts, 1, 1) // 只需检查是否存在，所以取1条
	if err != nil {
		return fmt.Errorf("检查猪年龄阶段关联失败: %w", err)
	}
	if len(pigTypes) > 0 {
		return ErrPigAgeStageInUse
	}

	// 检查实体是否存在
	_, err = s.pigTypeRepo.GetPigAgeStageByID(serviceCtx, id)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return ErrPigAgeStageNotFound
		}
		return fmt.Errorf("获取待删除的猪年龄阶段失败: %w", err)
	}

	if err := s.pigTypeRepo.DeletePigAgeStage(serviceCtx, id); err != nil {
		return fmt.Errorf("删除猪年龄阶段失败: %w", err)
	}
	return nil
}

// ListPigAgeStages 实现了列出猪年龄阶段的逻辑
func (s *pigAgeStageServiceImpl) ListPigAgeStages(ctx context.Context, opts repository.PigAgeStageListOptions, page, pageSize int) ([]models.PigAgeStage, int64, error) {
	serviceCtx := logs.AddFuncName(ctx, s.ctx, "ListPigAgeStages")
	ageStages, total, err := s.pigTypeRepo.ListPigAgeStages(serviceCtx, opts, page, pageSize)
	if err != nil {
		return nil, 0, fmt.Errorf("获取猪年龄阶段列表失败: %w", err)
	}
	return ageStages, total, nil
}
