/******************************************************************************!
 * \file mpserver.cpp
 * \author Sebastien Beaugrand
 * \sa http://beaugrand.chez.com/
 * \copyright CeCILL 2.1 Free Software license
 ******************************************************************************/
#include <filesystem>
#include <fstream>
#include <iostream>
#include <argp.h>
#include "List.h"
#include "Player.h"
#include "Server.h"
#include "log.h"

/******************************************************************************!
 * argp
 ******************************************************************************/
const char *argp_program_version =
    "mpserver 1.0.0";
const char *argp_program_bug_address =
    "<sbeaugrand@toto.fr>";
static char doc[] =
    "mpserver -- "
    "C++ music player server with weighted random album selection";
static struct argp_option options[] = {
    { "dir", 'd', "DIR", 0, "music_directory", 0 },
    { 0, 0, 0, 0, 0, 0 }
};
struct arguments
{
    const char* music_directory;
};
static error_t
parse_opt(int key, char* arg, struct argp_state* state)
{
    struct arguments* arguments = static_cast<struct arguments*>(state->input);
    switch (key) {
    case 'd':
        arguments->music_directory = arg;
        DEBUG("music_directory: " << arguments->music_directory);
        break;
    default:
        return ARGP_ERR_UNKNOWN;
    }
    return 0;
}
static struct argp argp = { options, parse_opt, 0, doc, 0, 0, 0 };

/******************************************************************************!
 * \fn main
 ******************************************************************************/
int
main(int argc, char** argv)
{
    struct arguments arguments = { 0 };
    argp_parse(&argp, argc, argv, 0, 0, &arguments);

    Player player;
    player.init();
    if (player.musicDirectory.empty()) {
        if (arguments.music_directory) {
            DEBUG("music_directory from argv");
            player.musicDirectory = arguments.music_directory;
        } else {
            ERROR("no music_directory");
            return 1;
        }
    }

    List list(player.musicDirectory);
    player.resume(list.readResumeTime());

    jsonrpc::HttpServer httpserver(8383, "", "", 2);  // 2 threads
    Server server(httpserver, list, player);

    server.loop.wait(true);
    server.stop();
    return 0;
}