<?php
// processa_edicao_lista_candidato.php

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

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

// Configurações de erro (idealmente controladas por $_ENV['APP_DEBUG'])
// error_reporting(E_ALL);
// ini_set('display_errors', 1);

// 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 esta ação.";
    header("Location: login.php");
    exit();
}

// Verificar se o formulário foi enviado via POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $_SESSION['mensagem_lista_candidatos'] = 'Método de acesso inválido para processamento.';
    $_SESSION['tipo_mensagem_lista_candidatos'] = 'warning';
    header("Location: listar-candidato.php");
    exit;
}

// --- Verificação CSRF ---
if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token_lista_candidato']) || 
    !hash_equals($_SESSION['csrf_token_lista_candidato'], $_POST['csrf_token'])) {
    
    $_SESSION['mensagem_lista_candidatos'] = "Erro de validação de segurança (CSRF). Ação cancelada.";
    $_SESSION['tipo_mensagem_lista_candidatos'] = "danger";
    // Opcional: unset($_SESSION['csrf_token_lista_candidato']); 
    header("Location: listar-candidato.php");
    exit();
}
// Considere usar um token por formulário ou invalidar após o uso se a segurança for máxima.
// Para listagens com múltiplas ações, um token de sessão que expira pode ser usado.


// Configurações de Upload (podem vir do .env)
$upload_dir_curriculos = rtrim(($_ENV['UPLOAD_DIR_CURRICULOS'] ?? 'uploads/curriculos'), '/') . '/';
$max_upload_size_curriculo_mb = (int)($_ENV['MAX_CV_SIZE_MB'] ?? 2); // 2MB por padrão
$max_upload_size_bytes = $max_upload_size_curriculo_mb * 1024 * 1024;


// Capturar e validar o ID
$id_candidato_editar = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
if (!$id_candidato_editar) {
    $_SESSION['mensagem_lista_candidatos'] = 'ID do candidato inválido para edição.';
    $_SESSION['tipo_mensagem_lista_candidatos'] = 'danger';
    header("Location: listar-candidato.php");
    exit;
}

// Coleta e limpeza básica dos dados do formulário
$nome               = trim($_POST['nome'] ?? '');
$email              = filter_var(trim($_POST['email'] ?? ''), FILTER_SANITIZE_EMAIL);
$login              = trim($_POST['login'] ?? ''); // Se o login for diferente do email
$senha_nova         = $_POST['senha'] ?? ''; // Senha nova, se fornecida
$cidade             = trim($_POST['cidade'] ?? '');
$estado             = trim($_POST['estado'] ?? '');
$celular            = preg_replace('/\D/', '', trim($_POST['celular'] ?? '')); // Remove não dígitos
$tipo_vaga_interesse = trim($_POST['tipo_vaga'] ?? ''); // Segmento de interesse
$cargo_pretendido   = trim($_POST['cargo_pretendido'] ?? '');
$link_selflix       = filter_var(trim($_POST['link_selflix'] ?? ''), FILTER_SANITIZE_URL);
$salario_pretendido = trim($_POST['salario_pretendido'] ?? ''); // Pode ser numérico ou texto "A Combinar"
$receber_emails     = trim($_POST['receber_emails'] ?? 'Nao');


// Validação dos dados
$erros = [];
if (empty($nome)) $erros['nome'] = "Nome é obrigatório.";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $erros['email'] = "Formato de e-mail inválido.";
} else {
    // Verificar se o e-mail já existe para OUTRO candidato
    if ($pdo) {
        try {
            $stmt_check_email = $pdo->prepare("SELECT id FROM Candidatos WHERE email = ? AND id != ?");
            $stmt_check_email->execute([$email, $id_candidato_editar]);
            if ($stmt_check_email->fetch()) {
                $erros['email'] = "Este e-mail já está cadastrado para outro candidato.";
            }
            $stmt_check_login = $pdo->prepare("SELECT id FROM Candidatos WHERE login = ? AND id != ?");
            $stmt_check_login->execute([$login, $id_candidato_editar]);
            if ($stmt_check_login->fetch()) {
                $erros['login'] = "Este login já está em uso por outro candidato.";
            }
        } catch (PDOException $e) {
            error_log("Erro ao verificar e-mail/login duplicado para candidato ID {$id_candidato_editar}: " . $e->getMessage());
            $erros['geral'] = "Erro ao verificar dados. Tente novamente.";
        }
    }
}
if (empty($login)) $erros['login'] = "Login é obrigatório.";
if (!empty($senha_nova) && strlen($senha_nova) < 6) $erros['senha'] = "A nova senha deve ter pelo menos 6 caracteres.";
if (empty($cidade)) $erros['cidade'] = "Cidade é obrigatória.";
if (empty($estado) || strlen($estado) !== 2) $erros['estado'] = "Estado (UF) é obrigatório.";
if (empty($celular) || !preg_match('/^(\d{10}|\d{11})$/', $celular)) $erros['celular'] = "Celular inválido (mínimo 10 dígitos).";
if (empty($tipo_vaga_interesse)) $erros['tipo_vaga'] = "Segmento de interesse é obrigatório.";
if (empty($cargo_pretendido)) $erros['cargo_pretendido'] = "Cargo pretendido é obrigatório.";
if (!empty($link_selflix) && !filter_var($link_selflix, FILTER_VALIDATE_URL)) $erros['link_selflix'] = "Link Selflix inválido.";
if (empty($salario_pretendido)) $erros['salario_pretendido'] = "Pretensão salarial é obrigatória.";
if (!in_array($receber_emails, ['Sim', 'Nao', 'Não'])) $erros['receber_emails'] = "Opção inválida para receber e-mails.";


