<?php
// excluir_empresa.php

// 1. INICIA A SESSÃO SEMPRE NO TOPO
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once 'conexao.php'; // Fornece $pdo
require_once 'env.php';     // Carrega $_ENV

// 2. VERIFICA SE O USUÁRIO É ADMINISTRADOR
if (($_SESSION['role'] ?? '') !== 'Administradores' && ($_SESSION['role'] ?? '') !== 'Administrador') {
    $_SESSION['mensagem_login'] = "Acesso negado! Você não tem permissão para realizar esta ação.";
    header("Location: login.php");
    exit();
}

// CHAVE DO TOKEN CSRF - DEVE SER A MESMA USADA EM listar_empresas.php
$csrf_session_key = 'csrf_token_lista_empresa'; // CORRIGIDO: Deve ser 'csrf_token_lista_empresa'

// --- 3. PROTEÇÃO CSRF ---
// O token é gerado em listar_empresas.php e incluído no link de exclusão via GET.
// Utilizamos hash_equals para uma comparação segura de strings (contra ataques de temporização).
if (!isset($_GET['csrf_token']) ||
    !isset($_SESSION[$csrf_session_key]) || // Verifica se o token existe na sessão
    !hash_equals($_SESSION[$csrf_session_key], $_GET['csrf_token'])) { // Compara os tokens

    // Mensagem de erro e redirecionamento em caso de falha na validação CSRF
    $_SESSION['mensagem_listar_empresas'] = "Erro de validação de segurança (CSRF). Ação de exclusão cancelada.";
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
    header("Location: listar_empresas.php");
    exit();
}

// 4. CONSUMIR O TOKEN APÓS O USO BEM-SUCEDIDO
// Após a validação, remova o token da sessão para evitar sua reutilização.
// Isso é uma boa prática de segurança para tokens únicos por requisição.
unset($_SESSION[$csrf_session_key]);


// 5. VERIFICA SE O ID DA EMPRESA FOI FORNECIDO E É VÁLIDO
$id_empresa_excluir = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

if (!$id_empresa_excluir) {
    $_SESSION['mensagem_listar_empresas'] = "ID da empresa não fornecido ou inválido para exclusão.";
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
    header("Location: listar_empresas.php");
    exit(); // Alterado para exit() após redirecionamento
}

// 6. VERIFICA SE A CONEXÃO PDO ESTÁ DISPONÍVEL
if (!$pdo) {
    error_log("Falha ao excluir empresa: conexão PDO não disponível.");
    $_SESSION['mensagem_listar_empresas'] = "Erro crítico de sistema (DB). Não foi possível excluir a empresa.";
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
    header("Location: listar_empresas.php");
    exit();
}

$empresa_nome_para_msg = "ID " . $id_empresa_excluir; // Fallback para nome da empresa
$logotipo_para_deletar = null;

