<?php
/**
 * CatalogoPdfController - Geração de catálogo em PDF
 * Localização: /app/controllers/CatalogoPdfController.php
 *
 * Requer Dompdf instalado via composer:
 *   composer require dompdf/dompdf
 */

class CatalogoPdfController extends Controller
{
    public function index(): void
    {
        $this->requireAdmin();
        $catalogos = $this->model('CatalogoPdf')->listar();
        $categorias = $this->model('Categoria')->all('ordem','ASC');
        $colecoes   = $this->model('Colecao')->all('ordem','ASC');

        $this->view('admin/catalogo_pdf/index', [
            'pageTitle'  => 'Catálogo PDF',
            'catalogos'  => $catalogos,
            'categorias' => $categorias,
            'colecoes'   => $colecoes,
        ], 'admin');
    }

    public function gerar(): void
    {
        $this->requireAdmin();
        $this->validateCsrf();

        $tipo   = $this->input('tipo','completo');          // completo | categoria | colecao
        $filtro = (int)$this->input('filtro_id',0) ?: null;

        // Busca produtos conforme tipo
        $db = Database::getInstance();
        $params = [];
        $sql = "SELECT p.*, c.nome AS categoria_nome, co.nome AS colecao_nome,
                     (SELECT arquivo FROM produto_imagens WHERE produto_id = p.id
                        ORDER BY principal DESC, ordem ASC LIMIT 1) AS imagem_principal
                FROM produtos p
                LEFT JOIN categorias c ON c.id = p.categoria_id
                LEFT JOIN colecoes co ON co.id = p.colecao_id
                WHERE p.ativo = 1";

        $titulo = 'Catálogo Completo';
        if ($tipo === 'categoria' && $filtro) {
            $sql .= " AND p.categoria_id = :f";
            $params[':f'] = $filtro;
            $cat = $db->prepare("SELECT nome FROM categorias WHERE id = :i"); $cat->execute([':i'=>$filtro]);
            $titulo = 'Catálogo ' . ($cat->fetch()['nome'] ?? '');
        } elseif ($tipo === 'colecao' && $filtro) {
            $sql .= " AND p.colecao_id = :f";
            $params[':f'] = $filtro;
            $col = $db->prepare("SELECT nome FROM colecoes WHERE id = :i"); $col->execute([':i'=>$filtro]);
            $titulo = 'Coleção ' . ($col->fetch()['nome'] ?? '');
        }

        $sql .= " ORDER BY p.destaque DESC, p.ordem ASC, p.nome ASC";

        $stmt = $db->prepare($sql);
        $stmt->execute($params);
        $produtos = $stmt->fetchAll();

        if (empty($produtos)) {
            $this->setFlash('error','Nenhum produto encontrado para gerar o catálogo');
            $this->redirect(admin_url('catalogo-pdf'));
            return;
        }

        // Carrega Dompdf
        $autoload = ROOT_PATH . '/vendor/autoload.php';
        if (!file_exists($autoload)) {
            $this->setFlash('error','Dompdf não instalado. Rode: composer require dompdf/dompdf');
            $this->redirect(admin_url('catalogo-pdf'));
            return;
        }
        require_once $autoload;

        $config = config_marca();
        ob_start();
        include VIEWS_PATH . '/pdf/catalogo.php';
        $html = ob_get_clean();

        $options = new \Dompdf\Options();
        $options->set('isRemoteEnabled', true);
        $options->set('isHtml5ParserEnabled', true);
        $options->set('defaultFont', 'DejaVu Sans');

        $dompdf = new \Dompdf\Dompdf($options);
        $dompdf->loadHtml($html, 'UTF-8');
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();

        $pdfOutput = $dompdf->output();
        $arquivo   = 'catalogo-' . date('Ymd-His') . '-' . uniqid() . '.pdf';
        $pasta     = UPLOADS_PATH . '/catalogos';
        if (!is_dir($pasta)) mkdir($pasta, 0755, true);
        $caminho   = $pasta . '/' . $arquivo;
        file_put_contents($caminho, $pdfOutput);

        // Registra histórico
        $this->model('CatalogoPdf')->create([
            'titulo'         => $titulo,
            'arquivo'        => 'catalogos/' . $arquivo,
            'tipo'           => $tipo,
            'filtro_id'      => $filtro,
            'total_produtos' => count($produtos),
            'tamanho_kb'     => (int) round(filesize($caminho) / 1024),
            'gerado_por'     => $_SESSION['admin_id'] ?? null,
        ]);

        // Download direto
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename="' . $arquivo . '"');
        header('Content-Length: ' . filesize($caminho));
        readfile($caminho);
        exit;
    }

    public function baixar(int $id): void
    {
        $this->requireAdmin();
        $cat = $this->model('CatalogoPdf')->find($id);
        if (!$cat) { $this->redirect(admin_url('catalogo-pdf')); return; }

        $caminho = UPLOADS_PATH . '/' . $cat['arquivo'];
        if (!file_exists($caminho)) {
            $this->setFlash('error','Arquivo não encontrado');
            $this->redirect(admin_url('catalogo-pdf'));
            return;
        }

        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename="' . basename($caminho) . '"');
        header('Content-Length: ' . filesize($caminho));
        readfile($caminho);
        exit;
    }

    public function excluir(int $id): void
    {
        $this->requireAdmin();
        $cat = $this->model('CatalogoPdf')->find($id);
        if ($cat) {
            $caminho = UPLOADS_PATH . '/' . $cat['arquivo'];
            if (file_exists($caminho)) @unlink($caminho);
            $this->model('CatalogoPdf')->delete($id);
        }
        $this->redirect(admin_url('catalogo-pdf'));
    }
}
