<?php
// processar_editar_anuncio-pago.php

// ---------------------------------------------------------------------------
// ETAPA 1: HABILITAR EXIBIÇÃO DE ERROS (APENAS PARA DEPURAÇÃO)
// REMOVA OU COMENTE ESTAS DUAS LINHAS EM AMBIENTE DE PRODUÇÃO
error_reporting(E_ALL);
ini_set('display_errors', 1);
// ---------------------------------------------------------------------------

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// ---------------------------------------------------------------------------
// ETAPA 2: LOGS INICIAIS (APENAS PARA DEPURAÇÃO)
error_log("--- [INÍCIO DEBUG] processar_editar_anuncio_pago.php ---");
error_log("[DEBUG] \$_POST: " . print_r($_POST, true));
error_log("[DEBUG] \$_FILES: " . print_r($_FILES, true));
error_log("[DEBUG] \$_SESSION ID: " . ($_SESSION['id'] ?? 'NÃO DEFINIDO'));
error_log("[DEBUG] \$_SESSION Role: " . ($_SESSION['role'] ?? 'NÃO DEFINIDO'));
// ---------------------------------------------------------------------------

// ---------------------------------------------------------------------------
// ETAPA 3: INCLUSÃO DE ARQUIVOS ESSENCIAIS

require_once 'funcoes_slug.php'; 
require_once 'conexao.php'; // Deve fornecer a variável global $pdo
require_once 'env.php';      // Deve carregar as variáveis $_ENV
// ---------------------------------------------------------------------------


// --- Verificações de Segurança e Autorização ---
if (!isset($_SESSION['id'], $_SESSION['role'])) {
    $_SESSION['mensagem_login_redirect'] = "Acesso restrito. Faça login para continuar.";
    error_log("[AUTH FALHA] Usuário não logado ou sem role. Redirecionando para login.php");
    header("Location: login.php");
    exit();
}

$user_role_session = $_SESSION['role'] ?? '';
$is_admin_session = ($user_role_session === 'Administrador' || $user_role_session === 'Administradores');

if ($user_role_session !== 'Empresas' && !$is_admin_session) {
    $_SESSION['mensagem_geral'] = "Você não tem permissão para editar anúncios pagos.";
    $_SESSION['tipo_mensagem_geral'] = "danger";
    error_log("[AUTH FALHA] Permissão negada para editar anúncio pago. Role: " . $user_role_session . ". Redirecionando para index.php");
    header("Location: index.php");
    exit();
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $_SESSION['mensagem_listar_anuncios'] = 'Método de acesso inválido.';
    $_SESSION['tipo_mensagem_listar_anuncios'] = 'warning';
    error_log("[REQUEST FALHA] Método de acesso inválido: " . $_SERVER['REQUEST_METHOD'] . ". Redirecionando para listar-anuncios-pago.php");
    header("Location: listar-anuncios-pago.php");
    exit;
}

// --- Verificação CSRF ---
if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    $id_anuncio_csrf_redirect = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $_SESSION['mensagem_edit_anuncio_pago'] = "Erro de validação de segurança (CSRF). Ação cancelada.";
    $_SESSION['tipo_mensagem_edit_anuncio_pago'] = "danger";
    $redirect_csrf_loc = $id_anuncio_csrf_redirect ? "editar-anuncio-pago.php?id={$id_anuncio_csrf_redirect}" : "listar-anuncios-pago.php";
    error_log("[CSRF FALHA] Validação do token CSRF falhou. Redirecionando para: " . $redirect_csrf_loc);
    header("Location: " . $redirect_csrf_loc);
    exit();
}
// unset($_SESSION['csrf_token']); // Descomente se for token de uso único


// --- Coleta e Validação de Dados ---
$id_anuncio_edit = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
error_log("[DATA] ID do anúncio (bruto do POST): " . ($_POST['id'] ?? 'NÃO FORNECIDO'));
error_log("[DATA] ID do anúncio para edição (após filter_input): " . ($id_anuncio_edit ?: 'INVÁLIDO/NÃO FORNECIDO'));

