#pragma once

#include "utility.hpp"

#include <boost/beast/http/verb.hpp>

#include <cstdint>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

namespace crow
{

enum class ParamType : std::uint8_t
{
    INT,
    UINT,
    DOUBLE,
    STRING,
    PATH,

    MAX
};

struct RoutingParams
{
    std::vector<int64_t> intParams;
    std::vector<uint64_t> uintParams;
    std::vector<double> doubleParams;
    std::vector<std::string> stringParams;

    void debugPrint() const
    {
        std::cerr << "RoutingParams" << '\n';
        for (auto i : intParams)
        {
            std::cerr << i << ", ";
        }
        std::cerr << '\n';
        for (auto i : uintParams)
        {
            std::cerr << i << ", ";
        }
        std::cerr << '\n';
        for (auto i : doubleParams)
        {
            std::cerr << i << ", ";
        }
        std::cerr << '\n';
        for (const std::string& i : stringParams)
        {
            std::cerr << i << ", ";
        }
        std::cerr << '\n';
    }

    template <typename T>
    T get(unsigned) const;
};

template <>
inline int64_t RoutingParams::get<int64_t>(unsigned index) const
{
    return intParams[index];
}

template <>
inline uint64_t RoutingParams::get<uint64_t>(unsigned index) const
{
    return uintParams[index];
}

template <>
inline double RoutingParams::get<double>(unsigned index) const
{
    return doubleParams[index];
}

template <>
inline std::string RoutingParams::get<std::string>(unsigned index) const
{
    return stringParams[index];
}

} // namespace crow
