use Irssi;
use Irssi::Irc;
use strict;
use LWP::UserAgent;
use XML::Simple;
use vars qw($VERSION %IRSSI);
#use Data::Dumper;

$VERSION = '0.3';
%IRSSI = (
    authors     => 'Juustro',
    contact     => 'juustro@gmail.com',
    name        => 'spotifyuri',
    description => 'Decode Spotify URIs',
    license     => 'BSD',
    url         => 'http://juustro.evvk.net/spotifyuri.pl',
);

#
# Decode and print information from Spotify URIs
#
# Needs libxml-simple-perl perl module
#
#
# Change log.
# 0.3
#  - Fixed album info
# 0.2
#  - Fixed multi artist tracks
# 0.1
#  - Initial release

sub spotifyuri_public {
    my ($server, $data, $nick, $mask, $target) = @_;
    my $retval = spotifyuri_get($data);
    my $win    = $server->window_item_find($target);
    if ($win) {
        $win->print("$retval", MSGLEVEL_CRAP) if $retval;
    } else {
        Irssi::print("$retval") if $retval;
    }
}
sub spotifyuri_private {
    my ($server, $data, $nick, $mask) = @_;
    my $retval = spotifyuri_get($data);
    my $win    = $server->window_item_find($nick);
    if ($win) {
        $win->print("$retval", MSGLEVEL_CRAP) if $retval;
    } else {
        Irssi::print("$retval") if $retval;
    }
}
sub spotifyuri_get {
    my ($data) = @_;
    my $url = 0;
    my $spotify_url = 0;
    my $type = "";
    if ($data =~ /(http:\/\/open.spotify.com\/|spotify:)(album|artist|track)([:\/])([a-zA-Z0-9]+)\/?/) {
        $url = "http://ws.spotify.com/lookup/1/?uri=spotify:$2:$4";
        $type = $2;
        $spotify_url = "http://open.spotify.com/$2/$4";
	if ($1 =~ /^http/) {
            $spotify_url = 0;
        }
    }
    else {
        return 0;
    }
    my $show_url = Irssi::settings_get_bool('spotifyuri_show_url');
    my $ua = LWP::UserAgent->new(env_proxy=>1, keep_alive=>1, timeout=>5);
    my $xs = XML::Simple->new();
    $ua->agent("irssi/$VERSION " . $ua->agent());
    my $req = HTTP::Request->new('GET', $url);
    my $res = $ua->request($req);
    if ($res->is_success()) {
        my $xml = $xs->XMLin($res->content(), ForceArray => ['artist'], KeyAttr => ['']);
        my $i_name = "";
        my $i_album = "";
        my $i_artist = "";
        my $str = "";
        if ($type eq "track") {
                $i_name = $xml->{name};
                $i_album = $xml->{album}{name};
		my $n=0;
		my $a_size = 0;
		my $a_list = $xml->{artist};
		for my $a_temp (@$a_list) {
			$a_size++;
		}
		for my $artist (@$a_list) {
			if ($n eq 0) {
				$i_artist .= $artist->{name};
			}
			elsif ($n eq ($a_size -1)) {
				$i_artist .= " and ". $artist->{name};
			}
			else {
				$i_artist .= ", ". $artist->{name};
			}
			$n++;
		}
                $str = "[spotify track] $i_artist / $i_album / $i_name";
            }
         if ($type eq "artist") {
                $i_name = $xml->{name};
                $str = "[spotify artist] $i_artist";
            }
         if ($type eq "album") {
                $i_name = $xml->{name};
                $i_artist = $xml->{artist}[0]{name};
                $str = "[spotify album] $i_artist / $i_name";
            }
        if (($show_url == 1) && ($spotify_url =~ /^http/)) {
            $str=$str . "\n[spotify link] $spotify_url";
        }
        return "$str";
    }
    return 0;
}

Irssi::settings_add_bool('spotifyuri', 'spotifyuri_show_url', 1);
Irssi::signal_add_last('message public', 'spotifyuri_public');
Irssi::signal_add_last('message private', 'spotifyuri_private');
