#pragma once

#include <array>   // Para std::array
#include <string>  // Para std::string
#include "utils.h" // Archivo de utilidades

// Tamaño máximo del nombre
constexpr size_t NAME_SIZE = 3;

// Clase EnterName
class EnterName
{
public:
    EnterName();
    ~EnterName() = default;

    void init(const std::string &name = ""); // Inicializa con un nombre opcional

    void incPosition(); // Incrementa la posición del carácter actual
    void decPosition(); // Decrementa la posición del carácter actual
    void incIndex();    // Incrementa el índice del carácter en la lista
    void decIndex();    // Decrementa el índice del carácter en la lista

    std::string getFinalName() const { return trim(name_.substr(0, position_)); } // Obtiene el nombre final introducido
    std::string getCurrentName() const { return trim(name_); }                    // Obtiene el nombre actual en proceso

    int getPosition() const { return position_; }                   // Posición actual del carácter editado
    bool getPositionOverflow() const { return position_overflow_; } // Indica si la posición excede el límite

private:
    std::string character_list_;                 // Lista de caracteres permitidos
    std::string name_;                           // Nombre en proceso
    size_t position_ = 0;                        // Índice del carácter que se edita
    bool position_overflow_ = false;             // Flag para exceder límite
    std::array<int, NAME_SIZE> character_index_; // Índices a `character_list_`

    void updateNameFromCharacterIndex();              // Actualiza `name_` según `character_index_`
    void initCharacterIndex(const std::string &name); // Inicializa índices desde el nombre
    int findIndex(char character) const;              // Busca el índice de un carácter en `character_list_`
};