<?php

declare(strict_types=1);

namespace App\Framework\Console\Screen;

use App\Framework\Console\ConsoleOutput;

/**
 * Verantwortlich für Bildschirm-Management (Löschen, etc.)
 */
final readonly class Display
{
    public function __construct(
        private ConsoleOutput $output
    ) {
    }

    /**
     * Löscht den gesamten Bildschirm und setzt den Cursor an den Anfang.
     */
    public function clear(): self
    {
        if ($this->output->isTerminal()) {
            // Bildschirm löschen und Cursor an den Anfang setzen
            $this->output->writeRaw(ScreenControlCode::CLEAR_ALL->format());
            $this->output->writeRaw(CursorControlCode::POSITION->format(1, 1));
        }

        return $this;
    }

    /**
     * Löscht die aktuelle Zeile.
     */
    public function clearLine(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::CLEAR_LINE->format());
            $this->output->writeRaw("\r"); // Cursor an den Zeilenanfang
        }

        return $this;
    }

    /**
     * Löscht vom Cursor bis zum Ende des Bildschirms.
     */
    public function clearToEnd(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::CLEAR_BELOW->format());
        }

        return $this;
    }

    /**
     * Löscht vom Cursor bis zum Anfang des Bildschirms.
     */
    public function clearToBeginning(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::CLEAR_ABOVE->format());
        }

        return $this;
    }

    /**
     * Löscht vom Cursor bis zum Ende der Zeile.
     */
    public function clearLineToEnd(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::CLEAR_LINE_RIGHT->format());
        }

        return $this;
    }

    /**
     * Löscht vom Cursor bis zum Anfang der Zeile.
     */
    public function clearLineToBeginning(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::CLEAR_LINE_LEFT->format());
        }

        return $this;
    }

    /**
     * Aktiviert den alternativen Buffer (für Vollbild-Anwendungen).
     */
    public function useAlternateBuffer(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::ALTERNATE_BUFFER->format());
        }

        return $this;
    }

    /**
     * Kehrt zum Hauptbuffer zurück.
     */
    public function useMainBuffer(): self
    {
        if ($this->output->isTerminal()) {
            $this->output->writeRaw(ScreenControlCode::MAIN_BUFFER->format());
        }

        return $this;
    }
}
