<?php

namespace WMS\Services;

use WMS\Core\Database;

/**
 * Genera el Acta de recepción en PDF a partir de una agenda cerrada.
 * Usa wkhtmltopdf por shell. El archivo se guarda en /var/www/WMS/storage/actas/.
 */
class ReceptionPdfService
{
    private string $storageDir;

    public function __construct(?string $storageDir = null)
    {
        $this->storageDir = $storageDir ?: '/var/www/WMS/storage/actas';
        if (!is_dir($this->storageDir)) {
            @mkdir($this->storageDir, 0775, true);
        }
    }

    /**
     * Genera el PDF del acta para una agenda. Devuelve path absoluto.
     */
    public function generate(int $agendaId, ?int $userId = null): string
    {
        $db = Database::getConnection();

        $stmt = $db->prepare(
            "SELECT a.id, a.agenda_number, a.warehouse_id, a.status, a.created_at, a.created_by, a.bultos,
                    w.name AS warehouse_name, w.code AS warehouse_code,
                    u.full_name AS created_by_name, u.username AS created_by_username
             FROM reception_agendas a
             LEFT JOIN warehouses w ON w.id = a.warehouse_id
             LEFT JOIN users u ON u.id = a.created_by
             WHERE a.id = ? LIMIT 1"
        );
        $stmt->execute([$agendaId]);
        $agenda = $stmt->fetch(\PDO::FETCH_ASSOC);
        if (!$agenda) {
            throw new \RuntimeException("Agenda {$agendaId} no encontrada");
        }

        $refs = $db->prepare(
            "SELECT id, sap_doc_type, sap_doc_entry, sap_doc_num, supplier_code, supplier_name, status
             FROM reception_agenda_refs WHERE agenda_id = ? ORDER BY id"
        );
        $refs->execute([$agendaId]);
        $refsRows = $refs->fetchAll(\PDO::FETCH_ASSOC);

        $linesStmt = $db->prepare(
            "SELECT l.id, l.line_num, l.item_code, l.item_name, l.expected_qty, l.received_qty,
                    l.batch_number, l.expiry_date, l.supplier_lot, l.status
             FROM reception_agenda_lines l
             WHERE l.agenda_id = ? AND l.ref_id = ? ORDER BY l.line_num"
        );

        $userInfo = null;
        if ($userId) {
            $us = $db->prepare("SELECT id, username, full_name FROM users WHERE id = ?");
            $us->execute([$userId]);
            $userInfo = $us->fetch(\PDO::FETCH_ASSOC);
        }

        $html = $this->renderHtml($agenda, $refsRows, $linesStmt, $userInfo);

        $safeNumber = preg_replace('/[^A-Za-z0-9_\-]/', '_', (string)$agenda['agenda_number']);
        $pdfPath = $this->storageDir . '/' . $safeNumber . '.pdf';
        $htmlPath = $pdfPath . '.html';

        file_put_contents($htmlPath, $html);

        $cmd = sprintf(
            'wkhtmltopdf --quiet --enable-local-file-access ' .
            '--margin-top 12mm --margin-bottom 12mm --margin-left 12mm --margin-right 12mm ' .
            '%s %s 2>&1',
            escapeshellarg($htmlPath),
            escapeshellarg($pdfPath)
        );
        exec($cmd, $out, $rc);
        @unlink($htmlPath);

        if ($rc !== 0 || !file_exists($pdfPath) || filesize($pdfPath) === 0) {
            throw new \RuntimeException('wkhtmltopdf falló: ' . implode("\n", $out));
        }
        return $pdfPath;
    }

