/*
* Author:          Patrick-Christopher Mattulat
* Company:         Lynar Studios
* E-Mail:          webmaster@lynarstudios.com
* Created:         2023-02-08
* Changed:         2023-02-10
*
* */

#include <ls-std/core/evaluator/EmptyStringArgumentEvaluator.hpp>
#include <ls-std/io/section-pair/SectionPairIdentifierArgumentEvaluator.hpp>
#include <ls-std/io/section-pair/SectionPairRow.hpp>
#include <ls-std/io/section-pair/SectionPairRowValueArgumentEvaluator.hpp>

ls::std::io::SectionPairRow::SectionPairRow(const ls::std::io::section_pair_identifier &_key) : ls::std::core::Class("SectionPairRow")
{
  ls::std::core::EmptyStringArgumentEvaluator{_key, "passed key identifier for section pair row is empty!"}.evaluate();
  ls::std::io::SectionPairIdentifierArgumentEvaluator(_key, "section pair key identifier \"" + _key + "\" contains invalid characters!").evaluate();
  this->key = _key;
}

ls::std::io::SectionPairRow::~SectionPairRow() = default;

ls::std::io::section_pair_row_value ls::std::io::SectionPairRow::getKey()
{
  return this->key;
}

::std::string ls::std::io::SectionPairRow::getValue()
{
  return this->values.empty() ? "" : this->values.front();
}

bool ls::std::io::SectionPairRow::isKeyValue()
{
  return this->type == ls::std::io::SectionPairRowEnumType::SECTION_PAIR_ROW_KEY_VALUE;
}

bool ls::std::io::SectionPairRow::isList()
{
  return this->type == ls::std::io::SectionPairRowEnumType::SECTION_PAIR_ROW_LIST;
}

void ls::std::io::SectionPairRow::setValue(const ls::std::io::section_pair_row_value &_value)
{
  ls::std::core::EmptyStringArgumentEvaluator{_value, "passed value for section pair row is empty!"}.evaluate();
  ls::std::io::SectionPairRowValueArgumentEvaluator{_value, "passed value for section pair row \"" + _value + "\" contains invalid characters!"}.evaluate();
  this->_setType(ls::std::io::SectionPairRowEnumType::SECTION_PAIR_ROW_KEY_VALUE);
  this->_setValue(_value);
}

void ls::std::io::SectionPairRow::_setType(const ls::std::io::SectionPairRowEnumType &_type)
{
  if (_type == ls::std::io::SectionPairRowEnumType::SECTION_PAIR_ROW_NOT_IMPLEMENTED)
  {
    this->type = _type;
  }
}

void ls::std::io::SectionPairRow::_setValue(const ls::std::io::section_pair_row_value &_value)
{
  if (!this->values.empty())
  {
    this->values.pop_front();
  }

  this->values.push_back(_value);
}