#include <fstream>
#include <iostream>
#include <string>
#include "configuration.h"
#include <cassert>

int main(int, char**)
{
    std::fstream fs;
    fs.open("smolbote.cfg", std::fstream::in);
    assert(fs.is_open());

    {
    auto value_map = std::make_unique<Configuration, std::initializer_list<std::pair<std::string, conf_value_t>>>({
        { "test", std::string("unknown") },
        { "integer-1", 20 },
        { "integer-2", 30 }
    });
    value_map->read(fs);

    Configuration::move_global(std::move(value_map));
    fs.close();
    }

    {
        Configuration g;
        assert(g.value<std::string>("test") == "value");
        assert(g.value<std::string>("plugins.path") == "/usr/local/lib/smolbote/plugins");
        assert(g.value<int>("integer-1") == 20);
        assert(g.value<int>("integer-2") == 22);
    }

/*
    {
    const Configuration conf(std::move(value_map));

    assert(conf.value<std::string>("test") == "value");
    assert(conf.value<std::string>("plugins.path") == "/usr/local/lib/smolbote/plugins");
    assert(conf.value<int>("integer-1") == 20);
    assert(conf.value<int>("integer-2") == 22);
    }
*/
    // Configuration is now destroyed


    // This should be a compiler warning
    //const Configuration c(std::move(value_map));
    //assert(c.value<std::string>("test") == "value");

    // This should be a compiler warning and runtime error
    //assert(value_map.value<std::string>("test").value() == "value");

    return 0;
}