<?php
/**
 * Genel yardımcı fonksiyonlar.
 */

/** Güvenli HTML escape */
function e(?string $s): string
{
    return htmlspecialchars((string)$s, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

/** CSRF token al */
function csrf_token(): string
{
    return $_SESSION['csrf_token'] ?? '';
}

/** CSRF token doğrula
 * APP_DEBUG modunda kontrol gevşetilir (sadece session'da token varsa kontrol eder).
 * Boş token gelse bile geçer — kurulum sırasında session/cookie sorunlarını debuglamayı kolaylaştırır.
 */
function csrf_check(?string $token): bool
{
    // Session'da token yoksa, henüz oluşmamış demektir; geç ve yeni token üret
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        return true;
    }
    // Token boşsa: debug modunda geç, üretimde reddet
    if (!is_string($token) || $token === '') {
        return defined('APP_DEBUG') && APP_DEBUG;
    }
    return hash_equals($_SESSION['csrf_token'], $token);
}

/** CSRF input field HTML */
function csrf_field(): string
{
    return '<input type="hidden" name="csrf_token" value="' . e(csrf_token()) . '">';
}

/** Yönlendir */
function redirect(string $path): void
{
    header('Location: ' . $path);
    exit;
}

/** Şifre hashleme */
function hash_password(string $plain): string
{
    return password_hash($plain, PASSWORD_BCRYPT);
}

/** Şifre doğrulama */
function verify_password(string $plain, string $hash): bool
{
    return password_verify($plain, $hash);
}

/** Flash mesaj koy */
function flash_set(string $type, string $message): void
{
    $_SESSION['flash'][] = ['type' => $type, 'message' => $message];
}

/** Flash mesajları al ve temizle */
function flash_get(): array
{
    $msgs = $_SESSION['flash'] ?? [];
    unset($_SESSION['flash']);
    return $msgs;
}

/** Flash HTML olarak render et */
function flash_render(): string
{
    $msgs = flash_get();
    if (empty($msgs)) return '';
    $html = '';
    foreach ($msgs as $m) {
        $cls = match ($m['type']) {
            'success' => 'flash-success',
            'error'   => 'flash-error',
            'warning' => 'flash-warning',
            default   => 'flash-info',
        };
        $html .= '<div class="flash ' . $cls . '">' . e($m['message']) . '</div>';
    }
    return $html;
}

/** Mevcut kullanıcı login mi? */
function is_logged_in(): bool
{
    return !empty($_SESSION['user_id']);
}

/** Mevcut kullanıcı admin mi? */
function is_admin(): bool
{
    return is_logged_in() && !empty($_SESSION['is_admin']);
}

/** Login zorunlu — değilse login'e yolla */
function require_login(): void
{
    if (!is_logged_in()) {
        flash_set('warning', __('login'));
        redirect(APP_URL . '/login.php');
    }
}

/** Admin zorunlu */
function require_admin(): void
{
    require_login();
    if (!is_admin()) {
        flash_set('error', __('access_denied'));
        redirect(APP_URL . '/index.php');
    }
}

/** Tarih formatla */
function format_datetime(?int $timestamp): string
{
    if (!$timestamp) return '-';
    return date('d.m.Y H:i', $timestamp);
}

/** Sayıyı format'la (10000 => 10.000) */
function format_number(int $n): string
{
    return number_format($n, 0, ',', '.');
}
