<?php
declare(strict_types=1);

namespace Celena\Module\Account;

use Celena\Core\Plugin\Hook;

/**
 * Сборка пунктов навигации личного кабинета.
 *
 * Ядро задаёт базовые вкладки (Обзор, Профиль, Безопасность). Плагины
 * расширяют список через фильтр `account.tabs` (например, магазин добавляет
 * Заказы / Избранное / Адреса) — ровно как admin.sidebar для админки.
 *
 *   Hook::addFilter('account.tabs', function (array $tabs, ?array $user): array {
 *       $tabs[] = ['slug' => 'orders', 'label' => 'Заказы',
 *                  'url' => '/account/orders', 'icon' => 'cart', 'sort' => 30];
 *       return $tabs;
 *   });
 *
 * Каждый пункт: slug, label, url, icon (имя для {icon}), sort (меньше — выше).
 */
final class AccountTabs
{
    /**
     * @param array<string, mixed>|null $user
     * @return array<int, array<string, mixed>>
     */
    public static function build(?array $user, string $active): array
    {
        $tabs = [
            ['slug' => 'overview', 'label' => 'Обзор',        'url' => '/account',          'icon' => 'dashboard', 'sort' => 10],
            ['slug' => 'profile',  'label' => 'Профиль',      'url' => '/account/profile',  'icon' => 'profile',   'sort' => 20],
            ['slug' => 'security', 'label' => 'Безопасность', 'url' => '/account/password', 'icon' => 'settings',  'sort' => 90],
        ];

        $tabs = Hook::filter('account.tabs', $tabs, $user);
        if (!is_array($tabs)) {
            $tabs = [];
        }

        // Нормализация + сортировка по sort.
        $clean = [];
        foreach ($tabs as $t) {
            if (!is_array($t) || !isset($t['slug'], $t['url'])) {
                continue;
            }
            $clean[] = [
                'slug'   => (string) $t['slug'],
                'label'  => (string) ($t['label'] ?? $t['slug']),
                'url'    => (string) $t['url'],
                'icon'   => (string) ($t['icon'] ?? 'box'),
                'sort'   => (int) ($t['sort'] ?? 50),
                'active' => ((string) $t['slug'] === $active) ? '1' : '0',
            ];
        }
        usort($clean, static fn (array $a, array $b): int => $a['sort'] <=> $b['sort']);
        return $clean;
    }
}
