#! /usr/bin/env perl

use strict;
use warnings;

use YAML::Any qw/LoadFile/;
use String::Format;

use Glib qw/TRUE FALSE/;
use Gtk2 -init;
use Gtk2::WebKit;
use Gtk2::Gdk::Keysyms;

my %keysyms = %Gtk2::Gdk::Keysyms;

my $config = LoadFile("config.yml");

my $default_mod_mask = Gtk2::Accelerator->get_default_mod_mask;

my $win  = Gtk2::Window->new;
my $box = Gtk2::VBox->new(FALSE, FALSE);

my $entry;
if ($config->{interface}->{uri}) {
    $entry = Gtk2::Entry->new();
}
my $view = Gtk2::WebKit::WebView->new;
my $search = Gtk2::Entry->new();
my $status;
if ($config->{interface}->{status}) {
    $status = Gtk2::Statusbar->new;
}

$win->add($box);
$win->signal_connect(destroy => sub { Gtk2->main_quit });
$win->signal_connect('key-press-event', sub {
    my ($widget , $event) = @_;
    if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{f}) {
        $view->go_forward;
    }
    if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{b}) {
        $view->go_back;
    }
    if ($event->state >= 'control-mask' && $event->keyval == $Gtk2::Gdk::Keysyms{s}) {
        $search->grab_focus;
    }
    return 0;
                      },
    );

if ($config->{interface}->{uri}) {
    $box->pack_start($entry, FALSE, FALSE, FALSE);
}
$box->pack_start_defaults($view);
$box->pack_end($search, FALSE, FALSE, FALSE);
if ($config->{interface}->{status}) {
    $box->pack_end($status, FALSE, FALSE, FALSE);
}
$box->show;

$entry->signal_connect('activate', sub {
    my ($widget, $label) = @_;
    my $text = $widget->get_text();
    $view->open($text);
                     },
    );
$entry->set_activates_default(TRUE);

my $hovering_cid;
if ($config->{interface}->{status}) {
    $view->signal_connect('hovering-over-link', sub {
        my ($widget, $unknown, $link) = @_;
        if (defined($link)) {
            $status->pop($hovering_cid);
            my $cid = $status->get_context_id($link);
            $status->push($cid, $link);
            $hovering_cid = $cid;
        }
        else {
            $status->pop($hovering_cid);
        }
                      },
        );
}
if ($config->{interface}->{uri}) {
$view->signal_connect('load-finished', sub {
    my ($view , $frame) = @_;
    $entry->set_text($view->get_uri);
                      },
    );
}
$view->signal_connect('download-requested', sub {
    my ($view , $download) = @_;
    my $url = $download->get_uri;
    my $cmd = $config->{download};
    my %format = (
        'u' => $url,
        );
    $cmd = stringf($cmd, %format);
    print $cmd, "\n";
    system($cmd);
                      },
    );
$view->signal_connect('mime-type-policy-decision-requested', sub {
    my ($view, $frame, $request, $mime, $decision) = @_;
    if ($view->can_show_mime_type($mime)) {
        $decision->use;
    }
    else {
        $decision->download;
    }
    return TRUE;
                      },
    );

$view->open($ARGV[0] // $config->{homepage});

$search->signal_connect('activate', sub {
    my ($widget, $label) = @_;
    my $text = $widget->get_text();
    if ($text) {
        $view->mark_text_matches($text, FALSE, 0);
        $view->set_highlight_text_matches(TRUE);
        $view->search_text($text, FALSE, FALSE, TRUE);
    }
    else {
        $view->unmark_text_matches();
    }
                        },
    );
$search->set_activates_default(TRUE);

$win->show_all;
Gtk2->main;