if (!$id_anuncio_edit) {
    $_SESSION['mensagem_listar_anuncios'] = 'ID do anúncio inválido para edição.';
    $_SESSION['tipo_mensagem_listar_anuncios'] = 'danger';
    error_log("[VALIDAÇÃO FALHA] ID do anúncio inválido. Redirecionando para listar-anuncios-pago.php");
    header("Location: listar-anuncios-pago.php");
    exit;
}

$titulo_vaga_form            = trim($_POST['titulo_vaga'] ?? '');
$email_para_curriculo_form   = filter_var(trim($_POST['email_para_curriculo'] ?? ''), FILTER_SANITIZE_EMAIL);
$link_pagina_curriculo_form  = trim($_POST['link_pagina_curriculo'] ?? '');
$descricao_vaga_form         = trim($_POST['descricao_vaga'] ?? '');
$segmento_vaga_form          = trim($_POST['segmento_vaga'] ?? '');
$cidade_vaga_form            = trim($_POST['cidade_vaga'] ?? '');
$estado_vaga_form            = trim($_POST['estado'] ?? '');
$tipo_vaga_contrato_form     = trim($_POST['tipo_vaga'] ?? '');
$link_video_vaga_form        = trim($_POST['link_video_vaga'] ?? '');
$requisitos_contratacao_form = trim($_POST['requisitos_contratacao'] ?? '');
$modelo_trabalho_form        = trim($_POST['modelo_contratacao'] ?? '');
$salario_input_form          = trim($_POST['salario'] ?? '');
$salario_a_combinar_check    = isset($_POST['salario_a_combinar_check']) ? 1 : 0; // Captura o valor do checkbox
$logotipo_existente_form     = trim($_POST['logotipo_existente'] ?? '');
$telefone_vaga_form          = trim($_POST['telefone_vaga'] ?? '');
$celular_vaga_form           = trim($_POST['celular_vaga'] ?? '');

$erros_form_edit_anuncio = [];
if (empty($titulo_vaga_form)) $erros_form_edit_anuncio['titulo_vaga'] = "Título é obrigatório.";
if (!filter_var($email_para_curriculo_form, FILTER_VALIDATE_EMAIL)) $erros_form_edit_anuncio['email_para_curriculo'] = "E-mail para currículo inválido.";
if (!empty($link_pagina_curriculo_form) && !filter_var($link_pagina_curriculo_form, FILTER_VALIDATE_URL)) $erros_form_edit_anuncio['link_pagina_curriculo'] = "Link da página de currículo inválido.";
if (empty($descricao_vaga_form)) $erros_form_edit_anuncio['descricao_vaga'] = "Descrição é obrigatória.";
if (empty($cidade_vaga_form)) $erros_form_edit_anuncio['cidade_vaga'] = "Cidade da vaga é obrigatória.";
if (empty($estado_vaga_form) || strlen($estado_vaga_form) !== 2) $erros_form_edit_anuncio['estado'] = "Estado (UF) inválido.";
if (empty($segmento_vaga_form)) $erros_form_edit_anuncio['segmento_vaga'] = "Segmento é obrigatório.";
if (empty($tipo_vaga_contrato_form)) $erros_form_edit_anuncio['tipo_vaga'] = "Tipo de contrato é obrigatório.";
if (!empty($link_video_vaga_form) && !filter_var($link_video_vaga_form, FILTER_VALIDATE_URL)) $erros_form_edit_anuncio['link_video_vaga'] = "Link do vídeo inválido.";
if (empty($requisitos_contratacao_form)) $erros_form_edit_anuncio['requisitos_contratacao'] = "Requisitos são obrigatórios.";
if (empty($modelo_trabalho_form)) $erros_form_edit_anuncio['modelo_contratacao'] = "Modelo de trabalho é obrigatório.";