try {
    // 7. BUSCAR DADOS DA EMPRESA (nome e logotipo) antes da exclusão
    $stmt_busca = $pdo->prepare("SELECT nome_empresa, logotipo FROM Empresas WHERE id = ?");
    $stmt_busca->execute([$id_empresa_excluir]);
    $empresa = $stmt_busca->fetch(PDO::FETCH_ASSOC);
    
    if (!$empresa) {
        $_SESSION['mensagem_listar_empresas'] = "Empresa não encontrada para exclusão (ID: {$id_empresa_excluir}).";
        $_SESSION['tipo_mensagem_listar_empresas'] = "warning";
        header("Location: listar_empresas.php");
        exit(); // Alterado para exit() após redirecionamento
    }
    $empresa_nome_para_msg = $empresa['nome_empresa'];
    $logotipo_para_deletar = $empresa['logotipo'];

    // 8. INICIAR TRANSAÇÃO PARA GARANTIR CONSISTÊNCIA DA EXCLUSÃO
    $pdo->beginTransaction();
    
    // 9. EXCLUIR REGISTROS EM TABELAS RELACIONADAS
    // ATENÇÃO: Ajuste os nomes das tabelas e colunas conforme seu banco de dados real.
    // Exemplo: Deletar anúncios pagos associados
    $stmt_del_anuncios_p = $pdo->prepare("DELETE FROM anuncio_pago WHERE empresa_id = ?");
    $stmt_del_anuncios_p->execute([$id_empresa_excluir]);
    // error_log("Anúncios pagos da empresa ID {$id_empresa_excluir} excluídos: " . $stmt_del_anuncios_p->rowCount()); // Para depuração

    // Exemplo: Deletar anúncios gratuitos associados
    // Se a coluna for apenas 'id_empresa', remova a parte 'OR empresa_id = ?'
    $stmt_del_anuncios_g = $pdo->prepare("DELETE FROM anuncio_gratuito WHERE empresa_id = ? OR id_empresa = ?");
    $stmt_del_anuncios_g->execute([$id_empresa_excluir, $id_empresa_excluir]);
    // error_log("Anúncios gratuitos da empresa ID {$id_empresa_excluir} excluídos: " . $stmt_del_anuncios_g->rowCount()); // Para depuração

    // Exemplo: Deletar histórico de anúncios gratuitos associados
    $stmt_del_hist_g = $pdo->prepare("DELETE FROM historico_anuncios_gratuitos WHERE id_empresa = ?");
    $stmt_del_hist_g->execute([$id_empresa_excluir]);
    // error_log("Histórico de anúncios gratuitos da empresa ID {$id_empresa_excluir} excluído: " . $stmt_del_hist_g->rowCount()); // Para depuração

    // 10. EXCLUIR A EMPRESA DA TABELA Empresas
    $stmt_del_empresa = $pdo->prepare("DELETE FROM Empresas WHERE id = ?");
    $stmt_del_empresa->execute([$id_empresa_excluir]);
    
    if ($stmt_del_empresa->rowCount() === 0) {
        // Isso não deveria acontecer se a busca anterior encontrou a empresa.
        // Se acontecer, pode ser um problema de ID ou outra condição.
        throw new Exception("Nenhuma empresa foi efetivamente excluída da tabela Empresas (ID: {$id_empresa_excluir}).");
    }
    
    $pdo->commit(); // Confirma todas as exclusões no banco de dados
    
    // 11. REMOVER O ARQUIVO DE LOGOTIPO DO SERVIDOR, SE EXISTIR
    if (!empty($logotipo_para_deletar)) {
        // Verifica se o caminho do logotipo é uma URL completa ou relativa.
        // É importante que $_SERVER['DOCUMENT_ROOT'] esteja configurado corretamente no seu ambiente.
        $caminho_fisico_logo = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($logotipo_para_deletar, '/');
        
        // Se o logotipo_para_deletar for uma URL completa e não apenas um caminho relativo
        // ex: https://seusite.com/uploads/logo.png
        // Você precisará converter essa URL para o caminho físico no servidor.
        // Esta parte pode precisar de ajuste dependendo de como você armazena os caminhos no BD.
        if (strpos($logotipo_para_deletar, 'http') === 0) { // Se for uma URL completa
             // Tenta extrair o caminho relativo da URL
             $parsed_url = parse_url($logotipo_para_deletar);
             if (isset($parsed_url['path'])) {
                 $caminho_fisico_logo = $_SERVER['DOCUMENT_ROOT'] . $parsed_url['path'];
             } else {
                 error_log("Caminho do logotipo em URL completa não pôde ser parseado para exclusão: {$logotipo_para_deletar}");
                 $caminho_fisico_logo = null; // Impede tentativa de unlink com caminho inválido
             }
        }
        
        if ($caminho_fisico_logo && file_exists($caminho_fisico_logo) && is_writable($caminho_fisico_logo)) {
            if (unlink($caminho_fisico_logo)) {
                error_log("Logotipo {$caminho_fisico_logo} da empresa ID {$id_empresa_excluir} excluído do sistema de arquivos.");
            } else {
                error_log("Falha ao tentar excluir o logotipo {$caminho_fisico_logo} da empresa ID {$id_empresa_excluir}. Verifique as permissões de pasta.");
            }
        } elseif (!empty($logotipo_para_deletar)) {
            // Log apenas se havia um logotipo mas o arquivo não foi encontrado/não é gravável
            error_log("Logotipo '{$logotipo_para_deletar}' (caminho físico: '{$caminho_fisico_logo}') não encontrado ou não gravável para exclusão. ID Empresa: {$id_empresa_excluir}.");
        }
    }
    
    // 12. MENSAGEM DE SUCESSO E LOG DE ACESSO
    $_SESSION['mensagem_listar_empresas'] = "Empresa '" . htmlspecialchars($empresa_nome_para_msg) . "' e seus dados associados foram excluídos com sucesso!";
    $_SESSION['tipo_mensagem_listar_empresas'] = "success";
    
    // Log da ação de exclusão bem-sucedida
    if (isset($_SESSION['id'], $_SESSION['role']) && $pdo) {
        $usuario_id_log = $_SESSION['id'];
        $role_log = $_SESSION['role'];
        $role_map_hist = ['Empresas' => 'empresa', 'Candidatos' => 'candidato', 'Administradores' => 'admin', 'Administrador' => 'admin'];
        $tipo_usuario_log = $role_map_hist[$role_log] ?? 'admin';
        $pagina_acessada_log = "excluir_empresa.php (ID Empresa Excluída: {$id_empresa_excluir}, Nome: " . htmlspecialchars($empresa_nome_para_msg) . ", Sucesso)";
        
        try {
            $stmt_hist = $pdo->prepare("INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())");
            $stmt_hist->execute([$usuario_id_log, $tipo_usuario_log, $pagina_acessada_log]);
        } catch (PDOException $e_log) {
            error_log("Erro ao registrar histórico de acesso de exclusão de empresa: " . $e_log->getMessage());
        }
    }

} catch (PDOException $e) {
    // Em caso de erro no banco de dados, faz rollback da transação
    if ($pdo && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log("Erro PDO ao excluir empresa ID {$id_empresa_excluir}: " . $e->getMessage());
    $_SESSION['mensagem_listar_empresas'] = "Erro de banco de dados ao excluir empresa: " . $e->getMessage();
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
} catch (Exception $e) { // Captura outras exceções (como a que lançamos para "Nenhuma empresa foi efetivamente excluída")
    // Em caso de outras exceções, faz rollback da transação se estiver ativa
    if ($pdo && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log("Erro geral ao excluir empresa ID {$id_empresa_excluir}: " . $e->getMessage());
    $_SESSION['mensagem_listar_empresas'] = "Erro ao excluir empresa: " . $e->getMessage();
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
}

// 13. REDIRECIONA PARA A LISTA DE EMPRESAS
header("Location: listar_empresas.php");
exit();

?>