<?php

namespace App\Livewire\Admin;

use App\Support\Navigation;
use Livewire\Attributes\Layout;
use Livewire\Component;

/**
 * Die Tür zu allem, was man einmal einrichtet.
 *
 * Neun Seiten standen in der Seitenleiste zwischen dem Tagesgeschäft — die
 * Mail-Einrichtung neben einem Rechtsdokument, neben den persönlichen
 * Kontoeinstellungen, neben der Mitarbeiterverwaltung. Sie sind gleich wichtig
 * und ungleich häufig: man fasst sie an, wenn etwas Neues dazukommt, und danach
 * monatelang nicht mehr. In einer Liste, die man jeden Tag liest, kosten sie
 * jeden Tag Aufmerksamkeit.
 *
 * Diese Seite legt sie hinter EINEN Eintrag und ordnet sie nach dem, was sie
 * einrichten. Sie fasst nichts an: jede Seite behält ihre Route, ihre
 * Berechtigung und ihren Inhalt — es ändert sich nur der Weg dorthin. Damit ist
 * der Umbau rückholbar, und ob einzelne dieser Seiten später verschmelzen, ist
 * eine eigene Entscheidung.
 *
 * Bewusst Kacheln und keine Reiterleiste: neun Reiter wären wieder das, was
 * hier gerade abgeschafft wird.
 */
#[Layout('layouts.admin')]
class Setup extends Component
{
    public function render()
    {
        return view('livewire.admin.setup', [
            'groups' => $this->visibleGroups(),
        ])->title(__('setup.title'));
    }

    /**
     * Nur, was dieser Betreiber auch öffnen darf — und keine leere Gruppe.
     *
     * Eine Kachel, die zu einer 403 führt, ist schlimmer als eine fehlende:
     * sie sieht aus wie ein Weg. Dieselbe Prüfung, die x-shell.nav je Eintrag
     * anwendet, damit beide Wege zu einer Seite dieselbe Antwort geben.
     *
     * @return array<string, array<int, array{0:string,1:string,2:string,3:mixed}>>
     */
    private function visibleGroups(): array
    {
        $sichtbar = [];

        foreach (Navigation::setup() as $gruppe => $kacheln) {
            $erlaubt = array_values(array_filter(
                $kacheln,
                fn (array $kachel) => $this->mayOpen($kachel[3]),
            ));

            if ($erlaubt !== []) {
                $sichtbar[$gruppe] = $erlaubt;
            }
        }

        return $sichtbar;
    }

    private function mayOpen(mixed $capability): bool
    {
        if ($capability === null) {
            return true;
        }

        $betreiber = auth('operator')->user();

        return is_array($capability)
            ? collect($capability)->contains(fn (string $eine) => (bool) $betreiber?->can($eine))
            : (bool) $betreiber?->can($capability);
    }
}
