<?php
// admin/update-profile.php
// Define BASE_PATH apenas se não estiver definido
if (!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(dirname(__FILE__)));
}

require_once '../includes/config.php';
require_once '../includes/db.php';
require_once '../includes/functions.php';
require_once '../includes/auth.php';

// Verificar autenticação
$auth->requireAuth();

// Verificar se é uma requisição POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    setAlert("Método inválido.", ALERT_ERROR);
    redirect('admin/profile.php');
    exit;
}

// Determinar ação a ser executada
$action = isset($_POST['action']) ? $_POST['action'] : '';
$userId = $_SESSION['admin_id'];

// Verificar se o usuário existe
try {
    $db->query("SELECT id, username, email, profile_image, password FROM admins WHERE id = :id");
    $db->bind(':id', $userId);
    $user = $db->single();
    
    if (!$user) {
        setAlert("Usuário não encontrado.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
} catch (Exception $e) {
    setAlert("Erro ao verificar usuário: " . $e->getMessage(), ALERT_ERROR);
    redirect('admin/profile.php');
    exit;
}

// Processar ação
switch ($action) {
    case 'update_basic':
        updateBasicInfo($db, $userId, $user);
        break;
        
    case 'update_password':
        updatePassword($db, $userId, $user);
        break;
        
    case 'update_photo':
        updatePhoto($db, $userId, $user);
        break;
        
    default:
        setAlert("Ação inválida.", ALERT_ERROR);
        redirect('admin/profile.php');
        break;
}

/**
 * Atualiza informações básicas do perfil
 */
function updateBasicInfo($db, $userId, $userInfo) {
    $username = isset($_POST['username']) ? trim($_POST['username']) : '';
    $email = isset($_POST['email']) ? trim($_POST['email']) : '';
    
    // Validação
    if (empty($username)) {
        setAlert("O nome de usuário é obrigatório.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        setAlert("E-mail inválido.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar se o e-mail já está em uso por outro usuário
    if ($email !== $userInfo['email']) {
        $db->query("SELECT id FROM admins WHERE email = :email AND id != :id");
        $db->bind(':email', $email);
        $db->bind(':id', $userId);
        
        if ($db->single()) {
            setAlert("Este e-mail já está em uso por outro usuário.", ALERT_ERROR);
            redirect('admin/profile.php');
            exit;
        }
    }
    
    // Verificar se o username já está em uso por outro usuário
    if ($username !== $userInfo['username']) {
        $db->query("SELECT id FROM admins WHERE username = :username AND id != :id");
        $db->bind(':username', $username);
        $db->bind(':id', $userId);
        
        if ($db->single()) {
            setAlert("Este nome de usuário já está em uso.", ALERT_ERROR);
            redirect('admin/profile.php');
            exit;
        }
    }
    
    // Atualizar no banco de dados
    try {
        $db->beginTransaction();
        
        $db->query("UPDATE admins SET username = :username, email = :email, updated_at = NOW() WHERE id = :id");
        $db->bind(':username', $username);
        $db->bind(':email', $email);
        $db->bind(':id', $userId);
        
        if ($db->execute()) {
            // Atualizar dados da sessão
            $_SESSION['admin_name'] = $username;
            $_SESSION['admin_email'] = $email;
            
            $db->commit();
            setAlert("Informações atualizadas com sucesso!", ALERT_SUCCESS);
        } else {
            throw new Exception("Erro ao atualizar informações.");
        }
    } catch (Exception $e) {
        $db->rollback();
        setAlert("Erro ao atualizar perfil: " . $e->getMessage(), ALERT_ERROR);
    }
    
    redirect('admin/profile.php');
    exit;
}

/**
 * Atualiza a senha do usuário
 */
function updatePassword($db, $userId, $userInfo) {
    $currentPassword = isset($_POST['current_password']) ? $_POST['current_password'] : '';
    $newPassword = isset($_POST['new_password']) ? $_POST['new_password'] : '';
    $confirmPassword = isset($_POST['confirm_password']) ? $_POST['confirm_password'] : '';
    
    // Validação
    if (empty($currentPassword) || empty($newPassword) || empty($confirmPassword)) {
        setAlert("Todos os campos são obrigatórios.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar se a senha atual está correta
    if (!password_verify($currentPassword, $userInfo['password'])) {
        setAlert("Senha atual incorreta.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar se a nova senha é igual à confirmação
    if ($newPassword !== $confirmPassword) {
        setAlert("A nova senha e a confirmação não coincidem.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar requisitos mínimos de senha
    if (strlen($newPassword) < 8) {
        setAlert("A senha deve ter no mínimo 8 caracteres.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Gerar hash da nova senha
    $passwordHash = password_hash($newPassword, PASSWORD_DEFAULT);
    
    // Atualizar no banco de dados
    try {
        $db->beginTransaction();
        
        $db->query("UPDATE admins SET password = :password, updated_at = NOW(), token = NULL, token_expiry = NULL WHERE id = :id");
        $db->bind(':password', $passwordHash);
        $db->bind(':id', $userId);
        
        if ($db->execute()) {
            $db->commit();
            // Invalidar todas as sessões existentes e fazer o usuário fazer login novamente
            $auth->logout();
            setAlert("Senha alterada com sucesso! Por favor, faça login novamente.", ALERT_SUCCESS);
            redirect('admin/login.php');
        } else {
            throw new Exception("Erro ao atualizar senha.");
        }
    } catch (Exception $e) {
        $db->rollback();
        setAlert("Erro ao atualizar senha: " . $e->getMessage(), ALERT_ERROR);
        redirect('admin/profile.php');
    }
    
    exit;
}

/**
 * Atualiza a foto do perfil
 */
function updatePhoto($db, $userId, $userInfo) {
    // Verificar se é uma remoção de foto
    if (isset($_POST['remove_photo']) && $_POST['remove_photo'] == '1') {
        // Se existir uma foto anterior, remove o arquivo
        if (!empty($userInfo['profile_image']) && file_exists(BASE_PATH . $userInfo['profile_image'])) {
            unlink(BASE_PATH . $userInfo['profile_image']);
        }
        
        // Atualiza o banco de dados removendo a referência à foto
        try {
            $db->query("UPDATE admins SET profile_image = NULL, updated_at = NOW() WHERE id = :id");
            $db->bind(':id', $userId);
            
            if ($db->execute()) {
                setAlert("Foto de perfil removida com sucesso!", ALERT_SUCCESS);
            } else {
                setAlert("Erro ao remover foto de perfil.", ALERT_ERROR);
            }
        } catch (Exception $e) {
            setAlert("Erro ao atualizar banco de dados: " . $e->getMessage(), ALERT_ERROR);
        }
        
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar se foi enviado um arquivo
    if (!isset($_FILES['profile_image']) || $_FILES['profile_image']['error'] == UPLOAD_ERR_NO_FILE) {
        setAlert("Nenhuma imagem foi selecionada.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar erros no upload
    if ($_FILES['profile_image']['error'] !== UPLOAD_ERR_OK) {
        $errorMessages = [
            UPLOAD_ERR_INI_SIZE => "O arquivo excede o tamanho máximo permitido pelo servidor.",
            UPLOAD_ERR_FORM_SIZE => "O arquivo excede o tamanho máximo permitido pelo formulário.",
            UPLOAD_ERR_PARTIAL => "O upload do arquivo foi interrompido.",
            UPLOAD_ERR_NO_TMP_DIR => "Pasta temporária ausente no servidor.",
            UPLOAD_ERR_CANT_WRITE => "Falha ao gravar arquivo no servidor.",
            UPLOAD_ERR_EXTENSION => "Uma extensão PHP interrompeu o upload."
        ];
        
        $errorMessage = isset($errorMessages[$_FILES['profile_image']['error']]) 
            ? $errorMessages[$_FILES['profile_image']['error']] 
            : "Erro desconhecido no upload.";
        
        setAlert("Erro no upload: " . $errorMessage, ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar tipo de arquivo
    $allowed = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
    if (!in_array($_FILES['profile_image']['type'], $allowed)) {
        setAlert("Tipo de arquivo não permitido. Use apenas JPG, PNG ou GIF.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Verificar tamanho do arquivo (máximo 2MB)
    $maxSize = 2 * 1024 * 1024; // 2MB
    if ($_FILES['profile_image']['size'] > $maxSize) {
        setAlert("O arquivo é muito grande. O tamanho máximo permitido é 2MB.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Criar diretório para fotos de perfil se não existir
    $uploadDir = '/uploads/profiles/';
    $fullUploadDir = BASE_PATH . $uploadDir;
    
    if (!is_dir($fullUploadDir)) {
        mkdir($fullUploadDir, 0755, true);
    }
    
    // Gerar nome único para o arquivo
    $fileExt = pathinfo($_FILES['profile_image']['name'], PATHINFO_EXTENSION);
    $fileName = 'profile_' . $userId . '_' . uniqid() . '.' . $fileExt;
    $filePath = $uploadDir . $fileName;
    $fullFilePath = BASE_PATH . $filePath;
    
    // Mover o arquivo
    if (!move_uploaded_file($_FILES['profile_image']['tmp_name'], $fullFilePath)) {
        setAlert("Falha ao mover arquivo. Verifique as permissões do diretório.", ALERT_ERROR);
        redirect('admin/profile.php');
        exit;
    }
    
    // Se existir uma foto anterior, remove o arquivo
    if (!empty($userInfo['profile_image']) && file_exists(BASE_PATH . $userInfo['profile_image']) && $userInfo['profile_image'] != $filePath) {
        unlink(BASE_PATH . $userInfo['profile_image']);
    }
    
    // Atualizar caminho da foto no banco de dados
    try {
        $db->query("UPDATE admins SET profile_image = :profile_image, updated_at = NOW() WHERE id = :id");
        $db->bind(':profile_image', $filePath);
        $db->bind(':id', $userId);
        
        if ($db->execute()) {
            setAlert("Foto de perfil atualizada com sucesso!", ALERT_SUCCESS);
        } else {
            // Se falhar o update no banco, remove o arquivo
            unlink($fullFilePath);
            setAlert("Erro ao atualizar foto no banco de dados.", ALERT_ERROR);
        }
    } catch (Exception $e) {
        // Se ocorrer uma exceção, remove o arquivo
        unlink($fullFilePath);
        setAlert("Erro ao atualizar banco de dados: " . $e->getMessage(), ALERT_ERROR);
    }
    
    redirect('admin/profile.php');
    exit;
}