// --- Lógica de Validação de Salário Corrigida ---
$salario_para_db_edit = null;
if ($salario_a_combinar_check == 1) {
    // Se "A Combinar" estiver marcado, o salário é NULL
    $salario_para_db_edit = null;
} else {
    // Limpa o valor do salário antes de validar
    $salario_limpo = str_replace(['R$', '.', ','], ['', '', '.'], $salario_input_form);
    
    if (empty($salario_limpo)) {
        $erros_form_edit_anuncio['salario'] = "Salário é obrigatório quando 'A Combinar' não está selecionado.";
    } elseif (is_numeric($salario_limpo)) {
        $valor_float_salario = floatval($salario_limpo);
        if ($valor_float_salario >= 0) {
            $salario_para_db_edit = number_format($valor_float_salario, 2, '.', '');
        } else {
            $erros_form_edit_anuncio['salario'] = "Salário não pode ser negativo.";
        }
    } else {
        $erros_form_edit_anuncio['salario'] = "Salário inválido. Use apenas números (ex: 3000,00).";
    }
}
// --- FIM da Lógica de Validação de Salário Corrigida ---


// --- Upload de Novo Logotipo ---
$logotipo_path_para_db_edit = $logotipo_existente_form;
$deletar_logo_antigo = false;
$caminho_fisico_antigo_logo_del = null;

if (isset($_FILES['logotipo_novo']) && $_FILES['logotipo_novo']['error'] === UPLOAD_ERR_OK) {
    error_log("[UPLOAD INICIADO] Novo logotipo recebido: " . print_r($_FILES['logotipo_novo'], true));

    $upload_dir_logos_config = $_ENV['UPLOAD_DIR_LOGOS'] ?? 'uploads/logo/';
    $upload_dir_logos_edit = rtrim($upload_dir_logos_config, '/') . '/';
    $diretorio_base_upload = rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/' . ltrim($upload_dir_logos_edit, '/');

    if (!is_dir($diretorio_base_upload)) {
        if (!mkdir($diretorio_base_upload, 0755, true)) {
            $erros_form_edit_anuncio['logotipo_novo'] = "Falha ao criar diretório de upload: " . $diretorio_base_upload;
            error_log("[UPLOAD ERRO] Falha ao criar diretório: " . $diretorio_base_upload);
        }
    }

    if (!isset($erros_form_edit_anuncio['logotipo_novo']) && is_writable($diretorio_base_upload)) {
        $max_logo_size_mb_edit = (int)($_ENV['MAX_LOGO_SIZE_MB'] ?? 2);
        $max_upload_size_bytes_logo_edit = $max_logo_size_mb_edit * 1024 * 1024;
        $allowed_logo_types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
        $allowed_logo_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp'];

        $file_tmp_path = $_FILES['logotipo_novo']['tmp_name'];
        $file_name = basename($_FILES['logotipo_novo']['name']);
        $file_size = $_FILES['logotipo_novo']['size'];
        $file_type_browser = $_FILES['logotipo_novo']['type'];
        $file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
        
        $mime_type_real = '';
        if (function_exists('finfo_open')) {
            $finfo_resource = finfo_open(FILEINFO_MIME_TYPE); // Salva o recurso
            if ($finfo_resource) {
                $mime_type_real = finfo_file($finfo_resource, $file_tmp_path);
                finfo_close($finfo_resource); // Fecha o recurso
            } else {
                $mime_type_real = $file_type_browser; // Fallback se finfo_open falhar
                error_log("[UPLOAD AVISO] finfo_open falhou. Usando mime_type do browser.");
            }
        } else {
            $mime_type_real = $file_type_browser; // Fallback se extensão fileinfo não estiver disponível
            error_log("[UPLOAD AVISO] Extensão fileinfo não disponível. Usando mime_type do browser.");
        }

        if (!in_array($mime_type_real, $allowed_logo_types)) $erros_form_edit_anuncio['logotipo_novo'] = "Tipo de arquivo inválido ({$mime_type_real}). Permitidos: JPG, PNG, GIF, WEBP.";
        if ($file_size > $max_upload_size_bytes_logo_edit) $erros_form_edit_anuncio['logotipo_novo'] = "Arquivo excede {$max_logo_size_mb_edit}MB.";
        if (!in_array($file_extension, $allowed_logo_extensions)) $erros_form_edit_anuncio['logotipo_novo'] = "Extensão inválida. Permitidas: " . implode(', ', $allowed_logo_extensions);

        if (empty($erros_form_edit_anuncio['logotipo_novo'])) {
            $novo_nome_arquivo_logo = 'logotipo_' . uniqid() . '_' . time() . '.' . $file_extension;
            $caminho_destino_logo_fisico = $diretorio_base_upload . $novo_nome_arquivo_logo;
            $caminho_relativo_logo_bd = ltrim($upload_dir_logos_edit . $novo_nome_arquivo_logo, '/');

            if (move_uploaded_file($file_tmp_path, $caminho_destino_logo_fisico)) {
                $logotipo_path_para_db_edit = $caminho_relativo_logo_bd;
                $deletar_logo_antigo = true;
                error_log("[UPLOAD SUCESSO] Novo logotipo salvo: " . $caminho_destino_logo_fisico . " | BD: " . $caminho_relativo_logo_bd);
                if (!empty($logotipo_existente_form)) {
                    $path_sem_site_url = str_replace(rtrim(($_ENV['SITE_URL'] ?? 'dummy'), '/'), '', $logotipo_existente_form);
                    $caminho_fisico_antigo_logo_del = rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/' . ltrim($path_sem_site_url, '/');
                    error_log("[UPLOAD] Caminho logo antigo para deletar: " . $caminho_fisico_antigo_logo_del);
                }
            } else {
                $erros_form_edit_anuncio['logotipo_novo'] = "Falha ao mover o novo logotipo. Verifique permissões.";
                error_log("[UPLOAD ERRO] Falha ao mover logotipo para: " . $caminho_destino_logo_fisico);
            }
        } else {
             error_log("[UPLOAD ERRO] Validação do arquivo falhou: " . $erros_form_edit_anuncio['logotipo_novo']);
        }
    } elseif (!is_writable($diretorio_base_upload) && !isset($erros_form_edit_anuncio['logotipo_novo'])) {
        $erros_form_edit_anuncio['logotipo_novo'] = "Diretório de upload não tem permissão de escrita: " . $diretorio_base_upload;
        error_log("[UPLOAD ERRO] Diretório de upload sem permissão de escrita: " . $diretorio_base_upload);
    }
} elseif (isset($_FILES['logotipo_novo']) && $_FILES['logotipo_novo']['error'] !== UPLOAD_ERR_NO_FILE) {
    $erros_form_edit_anuncio['logotipo_novo'] = "Erro no upload (Cod: " . $_FILES['logotipo_novo']['error'] . ").";
    error_log("[UPLOAD ERRO] Código PHP: " . $_FILES['logotipo_novo']['error']);
}


