#!/usr/bin/env perl

use strict;
use warnings;
use Eval::WithLexicals;
use Term::ReadLine;
use YAML;
use Getopt::Long;
use Term::ANSIColor::Markup;
use URI;

use WebService::SyoboiCalendar;

use Encode;
use Term::Encoding qw(term_encoding);
my $encoding = term_encoding;

binmode STDOUT => ":utf8";

GetOptions(
    "plugin=s" => \my @plugins
);
$SIG{INT} = sub { warn "SIGINT\n" };

{ package WebService::SyoboiCalenar::REPLSupport;
    use Config::Pit qw(pit_get);

    my $config = pit_get("cal.syoboi.jp", require => {
        user => "your username on Syoboi Calendar",
        pass => "your password on Syoboi Calendar"
    });
    our $SYOBOI = WebService::SyoboiCalendar->new($config);
    sub search($) {
        my $keyword = shift;
        my $results = $SYOBOI->search_title({title => $keyword});

        print Term::ANSIColor::Markup->colorize("<bold>TID\ttitle</bold>\n");
        my $i = 0;
        for my $result (@$results) {
            my $title = $result->title->title;
            $title =~ s!($keyword)!<yellow>$1</yellow>!g;
            print Term::ANSIColor::Markup->colorize(sprintf("%s\t%s\n", $result->tid, $title));
            last if $i++ > 5;
        }

        return;
    }

    sub timetable {
        my $results = $SYOBOI->timetable(@_);

        print Term::ANSIColor::Markup->colorize("<bold>PID\ttitle\tschedule\t</bold>\n");
        for my $result (@$results[0..5]) {
            next if !($result->{result}->{TID} && $result->{result}->{PID});
            my $program = $result->program;
            my $title = $result->title;
            print Term::ANSIColor::Markup->colorize(sprintf "%s\t%s \t%s ~ %s\n", $result->pid, $title->title, $program->start_time->hms, $program->end_time->hms);
        }

        return;
    }

    sub current {

        my $current = $SYOBOI->current;
        print $current->title->title . "\n";
        $current;
    }

    sub title {
        my $tid = shift;
        $SYOBOI->title($tid); 
    }

    sub program {
        my $pid = shift;
        $SYOBOI->program($pid); 
    }

    sub w($) {
        my $keyword = shift;
        o(URI->new(sprintf('http://ja.wikipedia.org/wiki/%s', $keyword)));
    }

    sub o($) {
        my $url = shift;
        system('open', $url->as_string);
    }
}

my %args = (
    in_package => 'WebService::SyoboiCalenar::REPLSupport',
);

my $eval = @plugins
    ? Eval::WithLexicals->with_plugins(@plugins)->new(%args)
    : Eval::WithLexicals->new(%args);

my $read = Term::ReadLine->new('Perl REPL');
while (1) {
    my $line = $read->readline('syoboirepl$ ');
    exit unless defined $line;
    $line = decode($encoding, $line);
    my @ret; eval {
        local $SIG{INT} = sub { die "Caught SIGINT" };
        @ret = $eval->eval($line); 1;
    } or @ret = ("Error!", $@);
    print Dump $ret[0] if @ret && (!ref($ret[0]) || ref($ret[0]) =~ m/(?:HASH|ARRAY)/);
}
