<?php
/**
 * ASISMA CRM - PDF de cotizaciones de SERVICIO (plantilla premium)
 *
 * Imprime la página pública de la cotización a PDF con Puppeteer (patrón del
 * OPS: node + headless Chrome). Configurable en config_sistema (grupo pdf):
 *   PDF_NODE_BIN     binario de node (default "node")
 *   PDF_NODE_PATH    NODE_PATH con puppeteer instalado
 *   PDF_URL_INTERNA  URL base alternativa si APP_URL no resuelve localmente
 * Los PDF quedan en storage/pdf/cotizaciones/ (no público).
 * Si node/puppeteer fallan devuelve false: quien llama degrada a solo-link.
 */
class PdfServicioHelper {

    public static function rutaPdf($hash) {
        return self::directorio() . '/cotiz_' . preg_replace('/[^a-f0-9]/', '', $hash) . '.pdf';
    }

    private static function directorio() {
        $dir = ROOT_DIR . '/storage/pdf/cotizaciones';
        if (!is_dir($dir)) {
            @mkdir($dir, 0775, true);
        }
        return $dir;
    }

    private static function config() {
        $db = Database::getInstance();
        $cfg = array('PDF_NODE_BIN' => 'node', 'PDF_NODE_PATH' => '', 'PDF_URL_INTERNA' => '', 'PDF_CACHE_DIR' => '');
        $filas = $db->fetchAll("SELECT clave, valor FROM config_sistema WHERE clave IN ('PDF_NODE_BIN', 'PDF_NODE_PATH', 'PDF_URL_INTERNA', 'PDF_CACHE_DIR')");
        foreach ($filas as $fila) {
            if (trim($fila['valor']) !== '') $cfg[$fila['clave']] = trim($fila['valor']);
        }
        return $cfg;
    }

    /**
     * Genera (o reutiliza) el PDF de una cotización por su hash.
     * $regenerar = true fuerza una captura nueva.
     * Devuelve la ruta local del PDF o false si no se pudo generar.
     */
    public static function generar($hash, $regenerar = false) {
        $rutaPdf = self::rutaPdf($hash);
        if (!$regenerar && file_exists($rutaPdf) && filesize($rutaPdf) > 1000) {
            return $rutaPdf;
        }

        $cfg = self::config();
        $urlBase = $cfg['PDF_URL_INTERNA'] !== '' ? rtrim($cfg['PDF_URL_INTERNA'], '/') : APP_URL;
        $url = $urlBase . '/cotizaciones/publica?h=' . $hash;

        // El dominio del CRM debe resolver a este mismo servidor para Puppeteer
        $hostLocal = parse_url(APP_URL, PHP_URL_HOST);

        $script = ROOT_DIR . '/app/scripts/generar_pdf.js';
        if (!file_exists($script)) {
            error_log('PdfServicioHelper: no existe ' . $script);
            return false;
        }

        $comando = '';
        if ($cfg['PDF_NODE_PATH'] !== '') {
            // set VAR=... && cmd  (Windows); el CRM lee el node_modules configurado
            $comando .= 'set NODE_PATH=' . $cfg['PDF_NODE_PATH'] . '&& ';
        }
        if ($cfg['PDF_CACHE_DIR'] !== '') {
            // Apache corre como SYSTEM: Puppeteer buscaría Chrome en el cache de
            // systemprofile; se apunta al cache donde Chrome está instalado
            $comando .= 'set PUPPETEER_CACHE_DIR=' . $cfg['PDF_CACHE_DIR'] . '&& ';
        }
        $comando .= escapeshellarg($cfg['PDF_NODE_BIN']) . ' ' . escapeshellarg($script) . ' '
            . escapeshellarg($url) . ' ' . escapeshellarg($rutaPdf) . ' ' . escapeshellarg($hostLocal)
            . ' 2>&1';

        $salida = shell_exec($comando);

        if (file_exists($rutaPdf) && filesize($rutaPdf) > 1000) {
            return $rutaPdf;
        }
        error_log('PdfServicioHelper: fallo la generación del PDF. Salida: ' . substr((string)$salida, 0, 500));
        return false;
    }
}
