<?php
// admin/page-delete.php

// Define BASE_PATH se não estiver definido
if (!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(dirname(__FILE__)));
}

// Função de log de emergência caso logInfo não esteja disponível
function emergencyLog($message) {
    file_put_contents(BASE_PATH . '/emergency.log', date('Y-m-d H:i:s') . " - $message\n", FILE_APPEND);
}

// Importações de arquivos necessários com verificação
$requiredFiles = ['config.php', 'db.php', 'functions.php', 'auth.php'];
foreach ($requiredFiles as $file) {
    $path = BASE_PATH . '/includes/' . $file;
    if (!file_exists($path)) {
        emergencyLog("Arquivo não encontrado: $path");
        die("Erro crítico: Arquivo $file não encontrado.");
    }
    try {
        require_once $path;
    } catch (Throwable $e) {
        emergencyLog("Erro ao incluir $file: " . $e->getMessage());
        die("Erro crítico ao incluir $file: " . $e->getMessage());
    }
}

// Verificar autenticação do usuário
try {
    if (!isset($auth) || !is_object($auth) || !method_exists($auth, 'isLoggedIn')) {
        throw new Exception("Objeto \$auth não está definido ou inválido.");
    }

    if (!$auth->isLoggedIn()) {
        logInfo("Usuário não autenticado ao tentar acessar page-delete.php");
        redirect('admin/login.php');
        exit;
    }
} catch (Exception $e) {
    logError("Erro na verificação de autenticação: " . $e->getMessage());
    emergencyLog("Erro na verificação de autenticação: " . $e->getMessage());
    setAlert('Erro de autenticação. Por favor, faça login novamente.', ALERT_ERROR);
    redirect('admin/login.php');
    exit;
}

logInfo("=== INÍCIO DA EXECUÇÃO DE " . basename(__FILE__) . " ===");

// Iniciar sessão se não estiver iniciada
if (session_status() === PHP_SESSION_NONE) {
    try {
        session_start();
    } catch (Exception $e) {
        logError("Erro ao iniciar sessão: " . $e->getMessage());
        setAlert('Erro ao iniciar sessão.', ALERT_ERROR);
        redirect('page-list.php');
        exit;
    }
}

// Verificar CSRF token
if (!isset($_SESSION['csrf_token'])) {
    logError("CSRF token não encontrado na sessão");
    setAlert('Erro de segurança: Token CSRF não encontrado.', ALERT_ERROR);
    redirect('page-list.php');
    exit;
}

$csrfToken = $_SESSION['csrf_token'];

// Log dos dados recebidos via POST
logInfo("Dados recebidos via POST: " . json_encode($_POST));

// Verificar método POST e dados necessários
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'delete' && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $csrfToken) {
    logInfo("CSRF token validado com sucesso");

    // Verificar se selected_pages está presente e é um array
    if (!isset($_POST['selected_pages']) || !is_array($_POST['selected_pages']) || empty($_POST['selected_pages'])) {
        logError("selected_pages não está presente ou é inválido");
        setAlert('ID da página não fornecido.', ALERT_WARNING);
        redirect('page-list.php');
        exit;
    }

    $pageId = intval($_POST['selected_pages'][0]);
    logInfo("ID da página a ser deletada: {$pageId}");

    if ($pageId > 0) {
        try {
            // Iniciar transação
            $db->beginTransaction();
            logInfo("Transação iniciada");

            // Verificar conexão com o banco
            if (!$db->getConnection()) {
                throw new Exception("Conexão com o banco de dados perdida.");
            }

            // Recuperar a imagem associada à página
            $db->query("SELECT featured_image FROM pages WHERE id = :id");
            $db->bind(':id', $pageId, PDO::PARAM_INT);
            $page = $db->single();
            logInfo("Resultado da consulta: " . json_encode($page));

            if (!$page) {
                throw new Exception("Página com ID {$pageId} não encontrada");
            }

            // Deletar a imagem, se existir
            if (!empty($page['featured_image'])) {
                try {
                    deleteImage($page['featured_image']);
                    logInfo("Imagem deletada com sucesso: {$page['featured_image']}");
                } catch (Exception $e) {
                    logError("Erro ao deletar imagem {$page['featured_image']}: " . $e->getMessage());
                    throw new Exception("Falha ao deletar a imagem associada");
                }
            } else {
                logInfo("Nenhuma imagem associada à página ID {$pageId}");
            }

            // Deletar a página do banco de dados
            $db->query("DELETE FROM pages WHERE id = :id");
            $db->bind(':id', $pageId, PDO::PARAM_INT);
            logInfo("Executando DELETE para ID: {$pageId}");
            $affectedRows = $db->execute();
            logInfo("Linhas afetadas pela exclusão: {$affectedRows}");

            if ($affectedRows === 0) {
                throw new Exception("Nenhuma linha foi deletada para o ID {$pageId}");
            }

            // Confirmar transação
            $db->commit();
            logInfo("Transação confirmada");
            setAlert('Página excluída com sucesso!', ALERT_SUCCESS);
            logInfo("Página deletada: ID {$pageId}");

        } catch (Exception $e) {
            // Reverter transação em caso de erro
            if ($db->inTransaction()) {
                $db->rollBack();
                logInfo("Transação revertida devido a erro");
            }
            $errorInfo = $db->errorInfo();
            $errorMsg = "Erro na execução da query: " . $e->getMessage() . " (SQLSTATE: " . $errorInfo[0] . ", Código: " . $errorInfo[1] . ", Mensagem: " . $errorInfo[2] . ")";
            logError($errorMsg);
            setAlert("Erro ao excluir a página: $errorMsg", ALERT_ERROR);
        }
    } else {
        logError("ID da página inválido: {$pageId}");
        setAlert('ID da página inválido.', ALERT_WARNING);
    }
} else {
    $errorMsg = "Requisição inválida ou token CSRF ausente.";
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        $errorMsg .= " Método esperado: POST, recebido: {$_SERVER['REQUEST_METHOD']}";
    }
    if (!isset($_POST['action']) || $_POST['action'] !== 'delete') {
        $errorMsg .= " Ação esperada: delete, recebida: " . ($_POST['action'] ?? 'não definida');
    }
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $csrfToken) {
        $errorMsg .= " CSRF token inválido. Esperado: {$csrfToken}, recebido: " . ($_POST['csrf_token'] ?? 'não definido');
    }
    logError($errorMsg);
    setAlert($errorMsg, ALERT_ERROR);
}

// Redirecionar para a lista de páginas
logInfo("Redirecionando para page-list.php");
redirect('admin/page-list.php');
?>