#pragma once

#include <array>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

namespace slp
{
struct ConfigData
{
    std::string name;
    std::string type;
    std::string port;

    friend std::istream& operator>>(std::istream& str, ConfigData& data)
    {
        std::string line;
        constexpr auto DELIMITER = " ";
        size_t delimtrPos = 0;
        size_t delimtrPrevPos = 0;
        std::array<std::string, 3> tokens;
        std::getline(str, line);
        size_t count = 0;

        delimtrPos = line.find(DELIMITER, delimtrPrevPos);
        while (delimtrPos != std::string::npos)
        {
            tokens[count] =
                line.substr(delimtrPrevPos, (delimtrPos - delimtrPrevPos));
            delimtrPrevPos = delimtrPos + 1;

            delimtrPos = line.find(DELIMITER, delimtrPrevPos);
            if (delimtrPos == std::string::npos &&
                delimtrPrevPos < line.length())
            {
                delimtrPos = line.length();
            }

            count++;
        }

        if (count > 2)
        {
            data.name = tokens[0];
            data.type = tokens[1];
            data.port = tokens[2];
        }
        else
        {
            str.setstate(std::ios::failbit);
        }
        return str;
    }
};
} // namespace slp