    private function renderHtml(array $agenda, array $refs, \PDOStatement $linesStmt, ?array $user): string
    {
        $logoNote = 'COMFAR Paraguay — Sistema WMS';
        $today = date('Y-m-d H:i');
        $css = "body{font-family:Helvetica,Arial,sans-serif;font-size:11px;color:#222}"
             . "h1{font-size:18px;margin:0 0 6px 0;color:#1a3a6a}"
             . "h2{font-size:13px;margin:14px 0 6px 0;color:#1a3a6a;border-bottom:1px solid #c4d4e6;padding-bottom:2px}"
             . ".meta td{padding:2px 8px 2px 0}"
             . "table.lines{width:100%;border-collapse:collapse;margin-top:4px}"
             . "table.lines th,table.lines td{border:1px solid #cfd6e0;padding:3px 5px;font-size:10.5px}"
             . "table.lines th{background:#eef3fb;text-align:left}"
             . ".short{color:#a00;font-weight:bold}"
             . ".over{color:#a06;font-weight:bold}"
             . ".ok{color:#070}"
             . ".sig{margin-top:30px}"
             . ".sig table{width:100%;border-collapse:collapse}"
             . ".sig td{border-top:1px solid #555;padding-top:6px;text-align:center;font-size:11px;width:33%}"
             . ".footer{margin-top:18px;font-size:9px;color:#888;text-align:center;border-top:1px solid #ccc;padding-top:4px}";

        $out  = "<!DOCTYPE html><html><head><meta charset='UTF-8'><style>{$css}</style></head><body>";
        $out .= "<h1>Acta de Recepción de Mercaderías</h1>";
        $out .= "<div style='font-size:10px;color:#666'>{$logoNote} — DINAVISA / BPA</div>";

        $out .= "<table class='meta'>";
        $out .= "<tr><td><b>Agenda:</b></td><td>" . htmlspecialchars($agenda['agenda_number']) . "</td>"
             .  "<td><b>Almacén:</b></td><td>" . htmlspecialchars(($agenda['warehouse_code'] ?? '') . ' — ' . ($agenda['warehouse_name'] ?? '')) . "</td></tr>";
        $out .= "<tr><td><b>Status:</b></td><td>" . htmlspecialchars($agenda['status']) . "</td>"
             .  "<td><b>Creada:</b></td><td>" . htmlspecialchars($agenda['created_at']) . "</td></tr>";
        $out .= "<tr><td><b>Creada por:</b></td><td>" . htmlspecialchars($agenda['created_by_name'] ?? $agenda['created_by_username'] ?? '-') . "</td>"
             .  "<td><b>Cierre/PDF:</b></td><td>{$today}</td></tr>";
        $bultos = ($agenda['bultos'] ?? null);
        $bultosTxt = ($bultos === null || $bultos === '') ? '-' : (string)((int)$bultos);
        $out .= "<tr><td><b>Cantidad de bultos:</b></td><td><b style='font-size:13px'>" . htmlspecialchars($bultosTxt) . "</b></td>"
             .  "<td></td><td></td></tr>";
        $out .= "</table>";

        foreach ($refs as $ref) {
            $linesStmt->execute([(int)$agenda['id'], (int)$ref['id']]);
            $lines = $linesStmt->fetchAll(\PDO::FETCH_ASSOC);
            $out .= "<h2>Referencia: " . htmlspecialchars($ref['sap_doc_type'] ?? 'OC')
                  . " " . htmlspecialchars((string)($ref['sap_doc_num'] ?? $ref['sap_doc_entry']))
                  . " — Proveedor: " . htmlspecialchars(($ref['supplier_code'] ?? '') . ' ' . ($ref['supplier_name'] ?? ''))
                  . " — Status: " . htmlspecialchars($ref['status']) . "</h2>";

            $out .= "<table class='lines'><thead><tr>"
                  . "<th>Ln</th><th>Item</th><th>Descripción</th><th style='text-align:right'>Esperado</th>"
                  . "<th style='text-align:right'>Recibido</th><th>Lote</th><th>Vto</th>"
                  . "<th>Lote prov.</th><th>Status</th></tr></thead><tbody>";
            foreach ($lines as $l) {
                $cls = '';
                if ($l['status'] === 'PARTIAL' || $l['status'] === 'SHORT') $cls = 'short';
                elseif ($l['status'] === 'OVER') $cls = 'over';
                elseif ($l['status'] === 'COMPLETED') $cls = 'ok';
                $out .= "<tr>"
                      . "<td>{$l['line_num']}</td>"
                      . "<td>" . htmlspecialchars((string)$l['item_code']) . "</td>"
                      . "<td>" . htmlspecialchars(mb_substr((string)$l['item_name'], 0, 50)) . "</td>"
                      . "<td style='text-align:right'>" . rtrim(rtrim(number_format((float)$l['expected_qty'],3,'.',''),'0'),'.') . "</td>"
                      . "<td style='text-align:right'>" . rtrim(rtrim(number_format((float)$l['received_qty'],3,'.',''),'0'),'.') . "</td>"
                      . "<td>" . htmlspecialchars((string)($l['batch_number'] ?? '')) . "</td>"
                      . "<td>" . htmlspecialchars((string)($l['expiry_date'] ?? '')) . "</td>"
                      . "<td>" . htmlspecialchars((string)($l['supplier_lot'] ?? '')) . "</td>"
                      . "<td class='{$cls}'>" . htmlspecialchars($l['status']) . "</td>"
                      . "</tr>";
            }
            $out .= "</tbody></table>";
        }

        $closer = $user ? ($user['full_name'] ?? $user['username']) : ($agenda['created_by_name'] ?? '-');
        $out .= "<div class='sig'><table><tr>"
              . "<td>Operador Recepción<br><br>" . htmlspecialchars($closer) . "</td>"
              . "<td>QA / Liberador<br><br>__________________</td>"
              . "<td>Transporte / Proveedor<br><br>__________________</td>"
              . "</tr></table></div>";

        $out .= "<div class='footer'>Documento generado automáticamente por WMS COMFAR — Acta digital firmada por inicio de sesión del operador. "
              . "Conservación según norma GMP/DINAVISA. ID Agenda: " . htmlspecialchars($agenda['agenda_number']) . "</div>";
        $out .= "</body></html>";
        return $out;
    }
}