if (!$pdo) { // Checagem adicional para $pdo antes de usá-lo
    $erros['geral'] = "Erro crítico de sistema (DB). Não foi possível processar.";
} else {
    // Buscar currículo atual para possível exclusão
    $curriculo_atual_db = null;
    try {
        $stmt_get_cv = $pdo->prepare("SELECT curriculo FROM Candidatos WHERE id = ?");
        $stmt_get_cv->execute([$id_candidato_editar]);
        $result_cv = $stmt_get_cv->fetch(PDO::FETCH_ASSOC);
        if ($result_cv) {
            $curriculo_atual_db = $result_cv['curriculo'];
        } else {
            // Isso não deveria acontecer se o ID é válido e o candidato existe
            throw new Exception("Candidato não encontrado ao buscar currículo atual.");
        }
    } catch (PDOException $e) {
        error_log("Erro ao buscar currículo atual do candidato ID {$id_candidato_editar}: " . $e->getMessage());
        $erros['geral'] = "Erro ao processar dados do currículo. Tente novamente.";
    }
}

// Processar upload de currículo, se enviado e não houver outros erros
$novo_curriculo_path_db = $curriculo_atual_db; // Mantém o atual por padrão

if (empty($erros) && isset($_FILES['curriculo']) && $_FILES['curriculo']['error'] === UPLOAD_ERR_OK) {
    if (!is_dir($upload_dir_curriculos) && !mkdir($upload_dir_curriculos, 0775, true) && !is_dir($upload_dir_curriculos)) {
        $erros['curriculo'] = "Falha ao acessar diretório de upload para currículos.";
        error_log("Falha ao criar/acessar diretório de upload: " . $upload_dir_curriculos);
    } else {
        $nome_original_cv = basename($_FILES['curriculo']['name']);
        $extensao_cv = strtolower(pathinfo($nome_original_cv, PATHINFO_EXTENSION));
        $nome_unico_cv = "curriculo_" . $id_candidato_editar . "_" . time() . "." . $extensao_cv;
        $caminho_upload_cv = $upload_dir_curriculos . $nome_unico_cv;

        $allowed_mime_types_cv = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'];
        $allowed_extensions_cv = ['pdf', 'doc', 'docx'];

        if (in_array($_FILES['curriculo']['type'], $allowed_mime_types_cv) && in_array($extensao_cv, $allowed_extensions_cv)) {
            if ($_FILES['curriculo']['size'] <= $max_upload_size_bytes) {
                if (move_uploaded_file($_FILES['curriculo']['tmp_name'], $caminho_upload_cv)) {
                    // Se o upload foi bem-sucedido, tenta excluir o currículo antigo (se existir e for diferente)
                    if (!empty($curriculo_atual_db) && $curriculo_atual_db !== $caminho_upload_cv) {
                        $caminho_fisico_antigo_cv = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($curriculo_atual_db, '/');
                         if (strpos($curriculo_atual_db, ($_ENV['SITE_URL'] ?? '---')) === 0) {
                             $caminho_fisico_antigo_cv = str_replace($_ENV['SITE_URL'], $_SERVER['DOCUMENT_ROOT'], $curriculo_atual_db);
                        }

                        if (file_exists($caminho_fisico_antigo_cv) && is_writable(dirname($caminho_fisico_antigo_cv))) {
                            if (!unlink($caminho_fisico_antigo_cv)) {
                                error_log("Falha ao tentar excluir o currículo antigo: " . $caminho_fisico_antigo_cv);
                            }
                        } elseif (!empty($curriculo_atual_db)) {
                             error_log("Currículo antigo não encontrado ou não gravável para exclusão: " . $caminho_fisico_antigo_cv);
                        }
                    }
                    $novo_curriculo_path_db = $upload_dir_curriculos . $nome_unico_cv; // Caminho relativo para o BD
                } else {
                    $erros['curriculo'] = "Erro ao mover o arquivo de currículo.";
                    error_log("Erro em move_uploaded_file (CV): " . $caminho_upload_cv);
                }
            } else {
                $erros['curriculo'] = "Arquivo de currículo muito grande (Máximo: {$max_upload_size_curriculo_mb}MB).";
            }
        } else {
            $erros['curriculo'] = "Tipo de arquivo de currículo inválido. Permitidos: PDF, DOC, DOCX.";
        }
    }
} elseif (isset($_FILES['curriculo']) && $_FILES['curriculo']['error'] !== UPLOAD_ERR_NO_FILE && $_FILES['curriculo']['error'] !== UPLOAD_ERR_OK) {
    $erros['curriculo'] = "Erro no upload do currículo. Código: " . $_FILES['curriculo']['error'];
}


