#!/usr/bin/perl -w
use strict;

use FindBin;
use lib "$FindBin::RealBin/../lib";

use Getopt::Long;
use YAML;
use Plack::Runner;
use File::Pid;
use File::Spec::Functions qw{catfile};

GetOptions(
    'file=s' => \my $CONFIG_FILE,
);

$CONFIG_FILE ||= 'server.yml';
-e $CONFIG_FILE or die "Config file $CONFIG_FILE not found\n";
my $config = YAML::LoadFile($CONFIG_FILE);
my $command = shift or die "Usage: $0 <start|stop>\n";

my %run = (
    start   => \&_start_server,
    stop    => \&_stop_server,
    restart => sub {
        my $config = shift;
        _stop_server($config);
        _start_server($config);
    },
);

exists $run{$command} or die "Unrecognized command $command\n";
$run{$command}->($config);

sub _start_server {
    my $config = shift;
    require BookmarksApp;
    my $app = BookmarksApp->new({ config => $config })->to_app;

    my $server_root = $config->{server_root} || '.';
    my $listen      = ':' . ($config->{port} || 5000);
    my $access_log  = catfile($server_root, 'access');
    my $error_log   = catfile($server_root, 'errors');
    my $pid_file    = catfile($server_root, 'pid');

    my $runner = Plack::Runner->new(server => 'Starman');
    $runner->parse_options(
        '--daemonize',
        '--listen',     $listen,
        '--pid',        $pid_file,
        '--error-log',  $error_log,
        '--access-log', $access_log,
    );
    $runner->run($app);
}

sub _stop_server {
    my $config = shift;
    my $server_root = $config->{server_root} || '.';

    my $pid_path = catfile($server_root, 'pid');
    unless (-e $pid_path) {
        warn "$pid_path does not exist\n";
        return;
    }

    my $pid_file = File::Pid->new({
        file => $pid_path,
    });

    if (my $pid = $pid_file->running) {
        kill 'TERM', $pid;
    }
}
