#!/usr/bin/env perl

use strict;
use warnings;

use Getopt::Long;
use Pod::Usage;

use Carp;
use English qw/-no_match_vars/;
use Readonly;
use IO::All -utf8;
use List::Compare;
use IO::Interactive qw/is_interactive/;
use FilmAffinity::Movie;
use FilmAffinity::Utils qw/data2tsv/;
use FilmAffinity::UserRating;

=head1 NAME

filmaffinity-get-all-info.pl

=head1 DESCRIPTION

Get information from filmaffinity about a film and all ratings from a user

=head1 VERSION

Version 1.01

=head1 USAGE

  filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder

  filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder --delay=2

  filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder --force

=head1 REQUIRED ARGUMENTS

=over 2

=item --userid=123456

userid from filmaffinity

=item --destination=/home/william/filmaffinity

destination folder

=back

=head1 OPTIONS

=over 2

=item --delay=3

delay between requests

=item --force

force to retrieve all movies

=back

=cut

our $VERSION = '1.01';

Readonly my $DELAY => 5;

my ( $userID, $delay, $destination, $force, $help );

GetOptions(
  'userid=i'      => \$userID,
  'delay=i'       => \$delay,
  'destination=s' => \$destination,
  'force'         => \$force,
  'help'          => \$help,
) || pod2usage(2);

if ( $help || !$userID || !$destination ) {
  pod2usage(1);
  exit 0;
}

setFileSystem();

my $userParser = FilmAffinity::UserRating->new(
  userID => $userID,
  delay  => $delay || $DELAY,
);
my $ref_movies = $userParser->parse();
my $tsv        = data2tsv($ref_movies);
$tsv > io( $destination . '/ratings.list' );

my @listOfRemoteMovieId = keys %{$ref_movies};
my @listOfLocalMovieId  = getListOfLocalMovieId();

my $listCompare =
  List::Compare->new( \@listOfLocalMovieId, \@listOfRemoteMovieId, );

my @listOfMovieToRetrieve =
  $force ? @listOfRemoteMovieId : $listCompare->get_Ronly();

my $progress;
if ( is_interactive() ) {
  my $value = eval {
    require Term::ProgressBar;
    $progress = Term::ProgressBar->new(
      {
        name   => 'jsonize movie information',
        count  => scalar @listOfMovieToRetrieve,
        remove => 1
      }
    );
  };
  if ($EVAL_ERROR) {
    carp
'Could not create progress bar. We can continue, but no progress will be reported';
  }
}

my $count = 0;
foreach my $id (@listOfMovieToRetrieve) {

  my $movie = FilmAffinity::Movie->new(
    id    => $id,
    delay => $delay || $DELAY,
  );
  $movie->parse();
  $movie->myrating( $ref_movies->{$id}->{rating} );

  my $json = $movie->toJSON();
  $json > io( $destination . '/json/' . $id . '.json' );

  $count++;
  $progress->update($count) if $progress;
}

sub setFileSystem {
  mkdir $destination;
  mkdir $destination . '/json';
  return;
}

sub getListOfLocalMovieId {
  my @listOfLocalMovie = ();
  my @content          = io( $destination . '/json' )->all();
  foreach my $file (@content) {
    my $filename = $file->filename;
    $filename =~ s/[.]json//xms;
    push @listOfLocalMovie, $filename;
  }
  return @listOfLocalMovie;
}

=head1 AUTHOR

William Belle, C<< <william.belle at gmail.com> >>

=head1 BUGS AND LIMITATIONS

Please report any bugs or feature requests to C<bug-filmaffinity-userrating at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=FilmAffinity-UserRating>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc filmaffinity-get-all-info.pl

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=FilmAffinity-UserRating>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/FilmAffinity-UserRating>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/FilmAffinity-UserRating>

=item * Search CPAN

L<http://search.cpan.org/dist/FilmAffinity-UserRating/>

=back

=head1 SEE ALSO

L<http://www.filmaffinity.com>

=head1 LICENSE AND COPYRIGHT

Copyright 2013 William Belle.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.

=cut