<?php

namespace WMS\Controllers;

use WMS\Core\Request;
use WMS\Core\Response;
use WMS\Middleware\AuthMiddleware;
use WMS\Services\ReportService;

class ReportController
{
    /** GET /api/reports/stock/csv */
    public static function stockCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->stockReport(Request::query('warehouse_id'), Request::query('status'));
            self::sendCsv($csv, 'stock_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/movements/csv */
    public static function movementsCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->movementsReport(Request::query('from'), Request::query('to'), Request::query('type'));
            self::sendCsv($csv, 'movimientos_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/recalls/csv */
    public static function recallsCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->recallsReport(Request::query('status'));
            self::sendCsv($csv, 'recalls_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/expiring/csv */
    public static function expiringCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $days = (int)(Request::query('days') ?: 90);
            $csv = $svc->expiringReport($days);
            self::sendCsv($csv, 'vencimientos_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/temperature/csv */
    public static function temperatureCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->temperatureReport(Request::query('zone_id'), Request::query('from'), Request::query('to'));
            self::sendCsv($csv, 'temperatura_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/inventory/csv */
    public static function inventoryCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->inventoryReport(Request::query('warehouse_id'));
            self::sendCsv($csv, 'inventario_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/available */
    public static function available(array $params): void
    {
        Response::success([
            ['key' => 'stock', 'name' => 'Stock Actual', 'description' => 'Inventario completo por item/lote/ubicacion', 'params' => 'warehouse_id, status'],
            ['key' => 'movements', 'name' => 'Movimientos', 'description' => 'Historial de movimientos de stock', 'params' => 'from, to, type'],
            ['key' => 'recalls', 'name' => 'Recalls DINAVISA', 'description' => 'Retiros de producto con trazabilidad', 'params' => 'status'],
            ['key' => 'expiring', 'name' => 'Vencimientos Proximos', 'description' => 'Productos proximos a vencer', 'params' => 'days (default 90)'],
            ['key' => 'temperature', 'name' => 'Temperatura', 'description' => 'Lecturas de temperatura por zona', 'params' => 'zone_id, from, to'],
            ['key' => 'inventory', 'name' => 'Inventario Valorizado', 'description' => 'Stock con detalle de almacen/ubicacion', 'params' => 'warehouse_id'],
            ['key' => 'transfer-requests', 'name' => 'Solicitudes de Traslado', 'description' => 'Solicitudes de Traslado SAP (OWTQ) importadas', 'params' => 'status'],
        ]);
    }

    private static function sendCsv(string $csv, string $filename): void
    {
        // Clear any previous output
        if (ob_get_level()) ob_end_clean();

        // Set CSV headers
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
        header('Cache-Control: no-cache, no-store, must-revalidate');
        header('Pragma: no-cache');
        header('Expires: 0');
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Headers: Content-Type, Authorization');
        header('Access-Control-Expose-Headers: Content-Disposition');

        echo "\xEF\xBB\xBF"; // UTF-8 BOM for Excel
        echo $csv;
        exit;
    }

    /** GET /api/reports/audit-trail/csv */
    public static function auditTrailCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->auditTrailReport(Request::query('from'), Request::query('to'));
            self::sendCsv($csv, 'audit_trail_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/batch-trace/csv?batch= */
    public static function batchTraceCsv(array $params): void
    {
        try {
            $batch = Request::query('batch');
            if (!$batch) { Response::error('Parametro batch requerido', 400); return; }
            $svc = new ReportService();
            $csv = $svc->batchTraceReport($batch);
            self::sendCsv($csv, 'trazabilidad_lote_' . $batch . '_' . date('Ymd'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/access-log/csv */
    public static function accessLogCsv(array $params): void
    {
        try {
            $svc = new ReportService();
            $csv = $svc->accessLogReport(Request::query('from'), Request::query('to'));
            self::sendCsv($csv, 'log_accesos_' . date('Ymd_His'));
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }

    /** GET /api/reports/{key}/data - Returns report data as JSON */
    public static function getData(array $params): void
    {
        try {
            $svc = new ReportService();
            $key = $params['key'] ?? '';
            $data = [];
            switch ($key) {
                case 'stock': $data = $svc->stockData(Request::query('warehouse_id'), Request::query('status')); break;
                case 'movements': $data = $svc->movementsData(Request::query('from'), Request::query('to'), Request::query('type')); break;
                case 'recalls': $data = $svc->recallsData(Request::query('status')); break;
                case 'expiring': $data = $svc->expiringData((int)(Request::query('days') ?: 90)); break;
                case 'temperature': $data = $svc->temperatureData(Request::query('zone_id'), Request::query('from'), Request::query('to')); break;
                case 'inventory': $data = $svc->inventoryData(Request::query('warehouse_id')); break;
                case 'audit-trail': $data = $svc->auditTrailData(Request::query('from'), Request::query('to')); break;
                case 'access-log': $data = $svc->accessLogData(Request::query('from'), Request::query('to')); break;
                case 'batch-trace':
                    $batch = Request::query('batch');
                    if (!$batch) { Response::error('Parametro batch requerido', 400); return; }
                    $data = $svc->batchTraceData($batch); break;
                case 'transfer-requests': $data = $svc->transferRequestsData(Request::query('status')); break;
                default: Response::error('Reporte no encontrado', 404); return;
            }
            Response::success($data);
        } catch (\RuntimeException $e) { Response::error($e->getMessage()); }
    }
}