// Se houver erros de validação, redireciona de volta
if (!empty($erros)) {
    $_SESSION['mensagem_edit_lista_cand'] = "Foram encontrados erros. Por favor, corrija-os.";
    $_SESSION['tipo_mensagem_edit_lista_cand'] = 'danger';
    $_SESSION['form_errors_edit_lista_candidato'] = $erros;
    $_SESSION['form_data_edit_lista_candidato'] = $_POST; // Salva os dados para repopular
    header("Location: editar_lista_candidato.php?id=" . $id_candidato_editar);
    exit;
}


// Atualizar os dados no banco
if ($pdo) {
    try {
        $params_update = [
            'nome' => $nome,
            'email' => $email,
            'login' => $login,
            'cidade' => $cidade,
            'estado' => $estado,
            'celular' => $celular,
            'tipo_vaga' => $tipo_vaga_interesse,
            'cargo_pretendido' => $cargo_pretendido,
            'link_selflix' => $link_selflix ?: null, // Salva NULL se vazio
            'salario_pretendido' => $salario_pretendido,
            'receber_emails' => ($receber_emails === 'Sim' ? 'Sim' : 'Nao'), // Garante valor do ENUM
            'curriculo' => $novo_curriculo_path_db,
            'id' => $id_candidato_editar
        ];

        $sql_set_parts = [];
        foreach (array_keys($params_update) as $key) {
            if ($key !== 'id') { // Não incluir 'id' na parte SET
                $sql_set_parts[] = "`{$key}` = :{$key}";
            }
        }

        // Adicionar senha apenas se uma nova foi fornecida
        if (!empty($senha_nova)) {
            $sql_set_parts[] = "`senha` = :senha";
            $params_update['senha'] = password_hash($senha_nova, PASSWORD_BCRYPT);
        }
        
        $sql_update = "UPDATE Candidatos SET " . implode(", ", $sql_set_parts) . " WHERE id = :id";
        
        $stmt_update = $pdo->prepare($sql_update);
        $stmt_update->execute($params_update);
        
        // Log da ação de edição bem-sucedida
        if (isset($_SESSION['id'], $_SESSION['role'])) {
            // ... (bloco de log de acesso aqui, usando $pdo e $id_candidato_editar) ...
            // Ex: "Admin (ID: {$_SESSION['id']}) editou candidato (ID: {$id_candidato_editar})"
        }

        $_SESSION['mensagem_lista_candidatos'] = 'Candidato atualizado com sucesso!';
        $_SESSION['tipo_mensagem_lista_candidatos'] = 'success';
        header("Location: listar-candidato.php");
        exit;

    } catch (PDOException $e) {
        error_log("Erro PDO ao atualizar candidato ID {$id_candidato_editar}: " . $e->getMessage());
        $_SESSION['mensagem_edit_lista_cand'] = "Erro ao atualizar candidato: " . $e->getMessage();
        $_SESSION['tipo_mensagem_edit_lista_cand'] = 'danger';
        $_SESSION['form_data_edit_lista_candidato'] = $_POST;
        header("Location: editar_lista_candidato.php?id=" . $id_candidato_editar);
        exit;
    }
} else {
     $_SESSION['mensagem_edit_lista_cand'] = "Erro crítico: Falha na conexão com o banco de dados ao tentar atualizar.";
     $_SESSION['tipo_mensagem_edit_lista_cand'] = 'danger';
     $_SESSION['form_data_edit_lista_candidato'] = $_POST;
     header("Location: editar_lista_candidato.php?id=" . $id_candidato_editar);
     exit;
}
?>