<?php

declare(strict_types=1);

namespace App\Framework\SyntaxHighlighter;

use SplFileObject;

final readonly class FileHighlighter
{
    public function __invoke(string $filename, int $startLine, int $range, ?int $errorLine = null): string
    {
        $file = new SplFileObject($filename);

        // Zu Zeile 9 springen (Index basiert auf 0, daher Zeile 10 = 9)
        $file->seek($startLine);

        $lines = [];
        for ($i = 0; $i < $range && ! $file->eof(); $i++) {
            $lines[] = $file->current();
            $file->next();
        }

        $code = implode('', $lines);

        $highlighter = new SyntaxHighlighter();

        // PHPStorm-authentisches Darcula Theme
        $darkTheme = [
            'keyword' => '#cc7832',        // Orange für Keywords (class, function, public, etc.)
            'variable' => '#9876aa',       // Lila für Variablen ($var)
            'string' => '#6a8759',         // Grün für Strings
            'identifier' => '#a9b7c6',     // Helles Grau für normale Identifier
            'number' => '#6897bb',         // Blau für Zahlen
            'comment' => '#808080',        // Grau für normale Kommentare
            'doc-comment' => '#629755',    // Grüner für DocBlocks
            'php-tag' => '#cc7832',        // Orange für PHP-Tags
            'operator' => '#a9b7c6',       // Helles Grau für Operatoren
            'constant' => '#9876aa',       // Lila für Konstanten
            'method-call' => '#6897bb',    // Blau für Funktionen/Methoden
            'property' => '#9876aa',       // Lila für Properties
            'class-name' => '#a9b7c6',     // Weiß/Grau für Klassennamen
            'background' => '#2b2b2b',     // PHPStorm Darcula Hintergrund
            'border' => '#555555',         // Border
            'line-number' => '#606366',    // Zeilennummern
        ];

        // CSS-Output zurücksetzen für jeden neuen Aufruf
        $highlighter->resetCssOutput();

        $formatter = $highlighter->getFormatter('html');
        $formatter->setTheme($darkTheme);

        // Optionen für Syntax-Highlighting
        $options = [
            'filename' => basename($filename), // Dateiname für Window-Bar
        ];
        if ($errorLine !== null) {
            $options['highlightLines'] = [$errorLine - 1];
        }

        return $highlighter->highlightFileSegment($code, $startLine, $options);
    }
}
