#include "enter_name.h"
#include <algorithm> // for max, min

// Constructor
EnterName::EnterName()
{
    init();
}

// Inicializa el objeto
void EnterName::init()
{
    // Obtiene el puntero al nombre
    name = "A";

    // Inicia la lista de caracteres permitidos
    characterList = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-+-*/=?¿<>!\"#$%&/()";
    pos = 0;
    numCharacters = (int)characterList.size();

    // Pone la lista de indices para que refleje el nombre
    updateCharacterIndex();

    // Actualiza el nombre para que ocupe 8 espacios
    updateName();
}

// Incrementa la posición
void EnterName::incPos()
{
    pos++;
    pos = std::min(pos, NAME_LENGHT - 1);
}

// Decrementa la posición
void EnterName::decPos()
{
    pos--;
    pos = std::max(pos, 0);
}

// Incrementa el índice
void EnterName::incIndex()
{
    ++characterIndex[pos];
    if (characterIndex[pos] >= numCharacters)
    {
        characterIndex[pos] = 0;
    }
    updateName();
}

// Decrementa el índice
void EnterName::decIndex()
{
    --characterIndex[pos];
    if (characterIndex[pos] < 0)
    {
        characterIndex[pos] = numCharacters - 1;
    }
    updateName();
}

// Actualiza la variable
void EnterName::updateName()
{
    name.clear();
    for (int i = 0; i < NAME_LENGHT; ++i)
    {
        name.push_back(characterList[characterIndex[i]]);
    }
}

// Actualiza la variable
void EnterName::updateCharacterIndex()
{
    // Rellena de espacios
    for (int i = 0; i < NAME_LENGHT; ++i)
    {
        characterIndex[i] = 0;
    }

    // Coloca los índices en funcion de los caracteres que forman el nombre
    for (int i = 0; i < (int)name.size(); ++i)
    {
        characterIndex[i] = findIndex(name.at(i));
    }
}

// Encuentra el indice de un caracter en "characterList"
int EnterName::findIndex(char character)
{
    for (int i = 0; i < (int)characterList.size(); ++i)
    {
        if (character == characterList[i])
        {
            return i;
        }
    }
    return 0;
}

// Obtiene el nombre
std::string EnterName::getName() const
{
    return name;
}

// Obtiene la posición que se está editando
int EnterName::getPos() const
{
    return pos;
}