<?php
require_once __DIR__ . '/config/config.php';
require_once __DIR__ . '/src/db.php';
require_once __DIR__ . '/src/history.php';

// Forçar limpeza de cache do navegador para evitar erros antigos
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

// Iniciar sessão se não estiver iniciada
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$token = $_GET['token'] ?? '';

if (empty($token)) {
    die("Token de assinatura inválido.");
}

$pdo = get_db_connection();

$stmt = $pdo->prepare("SELECT cs.*, c.title FROM contract_signatures cs JOIN contracts c ON cs.contract_id = c.id WHERE cs.token = ?");
$stmt->execute([$token]);
$signature_data = $stmt->fetch();

if (!$signature_data) {
    die("Link de assinatura não encontrado ou expirado.");
}

// Limpeza de cache antigo (arquivos com mais de 24 horas)
$temp_dir = __DIR__ . '/temp_view/';
if (is_dir($temp_dir)) {
    foreach (glob($temp_dir . "*.pdf") as $file) {
        if (time() - filemtime($file) > 86400) {
            @unlink($file);
        }
    }
}

$contract_id = $signature_data['contract_id'];
$contract_title = $signature_data['title'];
$contract_file_path = !empty($signature_data['file_path']) ? $signature_data['file_path'] : null;

// Fallback: se o file_path da assinatura estiver vazio, tenta o do contrato original
if (empty($contract_file_path)) {
    $stmt_c = $pdo->prepare("SELECT file_path FROM contracts WHERE id = ?");
    $stmt_c->execute([$contract_id]);
    $contract_orig = $stmt_c->fetch();
    $contract_file_path = $contract_orig['file_path'] ?? null;
}

$is_signed = $signature_data['is_signed'];

$message = '';

// Se o usuário estiver logado, usamos o header normal. Caso contrário, apenas os estilos básicos.
$is_public_access = !isset($_SESSION['user_id']);

