<?php
declare(strict_types=1);

namespace App\Framework\Console;

use App\Framework\Console\Components\InteractiveMenu;

final readonly class DemoCommand
{
    #[ConsoleCommand('demo:hello', 'Zeigt eine einfache Hallo-Welt-Nachricht')]
    public function hello(ConsoleInput $input, ConsoleOutput $output): int
    {
        $output->writeWindowTitle('Help Title', 2);

        $name = $input->getArgument(0, 'Welt');

        $output->writeLine("Hallo, {$name}!", ConsoleColor::BRIGHT_GREEN);

        if ($input->hasOption('time')) {
            $output->writeInfo('Aktuelle Zeit: ' . date('Y-m-d H:i:s'));
        }

        return 0;
    }

    #[ConsoleCommand('demo:colors', 'Zeigt alle verfügbaren Farben')]
    public function colors(ConsoleInput $input, ConsoleOutput $output): int
    {
        $output->writeLine('Verfügbare Farben:', ConsoleColor::BRIGHT_WHITE);
        $output->newLine();

        $colors = [
            'BLACK' => ConsoleColor::BLACK,
            'RED' => ConsoleColor::RED,
            'GREEN' => ConsoleColor::GREEN,
            'YELLOW' => ConsoleColor::YELLOW,
            'BLUE' => ConsoleColor::BLUE,
            'MAGENTA' => ConsoleColor::MAGENTA,
            'CYAN' => ConsoleColor::CYAN,
            'WHITE' => ConsoleColor::WHITE,
            'GRAY' => ConsoleColor::GRAY,
        ];

        foreach ($colors as $name => $color) {
            $output->writeLine("  {$name}: Dies ist ein Test", $color);
        }

        $output->newLine();
        $output->writeLine('Spezielle Ausgaben:');
        $output->writeSuccess('Erfolg-Nachricht');
        $output->writeError('Fehler-Nachricht');
        $output->writeWarning('Warnung-Nachricht');
        $output->writeInfo('Info-Nachricht');

        return 0;
    }

    #[ConsoleCommand('demo:interactive', 'Interaktive Demo mit Benutzereingaben')]
    public function interactive(ConsoleInput $input, ConsoleOutput $output): int
    {
        $output->writeLine('Interaktive Demo', ConsoleColor::BRIGHT_CYAN);
        $output->newLine();

        $name = $output->askQuestion('Wie ist Ihr Name?', 'Unbekannt');
        $age = $output->askQuestion('Wie alt sind Sie?');
        $confirmed = $output->confirm('Sind die Angaben korrekt?', true);

        $output->newLine();
        if ($confirmed) {
            $output->writeSuccess("Hallo {$name}, Sie sind {$age} Jahre alt!");
        } else {
            $output->writeWarning('Vorgang abgebrochen.');
        }

        return 0;
    }

    #[ConsoleCommand('demo:menu', 'Zeigt ein interaktives Menü')]
    public function menu(ConsoleInput $input, ConsoleOutput $output): int
    {
        $menu = new InteractiveMenu($output);

        $result = $menu
            ->setTitle('Hauptmenü - Demo Application')
            ->addItem('Benutzer verwalten', function() use ($output) {
                return $this->userMenu($output);
            })
            ->addItem('Einstellungen', function() use ($output) {
                $output->writeInfo('Einstellungen werden geöffnet...');
                return 'settings';
            })
            ->addSeparator()
            ->addItem('Hilfe anzeigen', function() use ($output) {
                $output->writeInfo('Hilfe wird angezeigt...');
                return 'help';
            })
            ->addItem('Beenden', function() use ($output) {
                $output->writeSuccess('Auf Wiedersehen!');
                return 'exit';
            })
            ->showInteractive();

        if ($result) {
            $output->writeInfo("Menü-Rückgabe: {$result}");
        }

        return 0;
    }

    #[ConsoleCommand('demo:simple-menu', 'Zeigt ein einfaches Nummern-Menü')]
    public function simpleMenu(ConsoleInput $input, ConsoleOutput $output): int
    {
        $menu = new InteractiveMenu($output);

        $result = $menu
            ->setTitle('Einfaches Menü')
            ->addItem('Option 1')
            ->addItem('Option 2')
            ->addItem('Option 3')
            ->showSimple();

        $output->writeSuccess("Sie haben gewählt: {$result}");
        return 0;
    }

    #[ConsoleCommand('demo:wizard', 'Zeigt einen Setup-Wizard')]
    public function wizard(ConsoleInput $input, ConsoleOutput $output): int
    {
        $output->writeInfo('🧙 Setup-Wizard gestartet');
        $output->newLine();

        // Schritt 1: Grundeinstellungen
        $output->writeLine('Schritt 1: Grundeinstellungen', ConsoleColor::BRIGHT_CYAN);
        $appName = $input->ask('Name der Anwendung', 'Meine App');
        $version = $input->ask('Version', '1.0.0');

        // Schritt 2: Datenbank
        $output->newLine();
        $output->writeLine('Schritt 2: Datenbank-Konfiguration', ConsoleColor::BRIGHT_CYAN);
        $dbHost = $input->ask('Datenbank-Host', 'localhost');
        $dbName = $input->ask('Datenbank-Name', 'myapp');
        $dbUser = $input->ask('Datenbank-Benutzer', 'root');
        $dbPass = $input->askPassword('Datenbank-Passwort');

        // Schritt 3: Features
        $output->newLine();
        $output->writeLine('Schritt 3: Features auswählen', ConsoleColor::BRIGHT_CYAN);
        $features = $input->multiSelect('Welche Features möchten Sie aktivieren?', [
            'Caching',
            'Logging',
            'Email-Versand',
            'API-Schnittstelle',
            'Admin-Panel'
        ]);

        // Zusammenfassung
        $output->newLine();
        $output->writeLine('🎯 Konfiguration abgeschlossen!', ConsoleColor::BRIGHT_GREEN);
        $output->newLine();
        $output->writeLine('Ihre Einstellungen:');
        $output->writeLine("- App-Name: {$appName}");
        $output->writeLine("- Version: {$version}");
        $output->writeLine("- DB-Host: {$dbHost}");
        $output->writeLine("- DB-Name: {$dbName}");
        $output->writeLine("- Features: " . implode(', ', $features));

        if ($input->confirm('Konfiguration speichern?', true)) {
            $output->writeSuccess('✅ Konfiguration wurde gespeichert!');
        } else {
            $output->writeWarning('❌ Konfiguration wurde nicht gespeichert.');
        }

        return 0;
    }

    /**
     * Hilfsmethode für das Benutzer-Untermenü.
     */
    private function userMenu(ConsoleOutput $output): string
    {
        $menu = new InteractiveMenu($output);

        return $menu
            ->setTitle('Benutzer-Verwaltung')
            ->addItem('Benutzer auflisten', fn() => 'list_users')
            ->addItem('Neuen Benutzer erstellen', fn() => 'create_user')
            ->addItem('Benutzer bearbeiten', fn() => 'edit_user')
            ->addItem('Benutzer löschen', fn() => 'delete_user')
            ->addSeparator()
            ->addItem('← Zurück zum Hauptmenü', fn() => 'back')
            ->showInteractive() ?? 'back';
    }
}
