<?php
namespace Modules\GestorContratos\Services;

use Exception;

/**
 * Serviço para geração de PDF de contratos
 */
class PdfService {
    private string $tenantId;

    public function __construct(string $tenantId) {
        $this->tenantId = $tenantId;
    }

    /**
     * Gera PDF do contrato
     */
    public function gerarPdf(int $contratoId, bool $incluirAssinaturas = true): string {
        try {
            $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant($this->tenantId);

            // Buscar contrato
            $stmt = $pdo->prepare('
                SELECT c.*, 
                       cm.nome as modelo_nome
                FROM contratos c
                LEFT JOIN contratos_modelos cm ON c.modelo_id = cm.id
                WHERE c.id = ? AND c.tenant_id = ?
            ');
            $stmt->execute([$contratoId, $this->tenantId]);
            $contrato = $stmt->fetch(\PDO::FETCH_ASSOC);

            if (!$contrato) {
                throw new Exception('Contrato não encontrado');
            }

            // Buscar signatários se necessário
            $signatarios = [];
            if ($incluirAssinaturas) {
                $stmt = $pdo->prepare('
                    SELECT * FROM contratos_signatarios
                    WHERE contrato_id = ?
                    ORDER BY ordem ASC
                ');
                $stmt->execute([$contratoId]);
                $signatarios = $stmt->fetchAll(\PDO::FETCH_ASSOC);
            }

            // Gerar HTML completo
            $html = $this->gerarHtmlCompleto($contrato, $signatarios);

            // Converter HTML para PDF usando TCPDF ou DomPDF
            return $this->converterHtmlParaPdf($html, $contrato['numero']);
        } catch (Exception $e) {
            throw new Exception('Erro ao gerar PDF: ' . $e->getMessage());
        }
    }

    /**
     * Gera HTML completo do contrato com assinaturas
     */
    private function gerarHtmlCompleto(array $contrato, array $signatarios): string {
        $html = '<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style>
        body {
            font-family: Arial, sans-serif;
            font-size: 12px;
            line-height: 1.6;
            margin: 40px;
            color: #333;
        }
        .header {
            text-align: center;
            margin-bottom: 30px;
            border-bottom: 2px solid #333;
            padding-bottom: 20px;
        }
        .header h1 {
            margin: 0;
            font-size: 18px;
            color: #333;
        }
        .header .numero {
            font-size: 14px;
            color: #666;
            margin-top: 10px;
        }
        .content {
            margin: 30px 0;
        }
        .assinaturas {
            margin-top: 60px;
            page-break-inside: avoid;
        }
        .assinatura {
            margin: 30px 0;
            padding: 20px;
            border-top: 1px solid #ddd;
        }
        .assinatura .nome {
            font-weight: bold;
            margin-bottom: 5px;
        }
        .assinatura .data {
            font-size: 10px;
            color: #666;
        }
        .assinatura .imagem {
            margin: 10px 0;
            max-width: 200px;
        }
        .footer {
            margin-top: 40px;
            padding-top: 20px;
            border-top: 1px solid #ddd;
            font-size: 10px;
            color: #666;
            text-align: center;
        }
        @media print {
            body { margin: 20px; }
        }
    </style>
</head>
<body>
    <div class="header">
        <h1>' . htmlspecialchars($contrato['titulo']) . '</h1>
        <div class="numero">Contrato Nº ' . htmlspecialchars($contrato['numero']) . '</div>
    </div>
    
    <div class="content">
        ' . $contrato['conteudo_html'] . '
    </div>';

        // Adicionar assinaturas
        if (!empty($signatarios)) {
            $html .= '<div class="assinaturas">';
            foreach ($signatarios as $signatario) {
                if ($signatario['status'] === 'assinado') {
                    $html .= '<div class="assinatura">
                        <div class="nome">' . htmlspecialchars($signatario['nome']) . '</div>
                        <div class="cpf">' . htmlspecialchars($signatario['cpf_cnpj'] ?? '') . '</div>';
                    
                    if ($signatario['assinatura_imagem']) {
                        $html .= '<div class="imagem">
                            <img src="data:image/png;base64,' . htmlspecialchars($signatario['assinatura_imagem']) . '" alt="Assinatura" />
                        </div>';
                    }
                    
                    $dataAssinatura = $signatario['data_assinatura'] 
                        ? date('d/m/Y H:i', strtotime($signatario['data_assinatura']))
                        : '';
                    
                    $html .= '<div class="data">Assinado em: ' . $dataAssinatura . '</div>
                    </div>';
                }
            }
            $html .= '</div>';
        }

        $html .= '<div class="footer">
        <p>Documento gerado em ' . date('d/m/Y H:i') . '</p>
        <p>Este documento possui validade jurídica conforme Lei 14.063/2020</p>
    </div>
</body>
</html>';

        return $html;
    }

    /**
     * Converte HTML para PDF
     */
    private function converterHtmlParaPdf(string $html, string $nomeArquivo): string {
        // Verificar se TCPDF está disponível
        if (class_exists('TCPDF')) {
            return $this->gerarPdfComTcpdf($html, $nomeArquivo);
        }
        
        // Verificar se DomPDF está disponível
        if (class_exists('Dompdf\Dompdf')) {
            return $this->gerarPdfComDompdf($html, $nomeArquivo);
        }

        // Fallback: retornar HTML (pode ser convertido no frontend)
        return $html;
    }

    /**
     * Gera PDF usando TCPDF
     */
    private function gerarPdfComTcpdf(string $html, string $nomeArquivo): string {
        $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
        
        $pdf->SetCreator('GestorEasy ERP');
        $pdf->SetAuthor('GestorEasy');
        $pdf->SetTitle('Contrato ' . $nomeArquivo);
        $pdf->SetSubject('Contrato');
        
        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        
        $pdf->AddPage();
        $pdf->writeHTML($html, true, false, true, false, '');
        
        return $pdf->Output('', 'S'); // Retorna como string
    }

    /**
     * Gera PDF usando DomPDF
     */
    private function gerarPdfComDompdf(string $html, string $nomeArquivo): string {
        $dompdf = new \Dompdf\Dompdf();
        $dompdf->loadHtml($html);
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();
        
        return $dompdf->output();
    }

    /**
     * Salva PDF no storage
     */
    public function salvarPdf(int $contratoId, string $conteudoPdf): string {
        $storageDir = __DIR__ . '/../../../../storage/contratos/' . $this->tenantId;
        if (!is_dir($storageDir)) {
            mkdir($storageDir, 0755, true);
        }

        $nomeArquivo = 'contrato_' . $contratoId . '_' . date('YmdHis') . '.pdf';
        $caminhoCompleto = $storageDir . '/' . $nomeArquivo;

        file_put_contents($caminhoCompleto, $conteudoPdf);

        // Registrar no banco
        $pdo = \Gestoreasy\Core\Tenant\ConnectionManager::forTenant($this->tenantId);
        $stmt = $pdo->prepare('
            INSERT INTO contratos_anexos (contrato_id, nome_arquivo, tipo_arquivo, tamanho, caminho, tipo)
            VALUES (?, ?, ?, ?, ?, "certificado")
        ');
        $stmt->execute([
            $contratoId,
            $nomeArquivo,
            'application/pdf',
            strlen($conteudoPdf),
            $caminhoCompleto,
        ]);

        return $caminhoCompleto;
    }
}