// Lógica para visualização local (Bypass Nextcloud)
$view_url = '';
if ($contract_file_path) {
    // Se o caminho já for um arquivo local (começa com uploads/), usamos direto
    if (strpos($contract_file_path, 'uploads/') === 0) {
        $view_url = $contract_file_path;
    } else {
        // Fallback: se for caminho do Nextcloud, tentamos ver se existe no cache local
        $local_cache_path = 'uploads/signatures_cache/' . md5($contract_file_path . $token) . '.pdf';
        if (file_exists(__DIR__ . '/' . $local_cache_path)) {
            $view_url = $local_cache_path;
        } else {
            // Se não existir, chamamos o serve_file.php (exige chave de admin ativa)
            $view_url = "serve_file.php?path=" . urlencode($contract_file_path) . "&token=" . urlencode($token);
        }
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$is_signed) {
    $signer_name = $_POST['signer_name'] ?? '';
    $signer_email = $_POST['signer_email'] ?? '';
    $signature_image = $_POST['signature_image'] ?? '';
    $signer_ip = $_SERVER['REMOTE_ADDR'];
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    if (empty($signer_name) || empty($signer_email) || empty($signature_image)) {
        $message = "<div class='alert alert-danger'>Por favor, preencha seus dados e faça sua assinatura.</div>";
    } else {
        try {
            $update_stmt = $pdo->prepare("UPDATE contract_signatures SET is_signed = TRUE, signed_at = NOW(), signer_ip = ?, signer_name = ?, signer_email = ?, signature_image = ?, user_agent = ? WHERE token = ?");
            if ($update_stmt->execute([$signer_ip, $signer_name, $signer_email, $signature_image, $user_agent, $token])) {
                log_contract_history($contract_id, 'sign', [
                    'signer_name' => $signer_name,
                    'signer_email' => $signer_email,
                    'signer_ip' => $signer_ip,
                    'token' => $token
                ], null, $signer_name); 
                
                // Recarregar os dados para exibir corretamente na tela
                $stmt->execute([$token]);
                $signature_data = $stmt->fetch();
                $is_signed = $signature_data['is_signed'];
                
                $message = "<div class='alert alert-success'>Contrato assinado com sucesso!</div>";
            } else {
                $message = "<div class='alert alert-danger'>Erro ao registrar a assinatura no banco de dados.</div>";
            }
        } catch (PDOException $e) {
            $message = "<div class='alert alert-danger'>Erro de servidor ao salvar assinatura: " . htmlspecialchars($e->getMessage()) . "</div>";
        }
    }
}

if (!$is_public_access) {
    require_once __DIR__ . '/templates/header.php';
} else {
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Assinatura de Contrato - <?= htmlspecialchars($contract_title) ?></title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
    <link rel="stylesheet" href="style.css">
</head>
<body class="bg-light">
<?php } ?>

<div class="container mt-5 mb-5">
    <div class="text-center mb-4">
        <h2 class="fw-bold text-primary">Assinatura Digital</h2>
        <p class="text-muted">Imaculada Rede de Educação</p>
    </div>
    <div class="card">
        <div class="card-header">
            <h3>Assinar Contrato: <?= htmlspecialchars($contract_title) ?></h3>
        </div>
        <div class="card-body">
            <?= $message ?>

<?php if ($is_signed): ?>
                <div class="alert alert-success text-center py-4">
                    <i class="fas fa-check-circle fa-3x mb-3"></i>
                    <h4>Contrato Assinado!</h4>
                    <p class="mb-0">Assinado em <?= date('d/m/Y H:i', strtotime($signature_data['signed_at'])) ?> por <?= htmlspecialchars($signature_data['signer_name']) ?>.</p>
                </div>
                
                <div class="row mt-4">
                    <div class="col-md-6">
                        <h6>Dados do Assinante</h6>
                        <table class="table table-sm table-bordered">
                            <tr><th>E-mail</th><td><?= htmlspecialchars($signature_data['signer_email']) ?></td></tr>
                            <tr><th>IP</th><td><?= htmlspecialchars($signature_data['signer_ip']) ?></td></tr>
                            <tr><th>Navegador</th><td class="small"><?= htmlspecialchars($signature_data['user_agent']) ?></td></tr>
                        </table>
                    </div>
                    <div class="col-md-6 text-center">
                        <h6>Sua Assinatura</h6>
                        <div class="border p-2 bg-light rounded">
                            <img src="<?= $signature_data['signature_image'] ?>" class="img-fluid" style="max-height: 150px;">
                        </div>
                    </div>
                </div>

                <div class="text-center mt-4">
                    <?php if ($contract_file_path): ?>
                        <a href="view_with_signature.php?path=<?= urlencode($contract_file_path) ?>&contract_id=<?= $contract_id ?>&token=<?= urlencode($token) ?>" target="_blank" class="btn btn-primary btn-lg"><i class="fas fa-file-pdf me-2"></i> Visualizar Contrato com Selo de Assinatura</a>
                        <p class="text-muted small mt-2">O documento agora contém um selo digital de autenticidade no topo de cada página.</p>
                    <?php endif; ?>
                </div>
            <?php else: ?>
                <div class="alert alert-info small mb-4">
                    <i class="fas fa-info-circle me-1"></i> Por favor, revise o documento e desenhe sua assinatura no campo abaixo.
                </div>
                
                <?php if ($contract_file_path): ?>
                    <div class="mb-4 text-center">
                        <?php 
                        // Cache busting para evitar que o navegador mostre erros antigos
                        $cache_bust = time();
                        $final_url = $view_url . (strpos($view_url, '?') === false ? "?v=" : "&v=") . $cache_bust;
                        ?>
                        <a href="<?= $final_url ?>" target="_blank" class="btn btn-outline-primary mb-3"><i class="fas fa-external-link-alt me-1"></i> Abrir Contrato em Nova Aba</a>
                        
                        <div class="ratio ratio-16x9 border rounded shadow-sm bg-white" style="height: 600px;">
                            <iframe src="<?= $final_url ?>#toolbar=0" allow="autoplay"></iframe>
                        </div>
                        <p class="text-muted small mt-2"><i class="fas fa-info-circle me-1"></i> Caso o documento não apareça acima, clique no botão para abrir em uma nova aba.</p>
                    </div>
                <?php endif; ?>

                <form method="POST" id="signature-form">
                    <div class="row">
                        <div class="col-md-6 mb-3">
                            <label for="signer_name" class="form-label fw-bold">Seu Nome Completo</label>
                            <input type="text" class="form-control" id="signer_name" name="signer_name" required placeholder="Digite seu nome completo">
                        </div>
                        <div class="col-md-6 mb-3">
                            <label for="signer_email" class="form-label fw-bold">Seu E-mail</label>
                            <input type="email" class="form-control" id="signer_email" name="signer_email" required placeholder="seu@email.com">
                        </div>
                    </div>

                    <div class="mb-3">
                        <label class="form-label fw-bold">Desenhe sua Assinatura Abaixo</label>
                        <div class="signature-container border rounded bg-white" style="position: relative; height: 250px;">
                            <canvas id="signature-pad" style="width: 100%; height: 100%; touch-action: none; cursor: crosshair;"></canvas>
                            <div style="position: absolute; bottom: 10px; right: 10px;">
                                <button type="button" id="clear-signature" class="btn btn-sm btn-outline-danger"><i class="fas fa-eraser me-1"></i> Limpar</button>
                                <button type="button" id="undo-signature" class="btn btn-sm btn-outline-secondary"><i class="fas fa-undo me-1"></i> Desfazer</button>
                            </div>
                        </div>
                        <input type="hidden" id="signature_image" name="signature_image">
                    </div>

                    <div class="text-center mt-4">
                        <button type="submit" id="submit-btn" class="btn btn-success btn-lg px-5">
                            <i class="fas fa-file-signature me-1"></i> Confirmar e Assinar Agora
                        </button>
                        <div id="loading-spinner" class="mt-3" style="display:none;">
                            <div class="spinner-border text-success" role="status">
                                <span class="visually-hidden">Enviando...</span>
                            </div>
                            <p class="text-success small mt-1">Processando sua assinatura, por favor aguarde...</p>
                        </div>
                    </div>
                </form>

                <script>
                document.addEventListener('DOMContentLoaded', function() {
                    const canvas = document.getElementById('signature-pad');
                    const ctx = canvas.getContext('2d');
                    const clearBtn = document.getElementById('clear-signature');
                    const undoBtn = document.getElementById('undo-signature');
                    const form = document.getElementById('signature-form');
                    const signatureInput = document.getElementById('signature_image');
                    const submitBtn = document.getElementById('submit-btn');
                    const loadingSpinner = document.getElementById('loading-spinner');
                    
                    let drawing = false;
                    let history = [];

                    // Ajustar resolução do canvas com limite para não gerar arquivos gigantes
                    let currentRatio = 1;
                    function resizeCanvas() {
                        currentRatio = Math.min(window.devicePixelRatio || 1, 2); 
                        canvas.width = canvas.offsetWidth * currentRatio;
                        canvas.height = canvas.offsetHeight * currentRatio;
                        ctx.scale(currentRatio, currentRatio);
                        ctx.lineCap = 'round';
                        ctx.lineWidth = 3;
                        ctx.strokeStyle = '#000000';
                        clearCanvas();
                    }

                    function clearCanvas() {
                        ctx.fillStyle = "#ffffff"; 
                        ctx.fillRect(0, 0, canvas.width / currentRatio, canvas.height / currentRatio);
                        history = [];
                    }

                    window.addEventListener('resize', resizeCanvas);
                    resizeCanvas();

                    function getPos(e) {
                        const rect = canvas.getBoundingClientRect();
                        const clientX = e.touches ? e.touches[0].clientX : e.clientX;
                        const clientY = e.touches ? e.touches[0].clientY : e.clientY;
                        return {
                            x: clientX - rect.left,
                            y: clientY - rect.top
                        };
                    }

                    function startDrawing(e) {
                        drawing = true;
                        const pos = getPos(e);
                        ctx.beginPath();
                        ctx.moveTo(pos.x, pos.y);
                        e.preventDefault();
                    }

                    function draw(e) {
                        if (!drawing) return;
                        const pos = getPos(e);
                        ctx.lineTo(pos.x, pos.y);
                        ctx.stroke();
                        e.preventDefault();
                    }

                    function saveToHistory() {
                        history.push(canvas.toDataURL('image/jpeg', 0.5)); // Salva em JPEG comprimido para o histórico
                        if (history.length > 10) history.shift(); // Limita o histórico
                    }

                    function stopDrawing() {
                        if (drawing) {
                            drawing = false;
                            saveToHistory();
                        }
                    }

                    canvas.addEventListener('mousedown', startDrawing);
                    canvas.addEventListener('mousemove', draw);
                    canvas.addEventListener('mouseup', stopDrawing);
                    canvas.addEventListener('mouseleave', stopDrawing);

                    canvas.addEventListener('touchstart', startDrawing);
                    canvas.addEventListener('touchmove', draw);
                    canvas.addEventListener('touchend', stopDrawing);

                    clearBtn.addEventListener('click', clearCanvas);
                    
                    undoBtn.addEventListener('click', function() {
                        if (history.length > 0) {
                            history.pop();
                            ctx.fillStyle = "#ffffff";
                            ctx.fillRect(0, 0, canvas.width / currentRatio, canvas.height / currentRatio);
                            if (history.length > 0) {
                                const img = new Image();
                                img.src = history[history.length - 1];
                                img.onload = function() {
                                    ctx.drawImage(img, 0, 0, canvas.width / currentRatio, canvas.height / currentRatio);
                                };
                            }
                        }
                    });

                    form.addEventListener('submit', function(e) {
                        // Verificar se o canvas foi desenhado (não é apenas o fundo branco)
                        if (history.length === 0) {
                            alert('Por favor, faça sua assinatura antes de confirmar.');
                            e.preventDefault();
                            return;
                        }

                        // Mostrar loading e desabilitar botão
                        submitBtn.style.display = 'none';
                        loadingSpinner.style.display = 'block';

                        // Converter para JPEG com compressão para reduzir drasticamente o tamanho do POST
                        // Isso resolve o erro de conexão/timeout em conexões lentas ou limites de servidor
                        signatureInput.value = canvas.toDataURL('image/jpeg', 0.6);
                    });
                });
                </script>
            <?php endif; ?>
        </div>
    </div>
</div>

<?php 
if (!$is_public_access) {
    require_once __DIR__ . '/templates/footer.php'; 
} else {
?>
    <div class="text-center mt-4 text-muted small">
        &copy; <?= date('Y') ?> Imaculada Rede de Educação - Sistema de Gestão de Contratos
    </div>
</body>
</html>
<?php } ?>
