<?php
// processa_editar_administrador.php

// Ativar exibição de erros para debug (idealmente controlado por $_ENV['APP_DEBUG'])
// error_reporting(E_ALL);
// ini_set('display_errors', 1);

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

require_once 'conexao.php'; // Fornece $pdo globalmente
require_once 'env.php';     // Carrega $_ENV (conexao.php já deve fazer isso)
require_once 'middleware-auth.php'; // Para funções de autenticação

// Garantir que apenas administradores autenticados executem este script
authAdministrador();

// Verificar se o formulário foi enviado via POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $_SESSION['mensagem_painel_adm'] = 'Método de requisição inválido.';
    $_SESSION['tipo_mensagem_painel_adm'] = 'warning';
    header("Location: painel-adm.php"); // Redireciona para o painel principal do admin
    exit;
}

// --- Verificação CSRF ---
// Assumindo que o formulário editar_administrador.php envia 'csrf_token'
// e que $_SESSION['csrf_token'] foi gerado na página do formulário.
if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    $_SESSION['mensagem_form_admin'] = "Erro de validação de segurança (CSRF). Ação cancelada."; // Mensagem para a pág. de edição
    $_SESSION['tipo_mensagem_form_admin'] = "danger";
    // Precisa do ID do admin para redirecionar de volta para o formulário correto
    $id_admin_redirect_csrf = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $redirect_location_csrf = $id_admin_redirect_csrf ? "editar_administrador.php?id={$id_admin_redirect_csrf}" : "painel-adm.php";
    header("Location: " . $redirect_location_csrf);
    exit();
}
// Considere invalidar o token se for de uso único para este formulário específico.

// Capturar e validar o ID do administrador sendo editado
$id_admin_edit = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
if (!$id_admin_edit) {
    $_SESSION['mensagem_painel_adm'] = 'ID do administrador inválido para edição.';
    $_SESSION['tipo_mensagem_painel_adm'] = 'danger';
    header("Location: painel-adm.php"); // Ou para uma lista de administradores, se existir
    exit;
}

// Coleta e limpeza básica dos dados do formulário
$nome  = trim($_POST['nome'] ?? '');
$login = filter_var(trim($_POST['login'] ?? ''), FILTER_SANITIZE_EMAIL); // Login é um e-mail
$senha_nova = $_POST['senha'] ?? '';

// --- Validações ---
$erros_form_edit = [];
if (empty($nome)) {
    $erros_form_edit['nome'] = "O campo nome é obrigatório.";
}
if (empty($login)) {
    $erros_form_edit['login'] = "O campo login (e-mail) é obrigatório.";
} elseif (!filter_var($login, FILTER_VALIDATE_EMAIL)) {
    $erros_form_edit['login'] = "Formato de e-mail inválido para o login.";
} else {
    // Verificar se o novo login (e-mail) já existe para OUTRO administrador
    if ($pdo) {
        try {
            $stmt_check_login = $pdo->prepare("SELECT id FROM Administradores WHERE login = :login AND id != :id_admin");
            $stmt_check_login->execute([':login' => $login, ':id_admin' => $id_admin_edit]);
            if ($stmt_check_login->fetch()) {
                $erros_form_edit['login'] = "Este login (e-mail) já está em uso por outro administrador.";
            }
        } catch (PDOException $e) {
            error_log("Erro ao verificar login duplicado para admin ID {$id_admin_edit}: " . $e->getMessage());
            $erros_form_edit['geral'] = "Erro ao verificar dados. Tente novamente.";
        }
    }
}

if (!empty($senha_nova)) {
    if (strlen($senha_nova) < 8) { // Exemplo: mínimo de 8 caracteres
        $erros_form_edit['senha'] = "A nova senha deve ter pelo menos 8 caracteres.";
    } elseif (!preg_match('/[A-Z]/', $senha_nova) || !preg_match('/[a-z]/', $senha_nova) || !preg_match('/[0-9]/', $senha_nova)) {
        $erros_form_edit['senha'] = "A senha deve conter letras maiúsculas, minúsculas e números.";
    }
}

