<?php

namespace WMS\Controllers;

use WMS\Core\Request;
use WMS\Core\Response;
use WMS\Middleware\AuthMiddleware;
use WMS\Services\PickingService;
use WMS\Repositories\PickListRepository;
use WMS\Helpers\Validator;

class PickingController
{
    /**
     * POST /api/picking
     * Crea una pick list con asignación FEFO.
     * Body: {
     *   warehouse_id, customer_code?, customer_name?, ship_date?,
     *   sap_doc_entry?, sap_doc_num?,
     *   lines: [{ item_id, quantity, sap_line_num? }]
     * }
     */
    public static function create(array $params): void
    {
        $body = Request::body();
        $v = (new Validator($body))->required(['warehouse_id', 'lines']);

        if (!$v->passes()) {
            Response::error('Datos inválidos', 422, $v->errors());
            return;
        }

        try {
            $service = new PickingService();
            $result = $service->createPickList($body, AuthMiddleware::userId());
            Response::success($result, 'Pick list creada', 201);
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

    /**
     * POST /api/picking/tasks/{task_id}/confirm
     * Confirma el picking de una tarea.
     * Body: { confirmed_qty? }
     */
    public static function confirmPick(array $params): void
    {
        $body = Request::body();

        try {
            $service = new PickingService();
            $result = $service->confirmPick(
                (int) $params['task_id'],
                $body,
                AuthMiddleware::userId()
            );
            Response::success($result, 'Picking confirmado');
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

    /**
     * GET /api/picking/{id}
     */
    public static function show(array $params): void
    {
        $repo = new PickListRepository();
        $doc = $repo->getWithLines((int) $params['id']);
        if (!$doc) {
            Response::error('Pick list no encontrada', 404);
            return;
        }
        Response::success($doc);
    }

    /**
     * GET /api/picking/open/{warehouse_id}
     */
    public static function openLists(array $params): void
    {
        $repo = new PickListRepository();
        Response::success($repo->getOpenPickLists((int) $params['warehouse_id']));
    }

    /**
     * GET /api/picking/packable/{warehouse_id}
     * Pick lists aptas para crear packing (COMPLETED/IN_PROGRESS sin packing activo).
     */
    public static function packableLists(array $params): void
    {
        $repo = new PickListRepository();
        Response::success($repo->getPackablePickLists((int) $params['warehouse_id']));
    }
}
