<?php
declare(strict_types=1);

/**
 * /admin/_csrf.php
 * CSRF для адмінки:
 * - admin_csrf_token()
 * - admin_csrf_field()
 * - admin_csrf_verify()
 *
 * Сумісність:
 * - приймає як csrf_token, так і csrf
 * - field() генерує обидва hidden-поля з одним токеном
 */

if (!function_exists('admin_csrf_token')) {
    function admin_csrf_token(): string {
        if (session_status() !== PHP_SESSION_ACTIVE) {
            if (!headers_sent()) {
                session_start();
            }
        }

        if (empty($_SESSION['admin_csrf']) || !is_string($_SESSION['admin_csrf'])) {
            $_SESSION['admin_csrf'] = bin2hex(random_bytes(32));
        }

        return (string)$_SESSION['admin_csrf'];
    }
}

if (!function_exists('admin_csrf_field')) {
    function admin_csrf_field(): string {
        $t = admin_csrf_token();
        $tEsc = htmlspecialchars($t, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');

        // Генеруємо обидва, щоб будь-який handler з будь-якою назвою поля відпрацював.
        return
            '<input type="hidden" name="csrf_token" value="' . $tEsc . '">' . "\n" .
            '<input type="hidden" name="csrf" value="' . $tEsc . '">';
    }
}

if (!function_exists('admin_csrf_verify')) {
    function admin_csrf_verify(): bool {
        if (session_status() !== PHP_SESSION_ACTIVE) {
            if (!headers_sent()) {
                session_start();
            }
        }

        $real = (string)($_SESSION['admin_csrf'] ?? '');
        if ($real === '') return false;

        $sent = '';
        if (isset($_POST['csrf_token'])) {
            $sent = (string)$_POST['csrf_token'];
        } elseif (isset($_POST['csrf'])) {
            $sent = (string)$_POST['csrf'];
        }

        if ($sent === '') return false;

        return hash_equals($real, $sent);
    }
}