// Se houver erros de validação, redireciona de volta com os erros e dados
if (!empty($erros_form_edit)) {
    $_SESSION['mensagem_form_admin'] = "Foram encontrados erros. Por favor, corrija-os.";
    $_SESSION['tipo_mensagem_form_admin'] = 'danger';
    $_SESSION['form_errors_admin_edit'] = $erros_form_edit; // Para exibir erros por campo
    $_SESSION['form_data_admin_edit'] = $_POST;           // Para repopular o formulário
    header("Location: editar_administrador.php?id=" . $id_admin_edit);
    exit;
}

// --- Atualizar dados no banco ---
if (!$pdo) {
    $_SESSION['mensagem_form_admin'] = "Erro crítico de sistema (DB). Não foi possível salvar as alterações.";
    $_SESSION['tipo_mensagem_form_admin'] = 'danger';
    $_SESSION['form_data_admin_edit'] = $_POST;
    header("Location: editar_administrador.php?id=" . $id_admin_edit);
    exit();
}

try {
    $params_update_execute = [
        ':nome' => $nome,
        ':login' => $login,
        ':id' => $id_admin_edit
    ];
    
    $sql_update_parts = ["nome = :nome", "login = :login"];

    if (!empty($senha_nova)) {
        $senha_hash = password_hash($senha_nova, PASSWORD_BCRYPT);
        $sql_update_parts[] = "senha = :senha";
        $params_update_execute[':senha'] = $senha_hash;
    }
    
    $sql_update = "UPDATE Administradores SET " . implode(", ", $sql_update_parts) . " WHERE id = :id";
    
    $stmt_update = $pdo->prepare($sql_update);
    $stmt_update->execute($params_update_execute);

    $mensagem_sucesso = 'Dados do administrador atualizados com sucesso!';
    if (!empty($senha_nova)) {
        $mensagem_sucesso .= ' A senha também foi alterada.';
    }

    // Log da ação de edição bem-sucedida
    if (isset($_SESSION['id'], $_SESSION['role'])) {
        $usuario_id_log_action = $_SESSION['id']; // ID do admin que fez a ação
        $role_log_action = $_SESSION['role'];
        $role_map_hist_action = ['Administradores' => 'admin', 'Administrador' => 'admin'];
        $tipo_usuario_log_action = $role_map_hist_action[$role_log_action] ?? 'admin';
        $pagina_acessada_log_action = "processa_editar_administrador.php (ID Admin Editado: {$id_admin_edit}, Sucesso por Admin ID: {$usuario_id_log_action})";
        
        try {
            $stmt_hist_action = $pdo->prepare("INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())");
            $stmt_hist_action->execute([$usuario_id_log_action, $tipo_usuario_log_action, $pagina_acessada_log_action]);
        } catch (PDOException $e_log_action) {
            error_log("Erro ao registrar histórico de edição de administrador: " . $e_log_action->getMessage());
        }
    }

    $_SESSION['mensagem_painel_adm'] = $mensagem_sucesso; // Mensagem para o painel geral de admin
    $_SESSION['tipo_mensagem_painel_adm'] = 'success';
    header("Location: painel-adm.php"); // Ou para uma lista de administradores, se houver
    exit();

} catch (PDOException $e) {
    error_log("Erro PDO ao atualizar administrador ID {$id_admin_edit}: " . $e->getMessage());
    $_SESSION['mensagem_form_admin'] = "Erro de banco de dados ao atualizar administrador: " . $e->getMessage(); // Em dev
    // $_SESSION['mensagem_form_admin'] = "Erro interno ao atualizar dados. Tente novamente."; // Para produção
    $_SESSION['tipo_mensagem_form_admin'] = 'danger';
    $_SESSION['form_data_admin_edit'] = $_POST; // Mantém os dados para repopular
    header("Location: editar_administrador.php?id=" . $id_admin_edit);
    exit();
}
?>