<?php

namespace WMS\Services;

use WMS\Repositories\WarehouseTaskRepository;

/**
 * Servicio de gestión de tareas de almacén.
 */
class WarehouseTaskService
{
    private WarehouseTaskRepository $taskRepo;

    public function __construct()
    {
        $this->taskRepo = new WarehouseTaskRepository();
    }

    /**
     * Lista tareas abiertas con filtros opcionales.
     */
    public function getOpenTasks(int $warehouseId, ?string $taskType = null, ?int $assignedTo = null): array
    {
        return $this->taskRepo->getOpenTasks($warehouseId, $taskType, $assignedTo);
    }

    /**
     * Asigna una tarea a un operador.
     */
    public function assignTask(int $taskId, int $operatorId): array
    {
        $task = $this->taskRepo->findById($taskId);
        if (!$task) {
            throw new \RuntimeException('Tarea no encontrada');
        }
        if (!in_array($task['status'], ['PENDING', 'ASSIGNED'])) {
            throw new \RuntimeException('La tarea no puede ser asignada en su estado actual');
        }

        $this->taskRepo->assignTask($taskId, $operatorId);
        return $this->taskRepo->findById($taskId);
    }

    /**
     * Inicia una tarea.
     */
    public function startTask(int $taskId, int $userId): array
    {
        $task = $this->taskRepo->findById($taskId);
        if (!$task) {
            throw new \RuntimeException('Tarea no encontrada');
        }
        if ($task['assigned_to'] !== $userId && $task['status'] !== 'PENDING') {
            throw new \RuntimeException('No autorizado para iniciar esta tarea');
        }

        if ($task['status'] === 'PENDING') {
            $this->taskRepo->assignTask($taskId, $userId);
        }
        $this->taskRepo->startTask($taskId);

        return $this->taskRepo->findById($taskId);
    }

    /**
     * Obtiene detalle de una tarea.
     */
    public function getTask(int $taskId): ?array
    {
        return $this->taskRepo->findById($taskId);
    }
}
