<?php

declare(strict_types=1);

namespace App\Framework\Mcp\Core\ValueObjects;

/**
 * Enum für unterstützte Output-Formate in MCP Tools
 *
 * Bietet Typsicherheit und zentrale Definition aller verfügbaren Formate
 */
enum OutputFormat: string
{
    case ARRAY = 'array';
    case JSON = 'json';
    case TABLE = 'table';
    case TREE = 'tree';
    case TEXT = 'text';
    case MERMAID = 'mermaid';
    case PLANTUML = 'plantuml';

    /**
     * Gibt eine Beschreibung des Formats zurück
     */
    public function getDescription(): string
    {
        return match ($this) {
            self::ARRAY => 'PHP array format for programmatic use',
            self::JSON => 'JSON format with pretty printing',
            self::TABLE => 'Tabular format with headers and rows',
            self::TREE => 'Hierarchical tree structure',
            self::TEXT => 'Plain text format for human reading',
            self::MERMAID => 'Mermaid diagram syntax',
            self::PLANTUML => 'PlantUML diagram syntax'
        };
    }

    /**
     * Gibt den MIME-Type des Formats zurück
     */
    public function getMimeType(): string
    {
        return match ($this) {
            self::ARRAY => 'application/x-php-array',
            self::JSON => 'application/json',
            self::TABLE => 'text/plain',
            self::TREE => 'text/plain',
            self::TEXT => 'text/plain',
            self::MERMAID => 'text/plain',
            self::PLANTUML => 'text/plain'
        };
    }

    /**
     * Gibt die Dateiendung für das Format zurück
     */
    public function getFileExtension(): string
    {
        return match ($this) {
            self::ARRAY => 'php',
            self::JSON => 'json',
            self::TABLE => 'txt',
            self::TREE => 'txt',
            self::TEXT => 'txt',
            self::MERMAID => 'mmd',
            self::PLANTUML => 'puml'
        };
    }

    /**
     * Prüft ob es sich um ein Diagramm-Format handelt
     */
    public function isDiagram(): bool
    {
        return match ($this) {
            self::MERMAID, self::PLANTUML => true,
            default => false
        };
    }

    /**
     * Prüft ob es sich um ein strukturiertes Format handelt
     */
    public function isStructured(): bool
    {
        return match ($this) {
            self::ARRAY, self::JSON, self::TABLE, self::TREE => true,
            default => false
        };
    }

    /**
     * Prüft ob es sich um ein Plain-Text Format handelt
     */
    public function isPlainText(): bool
    {
        return match ($this) {
            self::TEXT, self::MERMAID, self::PLANTUML => true,
            default => false
        };
    }

    /**
     * Erstellt OutputFormat aus String mit Fallback
     */
    public static function fromString(string $format): self
    {
        return self::tryFrom(strtolower($format)) ?? self::ARRAY;
    }

    /**
     * Gibt alle verfügbaren Formate als Array zurück
     */
    public static function getAllFormats(): array
    {
        return array_map(fn (self $format) => $format->value, self::cases());
    }

    /**
     * Gibt alle Diagramm-Formate zurück
     */
    public static function getDiagramFormats(): array
    {
        return array_map(
            fn (self $format) => $format->value,
            array_filter(self::cases(), fn (self $format) => $format->isDiagram())
        );
    }

    /**
     * Gibt alle strukturierten Formate zurück
     */
    public static function getStructuredFormats(): array
    {
        return array_map(
            fn (self $format) => $format->value,
            array_filter(self::cases(), fn (self $format) => $format->isStructured())
        );
    }
}
