<?php
require_once __DIR__ . '/src/auth.php';
require_once __DIR__ . '/src/db.php';
require_once __DIR__ . '/src/history.php';
require_login();

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['contract_id'])) {
    try {
        $contract_id = $_POST['contract_id'];
        $file_path = $_POST['file_path'] ?? '';
        $pdo = get_db_connection();

        // Gerar um token único
        $token = bin2hex(random_bytes(32));

        // Tentar inserir com a nova coluna file_path
        try {
            $stmt = $pdo->prepare("INSERT INTO contract_signatures (contract_id, token, file_path) VALUES (?, ?, ?)");
            $stmt->execute([$contract_id, $token, $file_path]);
        } catch (PDOException $e) {
            // Fallback: se a coluna file_path não existir, inserir sem ela (legado)
            if ($e->getCode() == '42S22') { // Column not found
                $stmt = $pdo->prepare("INSERT INTO contract_signatures (contract_id, token) VALUES (?, ?)");
                $stmt->execute([$contract_id, $token]);
            } else {
                throw $e;
            }
        }

        // PRE-DOWNLOAD DO CONTRATO PARA O CACHE LOCAL
        // Se não foi passado file_path (fallback), buscar o padrão do contrato
        if (empty($file_path)) {
            $stmt_contract = $pdo->prepare("SELECT file_path FROM contracts WHERE id = ?");
            $stmt_contract->execute([$contract_id]);
            $contract = $stmt_contract->fetch();
            $file_path = $contract['file_path'] ?? '';
        }

        if (!empty($file_path)) {
            $local_dir = __DIR__ . '/uploads/signatures_cache/';
            if (!is_dir($local_dir)) {
                @mkdir($local_dir, 0777, true);
                @chmod($local_dir, 0777);
            }

            $local_filename = md5($file_path . $token) . '.pdf';
            $local_filepath = $local_dir . $local_filename;
            
            // Link local para salvar no banco
            $local_url = 'uploads/signatures_cache/' . $local_filename;

            // Baixar usando as credenciais do admin logado
            $remotePath = ltrim($file_path, '/');
            $pathParts = explode('/', $remotePath);
            $encodedPath = implode('/', array_map('rawurlencode', $pathParts));
            $url = rtrim(NC_WEBDAV_URL, '/') . '/' . rawurlencode($_SESSION['username']) . '/' . $encodedPath;

            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_USERPWD, $_SESSION['username'] . ":" . $_SESSION['nc_pass']);
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            $file_content = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            if ($httpCode === 200 && !empty($file_content)) {
                if (file_put_contents($local_filepath, $file_content)) {
                    // Atualizar o registro da assinatura com o caminho local permanente
                    try {
                        $stmt_update = $pdo->prepare("UPDATE contract_signatures SET file_path = ? WHERE token = ?");
                        $stmt_update->execute([$local_url, $token]);
                    } catch (PDOException $e) {
                        // Se a coluna não existir, ignoramos o salvamento do caminho local por enquanto
                        // O sistema ainda funcionará via Nextcloud no sign.php (fallback)
                    }
                }
            }
        }

        log_contract_history($contract_id, 'generate_signature_link', ['token' => $token]);
        $_SESSION['message'] = "Link de assinatura gerado com sucesso! O arquivo foi pré-carregado.";
    } catch (Exception $e) {
        $_SESSION['error'] = "Erro ao processar solicitação: " . $e->getMessage();
    }
}

header('Location: contracts.php');
exit;
