/**
 * @file EscapeSequence.h
 * @author apio (cloudapio.eu)
 * @brief ANSI escape sequence parsing.
 *
 * @copyright Copyright (c) 2023, the Luna authors.
 *
 */

#pragma once
#include <luna/Vector.h>

enum class EscapeCode
{
    SaveCursor,
    RestoreCursor,
    CursorUp,
    CursorDown,
    CursorForward,
    CursorBack,
    CursorNextLine,
    CursorPreviousLine,
    CursorHorizontalAbsolute,
    SetCursorPosition,
    SelectGraphicRendition,
};

class EscapeSequenceParser
{
  public:
    EscapeSequenceParser(u8 begin);

    Result<bool> advance(u8 byte);

    bool valid() const
    {
        return m_valid;
    }

    const Vector<int>& parameters() const
    {
        return m_parameters;
    }

    EscapeCode code() const
    {
        return m_escape_code;
    }

  private:
    enum class SequenceType
    {
        ESC,
        CSI,
        DCS,
        OSC,
    };

    Vector<u8> m_parameter;
    Vector<int> m_parameters;

    SequenceType m_sequence_type;
    bool m_parsing_parameter { false };
    bool m_valid { false };

    EscapeCode m_escape_code;
};