if (!empty($erros_form_edit_anuncio)) {
    $_SESSION['mensagem_edit_anuncio_pago'] = "Foram encontrados erros. Corrija-os e tente novamente.";
    $_SESSION['tipo_mensagem_edit_anuncio_pago'] = 'danger';
    $_SESSION['form_errors_edit_anuncio_pago'] = $erros_form_edit_anuncio;
    $_SESSION['form_data_edit_anuncio_pago'] = $_POST;
    error_log("[VALIDAÇÃO ERROS] Erros no formulário: " . print_r($erros_form_edit_anuncio, true) . ". Redirecionando para editar-anuncio-pago.php?id=" . $id_anuncio_edit);
    header("Location: editar-anuncio-pago.php?id=" . $id_anuncio_edit);
    exit;
}

if (!$pdo) {
    $_SESSION['mensagem_listar_anuncios'] = "Erro crítico de sistema (DB).";
    $_SESSION['tipo_mensagem_listar_anuncios'] = 'danger';
    error_log("[DB CRÍTICO] Objeto PDO não disponível. ID Anúncio: " . $id_anuncio_edit . ". Redirecionando.");
    header("Location: listar-anuncios-pago.php");
    exit();
}

try {
    $pdo->beginTransaction();

    $sql_fetch_original = "SELECT * FROM anuncio_pago WHERE id = :id_anuncio";
    $stmt_fetch_original = $pdo->prepare($sql_fetch_original);
    $stmt_fetch_original->bindParam(':id_anuncio', $id_anuncio_edit, PDO::PARAM_INT);
    $stmt_fetch_original->execute();
    $anuncio_original = $stmt_fetch_original->fetch(PDO::FETCH_ASSOC);

    if (!$anuncio_original) {
        throw new Exception("Anúncio (ID: {$id_anuncio_edit}) não encontrado.");
    }
    if (!$is_admin_session && $anuncio_original['empresa_id'] != $_SESSION['id']) {
        throw new Exception("Permissão negada para editar este anúncio (ID: {$id_anuncio_edit}).");
    }

    if ($deletar_logo_antigo && empty($logotipo_existente_form) && !empty($anuncio_original['logotipo'])) {
        $logotipo_existente_form_para_delecao = $anuncio_original['logotipo'];
        $path_sem_site_url = str_replace(rtrim(($_ENV['SITE_URL'] ?? 'dummy'), '/'), '', $logotipo_existente_form_para_delecao);
        $caminho_fisico_antigo_logo_del = rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/' . ltrim($path_sem_site_url, '/');
        error_log("[UPLOAD] Usando logo do BD para deleção: " . $logotipo_existente_form_para_delecao . ". Físico: " . $caminho_fisico_antigo_logo_del);
    }
    
    // CORREÇÃO: Lógica para definir os campos de salário para o UPDATE
    $salario_a_combinar_db = $salario_a_combinar_check; // 1 ou 0
    $salario_db = $salario_para_db_edit; // valor numérico ou null

    // Agora, verificamos se o valor do campo "salario" realmente mudou
    // Para 'salario_a_combinar', comparamos o valor do checkbox com o valor original
    $houve_alteracao_real = false;

    // Define os campos que precisam de atualização
    $campos_update_anuncio = [
        'titulo_vaga' => $titulo_vaga_form,
        'email_para_curriculo' => $email_para_curriculo_form,
        'link_pagina_curriculo' => $link_pagina_curriculo_form ?: null,
        'descricao_vaga' => $descricao_vaga_form,
        'segmento_vaga' => $segmento_vaga_form,
        'estado' => $estado_vaga_form,
        'tipo_vaga' => $tipo_vaga_contrato_form,
        'link_video_vaga' => $link_video_vaga_form ?: null,
        'requisitos_contratacao' => $requisitos_contratacao_form,
        'modelo_contratacao' => $modelo_trabalho_form,
        'cidade_vaga' => $cidade_vaga_form,
        'telefone_vaga' => $telefone_vaga_form ?: null,
        'celular_vaga' => $celular_vaga_form ?: null,
        'salario' => $salario_db,
        'salario_a_combinar' => $salario_a_combinar_db
    ];
    
    if ($deletar_logo_antigo) {
        $campos_update_anuncio['logotipo'] = $logotipo_path_para_db_edit;
    }

    $sql_set_parts_anp = [];
    $params_execute_anp = [];
    
    foreach ($campos_update_anuncio as $coluna => $valor_novo) {
        $valor_original_bd = $anuncio_original[$coluna] ?? null;
        if ($valor_novo !== $valor_original_bd) {
            $sql_set_parts_anp[] = "`{$coluna}` = :{$coluna}";
            $params_execute_anp[":{$coluna}"] = $valor_novo;
            $houve_alteracao_real = true;
            error_log("[DB_UPDATE_CAMPO] '{$coluna}': de '" . print_r($valor_original_bd, true) . "' para '" . print_r($valor_novo, true) . "'");
        }
    }

    // Verifique se o slug precisa ser atualizado
    if (function_exists('gerarSlugBaseLocal') && $titulo_vaga_form !== $anuncio_original['titulo_vaga']) {
        $slug_novo_anp = gerarSlugBaseLocal($titulo_vaga_form) . '-' . $id_anuncio_edit;
        if ($slug_novo_anp !== $anuncio_original['slug']) {
            $sql_set_parts_anp[] = "`slug` = :slug_novo";
            $params_execute_anp[':slug_novo'] = $slug_novo_anp;
            $houve_alteracao_real = true;
            error_log("[DB_UPDATE_CAMPO] 'slug': de '" . $anuncio_original['slug'] . "' para '" . $slug_novo_anp . "'");
        }
    }

    if (!$houve_alteracao_real) {
        $_SESSION['mensagem_edit_anuncio_pago'] = 'Nenhuma alteração foi detectada para salvar.';
        $_SESSION['tipo_mensagem_edit_anuncio_pago'] = 'info';
        error_log("[DB_UPDATE INFO] Nenhuma alteração real para anúncio ID: " . $id_anuncio_edit);
        $pdo->rollBack();
        header("Location: editar-anuncio-pago.php?id=" . $id_anuncio_edit);
        exit;
    }

    $params_execute_anp[':id_anuncio_final'] = $id_anuncio_edit;
    $sql_update_anuncio_final = "UPDATE anuncio_pago SET " . implode(", ", $sql_set_parts_anp) . " WHERE id = :id_anuncio_final";
    
    error_log("[DB_UPDATE SQL] Query: " . $sql_update_anuncio_final);
    error_log("[DB_UPDATE PARAMS] Parameters: " . print_r($params_execute_anp, true));
    
    $stmt_update_anuncio = $pdo->prepare($sql_update_anuncio_final);
    if (!$stmt_update_anuncio->execute($params_execute_anp)) {
        $errorInfo = $stmt_update_anuncio->errorInfo();
        throw new PDOException("Falha ao executar update: " . ($errorInfo[2] ?? 'Erro desconhecido'));
    }
    error_log("[DB_UPDATE SUCESSO] Anúncio ID: {$id_anuncio_edit} atualizado. Linhas: " . $stmt_update_anuncio->rowCount());

    if ($deletar_logo_antigo && !empty($anuncio_original['logotipo']) && $caminho_fisico_antigo_logo_del) {
        if (file_exists($caminho_fisico_antigo_logo_del) && is_file($caminho_fisico_antigo_logo_del)) {
            if (!unlink($caminho_fisico_antigo_logo_del)) error_log("[ARQUIVO DELETAR ERRO] Falha ao excluir logo antigo: " . $caminho_fisico_antigo_logo_del);
            else error_log("[ARQUIVO DELETAR SUCESSO] Logo antigo excluído: " . $caminho_fisico_antigo_logo_del);
        } else {
            error_log("[ARQUIVO DELETAR AVISO] Logo antigo não encontrado ou caminho inválido: " . $caminho_fisico_antigo_logo_del);
        }
    }

    $pdo->commit();
    error_log("[DB TRANSAÇÃO] Commit para anúncio ID: {$id_anuncio_edit}");

    $_SESSION['mensagem_listar_anuncios'] = "Anúncio pago atualizado com sucesso!";
    $_SESSION['tipo_mensagem_listar_anuncios'] = 'success';
    header("Location: listar-anuncios-pago.php");
    exit();

} catch (PDOException $e) {
    if ($pdo && $pdo->inTransaction()) $pdo->rollBack();
    error_log("[PDO EXCEPTION] Erro PDO (Anúncio ID: {$id_anuncio_edit}): " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString());
    $_SESSION['mensagem_edit_anuncio_pago'] = "Erro de banco de dados (PDO): " . $e->getMessage();
    $_SESSION['tipo_mensagem_edit_anuncio_pago'] = 'danger';
    $_SESSION['form_data_edit_anuncio_pago'] = $_POST;
    header("Location: editar-anuncio-pago.php?id=" . $id_anuncio_edit);
    exit();
} catch (Exception $e) {
    if ($pdo && $pdo->inTransaction()) $pdo->rollBack();
    error_log("[EXCEPTION GERAL] Erro (Anúncio ID: {$id_anuncio_edit}): " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString());
    $_SESSION['mensagem_edit_anuncio_pago'] = "Erro: " . $e->getMessage();
    $_SESSION['tipo_mensagem_edit_anuncio_pago'] = 'danger';
    $_SESSION['form_data_edit_anuncio_pago'] = $_POST;
    header("Location: editar-anuncio-pago.php?id=" . $id_anuncio_edit);
    exit();
}

error_log("--- [FIM DEBUG] processar_editar_anuncio_pago.php (Chegou ao final inesperadamente) ---");
?>