<?php

// Strenge Typprüfung für Parameter- und Rückgabetypen aktivieren.
declare(strict_types=1);

namespace App\Controllers;

use App\Services\Ldap\LdapDirectoryService;
use App\Services\Logging\LoggingService;

/**
 * Controller für die Benutzer- und Gruppenanzeige.
 *
 * Aufgaben:
 * - holt über den LdapDirectoryService die Listen von Benutzern und Gruppen
 * - behandelt technische Fehler und bereitet eine Fehlermeldung für die View auf
 * - gibt die Daten an eine View-Datei (public/views/users.php) weiter
 *
 * WICHTIG:
 * - Es werden aktuell nur Daten angezeigt (Read-only).
 * - Es findet keine Änderung im Active Directory statt.
 *
 * NEU:
 * - Gibt ein View-Result-Array zurück, das von index.php + Layout gerendert wird.
 */
class UserManagementController
{
    /** @var array<string, mixed> Vollständige Anwendungskonfiguration (aus config.php) */
    private array $config;

    /** @var LdapDirectoryService Service für das Lesen von Benutzern und Gruppen aus dem LDAP/AD */
    private LdapDirectoryService $directoryService;

    /** @var LoggingService Logger für technische Fehler */
    private LoggingService $logger;

    /**
     * @param array<string, mixed> $config Vollständige Konfiguration aus config.php
     */
    public function __construct(array $config)
    {
        // Komplette Konfiguration speichern (falls später weitere Werte benötigt werden).
        $this->config = $config;

        // LDAP-Konfiguration aus der Gesamt-Konfiguration herausziehen.
        $ldapConfig = $config['ldap'] ?? [];

        // Directory-Service initialisieren, der die eigentliche LDAP-Arbeit übernimmt.
        $this->directoryService = new LdapDirectoryService($ldapConfig);

        // Logging-Service initialisieren.
        $this->logger = new LoggingService($config['logging'] ?? []);
    }

    /**
     * Zeigt Benutzer- und Gruppenliste an.
     * Wird typischerweise über die Route "users" (index.php?route=users) aufgerufen.
     *
     * @return array<string, mixed> View-Result für das zentrale Layout
     */
    public function show(): array
    {
        // Standardwerte für die View-Variablen vorbereiten.
        $error  = null;
        $users  = [];
        $groups = [];

        try {
            // Benutzer- und Gruppenlisten aus dem AD laden.
            $users  = $this->directoryService->getUsers();
            $groups = $this->directoryService->getGroups();
        } catch (\Throwable $exception) {
            // Technische Details ins Log, für den Benutzer eine allgemeine Meldung.
            $this->logger->logException(
                'Fehler beim Laden von Benutzern/Gruppen.',
                $exception,
                [
                    'route'       => 'users',
                    'remote_addr' => $_SERVER['REMOTE_ADDR'] ?? null,
                ]
            );

            $error = 'Fehler beim Laden von Benutzern/Gruppen. '
                . 'Bitte versuchen Sie es später erneut oder wenden Sie sich an den Administrator.';
        }

        // Pfad zur eigentlichen View-Datei bestimmen.
        $viewPath = __DIR__ . '/../../public/views/users.php';

        return [
            'view' => $viewPath,
            'data' => [
                // Die View erwartet aktuell $users, $groups, $error.
                'users'     => $users,
                'groups'    => $groups,
                'error'     => $error,
                'loginPage' => false,
            ],
            'pageTitle'  => 'Benutzer & Gruppen',
            'activeMenu' => 'users',
        ];
    }
}
