<?php

declare(strict_types=1);

namespace App\Framework\Console\Screen;

/**
 * Cursor-Steuerungscodes nach ANSI-Standard.
 */
enum CursorControlCode: string
{
    // Bewegung
    case UP = "A";           // n Zeilen nach oben
    case DOWN = "B";         // n Zeilen nach unten
    case RIGHT = "C";        // n Spalten nach rechts
    case LEFT = "D";         // n Spalten nach links
    case NEXT_LINE = "E";    // n Zeilen nach unten und an den Anfang
    case PREV_LINE = "F";    // n Zeilen nach oben und an den Anfang
    case COLUMN = "G";       // Zur absoluten Spalte
    case POSITION = "H";     // Zur Position (Zeile;Spalte)

    // Sichtbarkeit
    case HIDE = "?25l";      // Cursor verstecken
    case SHOW = "?25h";      // Cursor anzeigen

    // Andere
    case SAVE = "s";         // Cursorposition speichern
    case RESTORE = "u";      // Cursorposition wiederherstellen

    /**
     * Formatiert den ANSI-Steuerungscode korrekt.
     */
    public function format(int ...$params): string
    {
        // Wenn keine Parameter gegeben sind, aber wir einen speziellen Escape-Code haben
        if (empty($params) && in_array($this, [self::HIDE, self::SHOW])) {
            return "\033[{$this->value}";
        }

        // Wenn keine Parameter, dann ohne formatieren
        if (empty($params)) {
            return "\033[{$this->value}";
        }

        // Wenn Parameter vorhanden sind, formatieren
        $paramStr = implode(';', $params);

        return "\033[{$paramStr}{$this->value}";
    }
}
