#pragma once
#include <luna/StringView.h>
#include <luna/Vector.h>

namespace os
{
    class ArgumentParser
    {
      public:
        ArgumentParser() = default;

        Result<void> add_positional_argument(StringView& out, StringView name, bool required);
        Result<void> add_positional_argument(StringView& out, StringView name, StringView fallback);

        Result<void> add_switch_argument(bool& out, char short_flag, StringView long_flag);

        Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required);
        Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback);

        Result<Vector<StringView>> parse(int argc, char* const* argv);

      private:
        struct PositionalArgument
        {
            StringView* out;
            StringView name;
            bool required;
            StringView fallback;
        };

        struct SwitchArgument
        {
            bool* out;
            char short_flag;
            StringView long_flag;
        };

        struct ValueArgument
        {
            StringView* out;
            char short_flag;
            StringView long_flag;
            bool required;
            StringView fallback;
        };

        Vector<PositionalArgument> m_positional_args;
        Vector<SwitchArgument> m_switch_args;
        Vector<ValueArgument> m_value_args;
    };
}