<?php
// auth.php - Sistema de autenticação
require_once __DIR__ . '/includes/functions.php';

session_start();

/** Verifica se o usuário está logado */
function is_logged_in(): bool {
    return isset($_SESSION['user_id']) && !empty($_SESSION['user_id']);
}

/** Redireciona para login se não estiver logado */
function require_login(): void {
    if (!is_logged_in()) {
        header('Location: login.php');
        exit;
    }
}

/** Retorna dados do usuário logado */
function current_user(): array {
    if (!is_logged_in()) {
        return [];
    }
    
    $stmt = db()->prepare("SELECT id, username, is_active FROM app_users WHERE id = ? LIMIT 1");
    $stmt->execute([$_SESSION['user_id']]);
    $user = $stmt->fetch();
    
    return $user ?: [];
}

/** Faz login do usuário */
function login_user(string $username, string $password): bool {
    $stmt = db()->prepare("SELECT id, username, password_hash, is_active FROM app_users WHERE username = ? LIMIT 1");
    $stmt->execute([$username]);
    $user = $stmt->fetch();
    
    if (!$user || !$user['is_active']) {
        return false;
    }
    
    if (password_verify($password, $user['password_hash'])) {
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        return true;
    }
    
    return false;
}

/** Faz logout do usuário */
function logout_user(): void {
    session_destroy();
    session_start();
}

/** Cria novo usuário */
function create_user(string $username, string $password): array {
    $username = str_in($username);
    $password = str_in($password);
    
    if (strlen($username) < 3) {
        return ['ok' => false, 'message' => 'Nome de usuário deve ter pelo menos 3 caracteres.'];
    }
    
    if (strlen($password) < 6) {
        return ['ok' => false, 'message' => 'Senha deve ter pelo menos 6 caracteres.'];
    }
    
    // Verifica se usuário já existe
    $stmt = db()->prepare("SELECT id FROM app_users WHERE username = ? LIMIT 1");
    $stmt->execute([$username]);
    if ($stmt->fetch()) {
        return ['ok' => false, 'message' => 'Nome de usuário já existe.'];
    }
    
    try {
        $hash = password_hash($password, PASSWORD_BCRYPT);
        $stmt = db()->prepare("INSERT INTO app_users (username, password_hash, is_active) VALUES (?, ?, 1)");
        $stmt->execute([$username, $hash]);
        
        return ['ok' => true, 'id' => db()->lastInsertId()];
    } catch (Exception $e) {
        return ['ok' => false, 'message' => 'Erro ao criar usuário: ' . $e->getMessage()];
    }
}

/** Altera senha do usuário */
function change_password(int $user_id, string $current_password, string $new_password): array {
    $stmt = db()->prepare("SELECT password_hash FROM app_users WHERE id = ? LIMIT 1");
    $stmt->execute([$user_id]);
    $user = $stmt->fetch();
    
    if (!$user) {
        return ['ok' => false, 'message' => 'Usuário não encontrado.'];
    }
    
    if (!password_verify($current_password, $user['password_hash'])) {
        return ['ok' => false, 'message' => 'Senha atual incorreta.'];
    }
    
    if (strlen($new_password) < 6) {
        return ['ok' => false, 'message' => 'Nova senha deve ter pelo menos 6 caracteres.'];
    }
    
    try {
        $hash = password_hash($new_password, PASSWORD_BCRYPT);
        $stmt = db()->prepare("UPDATE app_users SET password_hash = ? WHERE id = ?");
        $stmt->execute([$hash, $user_id]);
        
        return ['ok' => true, 'message' => 'Senha alterada com sucesso!'];
    } catch (Exception $e) {
        return ['ok' => false, 'message' => 'Erro ao alterar senha.'];
    }
}
