#!/usr/bin/perl

use warnings;
use strict;

my $q = 'AD=Croatia';
my $range_size = 500;

my $dump = @ARGV ? 1 : 0;

$q = 'TS=psychology AND AD=Croatia';

use WWW::Mechanize;
use Data::Dump qw/dump/;

our $mech = WWW::Mechanize->new(
	autocheck => 1,
	cookie_jar => undef,
);

our $step = 0;

sub save_mech {
	my ( $mech, $path ) = @_;
	$step++;
	mkdir '/tmp/isi/' unless -e '/tmp/isi';
	my $base_path = sprintf('/tmp/isi/%04d', $step);
	$path ||= $base_path . ( $mech->{ct} =~ m{html}i ? '.html' : '.txt' );
	$mech->save_content( $path );
	warn "# [$step] $path ", -s $path, " ", $mech->ct, "\n";
	open(my $dump, '>', "$base_path.dump.txt");
	$mech->dump_all($dump);
}

warn "# get session";
$mech->get( 'http://isiknowledge.com/?DestApp=WOS' );
save_mech $mech;

sub search {
	my $q = shift;

	warn "# advanced serach";
	$mech->follow_link( url_regex => qr/AdvancedSearch/ );
	save_mech $mech;

	warn "# cookie_jar ", dump $mech->cookie_jar;

	$mech->submit_form(
		fields => {
			'value(input1)' => $q,
		}
	);
	save_mech $mech;

	warn "# summary";
	$mech->follow_link( url_regex => qr/summary/ );
	save_mech $mech;
}

sub get_results {
	my $q = shift;
	my $from = 1;

	while ( 1 ) {

		my $to = $from + $range_size;

		$mech->submit_form(
			form_name => 'summary_output_form',
			fields => {
				record_select_type => 'range',
				mark_from => $from,
				mark_to => $to,
				mark_id => 'WOS',

				qo_fields => 'fullrecord',
				citedref => 'citedref',

				save_options => 'plain_text',

				fields => 'Full',
				format => 'save',
			},
			button => 'save',
		);
		save_mech $mech;

		if ( $mech->content =~ m{invalid API call} ) {
			$mech->back;
			last;
		}

		warn "range $from - $to [$q]\n";
		$mech->follow_link( url_regex => qr/save_file/ );
		save_mech $mech => "/tmp/isi.$q.$from-$to.txt";

		$from += $range_size;

		$mech->back;
		$mech->back;
		#save_mech $mech;

	}

}


sub citations {
	save_mech $mech;
	warn "# citation report";
	$mech->follow_link( url_regex => qr/search_mode=CitationReport/ );
	save_mech $mech;

	warn "view citing articles";
	$mech->follow_link( url_regex => qr/search_mode=TotalCitingArticles/ );
	save_mech $mech;
}

sub years {
	my $years_url = $mech->find_link( text_regex => qr/more options/ )->url_abs;
	warn "## $years_url";
	$years_url =~ s{ra_name=\w+}{ra_name=PublicationYear} || die "ra_name";
	warn "# refine years (hidden by javascript)";
	warn "http://apps.isiknowledge.com/RAMore.do?product=WOS&search_mode=TotalCitingArticles&SID=T1o6bChdN9PGP1LN1Nh&qid=3&ra_mode=more&ra_name=PublicationYear&db_id=WOS&viewType=raMore\n$years_url\n";
	$mech->get( $years_url );
	save_mech $mech;

	my $html = $mech->content;
	my @years;
	while ( $html =~ s{>(\d\d\d\d)\s\((\d+)\)</label.+?value="PublicationYear_}{} ) {
		push @years, [ $1 => $2 ];
	}
	warn "# years ",dump @years;
	$mech->back;
	return @years;
}

search $q;
years;
get_results $q;

citations;
years;
get_results $q . '.citing';

