<?php

namespace WMS\Controllers;

use WMS\Core\Request;
use WMS\Core\Response;
use WMS\Middleware\AuthMiddleware;
use WMS\Services\PackingService;
use WMS\Repositories\PackingRepository;
use WMS\Helpers\Validator;

class PackingController
{
    /**
     * POST /api/packing
     * Crea una orden de empaque desde pick list completada.
     * Body: { pick_list_id, notes? }
     */
    public static function create(array $params): void
    {
        $body = Request::body();
        $v = (new Validator($body))->required(['pick_list_id']);

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

        try {
            $service = new PackingService();
            $result = $service->createPackingOrder($body, AuthMiddleware::userId());
            Response::success($result, 'Orden de empaque creada', 201);
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

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

    /**
     * GET /api/packing/pending/{warehouse_id}
     */
    public static function pending(array $params): void
    {
        $repo = new PackingRepository();
        Response::success($repo->getPendingByWarehouse((int) $params['warehouse_id']));
    }

    /**
     * POST /api/packing/{id}/scan
     * Escanea un item para verificación.
     * Body: { item_code? | barcode? }
     */
    public static function scanItem(array $params): void
    {
        $body = Request::body();

        try {
            $service = new PackingService();
            $result = $service->scanItem((int) $params['id'], $body);
            Response::success($result, 'Item verificado');
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

    /**
     * POST /api/packing/{id}/pack-line/{line_num}
     * Confirma el empaque de una línea.
     * Body: { quantity?, container_id?, container_code? }
     */
    public static function packLine(array $params): void
    {
        $body = Request::body();

        try {
            $service = new PackingService();
            $result = $service->packLine(
                (int) $params['id'],
                (int) $params['line_num'],
                $body,
                AuthMiddleware::userId()
            );
            Response::success($result, 'Línea empacada');
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

    /**
     * POST /api/packing/{id}/complete
     * Completa la orden de empaque y crea DeliveryNote en SAP.
     */
    public static function complete(array $params): void
    {
        try {
            $service = new PackingService();
            $result = $service->completePacking(
                (int) $params['id'],
                AuthMiddleware::userId()
            );
            Response::success($result, 'Empaque completado');
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }

    /**
     * GET /api/packing/{id}/customer-containers
     * Devuelve otros contenedores del mismo cliente para esta orden de packing.
     */
    public static function customerContainers(array $params): void
    {
        try {
            $service = new PackingService();
            $result = $service->getCustomerContainers((int) $params['id']);
            Response::success($result, 'Contenedores del cliente');
        } catch (\RuntimeException $e) {
            Response::error($e->getMessage());
        }
    }
}
