#!/usr/bin/env raku

use Config;

use Shelve6::Logging;
use Shelve6::Server;
use Shelve6::Store;
use Shelve6::Repository;

my $config-file = 'config.yaml';

my $log = Shelve6::Logging.new('main');
my $config = Config.new();

my @repositories;

$log.info("Shelve6 starting...");
$log.debug("Reading config from $config-file...");
# XXX validate top level keys and that the top is a hash, and that repositories
# is a list
$config.read($config-file);
for @($config.get<repositories>) -> $repo {
    my $repo-object = Shelve6::Repository.new();
    $repo-object.configure($repo);
    push @repositories, $repo-object;
}

my $server = Shelve6::Server.new();
$server.configure($config.get<server>);

my $store-cfg = $config.get<store>;
my $store = Shelve6::Store.new();
$store.configure($config.get<store>);

$log.debug("Starting components...");
$store.start;
for @repositories -> $repo {
    $repo.register-server($server);
    $repo.register-store($store);
    $repo.start;
}
$server.start;

$log.info("Application initialization complete!");

signal(SIGINT).tap: {
    $log.debug("Shutting down components...");
    $server.stop;
    for @repositories -> $repo {
        $repo.stop;
    }
    $store.stop;
    $log.info("Clean shutdown, see you later!");
    exit;
}

sleep;
