package Toupeira::Files;

# $Id$

use strict;
use vars qw( $VERSION @ISA );
use Carp;
use Storable qw(dclone retrieve store);
use File::Path;
use Toupeira;

# apenas para debug
use Data::Dumper;

$VERSION = '0.1';
@ISA = qw( Toupeira );

##########################################################
# public functions
##########################################################
sub new {
   my $obj = shift;
   my %opts = @_;

   my $new = $obj->SUPER::new(%opts);

   return $new;
}

sub add_download {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my $size = $obj->{global}{config}{MAXD};
   my %ref;

   croak "'username' parameter missing" if !exists $opts{username} || !$opts{username};
   croak "'date' parameter missing" if !exists $opts{date} || !$opts{date};
   croak "'url' parameter missing" if !exists $opts{url} || !$opts{url};
   croak "'store' parameter missing" if !exists $opts{store} || !$opts{store};

   my $current = $obj->count_downloads( username => $opts{username} );
   return 0 if ( $current==$size );

   my $fname = $opts{date}.".".$opts{username}.".".int(rand(65535));
   my $filename = "$path/$fname";

   $opts{filename} = $fname;

   @ref{qw(url date store extra username filename)} = @opts{qw(url date store extra username filename)};

   return $fname if store(\%ref,$filename);
   return 0;
}

sub update_download {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my $size = $obj->{global}{config}{MAXD};
   my %ref;

   croak "'filename' parameter missing" if !exists $opts{filename} || !$opts{filename};
   croak "'username' parameter missing" if !exists $opts{username} || !$opts{username};
   croak "'date' parameter missing" if !exists $opts{date} || !$opts{date};
   croak "'url' parameter missing" if !exists $opts{url} || !$opts{url};
   croak "'store' parameter missing" if !exists $opts{store} || !$opts{store};

   my $filename = "$path/$opts{filename}";

   @ref{qw(url date store extra username filename)} = @opts{qw(url date store extra username filename)};

   return $opts{filename} if store(\%ref,$filename);
   return 0;

}

sub del_download {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};

   croak "'filename' parameter missing" if !exists $opts{filename} || !$opts{filename};
   croak "'username' parameter missing" if !exists $opts{username} || !$opts{username};

   my $tmp = $obj->get_download_info( username => $opts{username}, filename => $opts{filename} );

   return unlink "$path/$opts{filename}" if $tmp;
}

sub queue {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my $qsize = $obj->{global}{config}{QSIZE};
   my $cnt = 0;
   my $queue;

   opendir(DIR, "$path") || die "can't open $path";
   my @dirs = 
        grep { /^[0-9]+\.[a-z]+\.[0-9]+/i }                # just numerics
        readdir(DIR);                   # all files
   close DIR;

   foreach my $filename (sort @dirs) {
      last if $cnt==$qsize;
      #$queue->{$filename} = retrieve("$path/$filename");
      if (exists $opts{username}) {
         push @$queue,$filename if $filename =~ /\.$opts{username}\./i;
         $cnt++ if $filename =~ /\.$opts{username}\./i;
      } else {
         push @$queue,$filename;
         $cnt++;
      }
   }

   return $queue;
}

sub get_download_info {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my $res;

   croak "'filename' parameter missing" if !exists $opts{filename} || !$opts{filename};
   croak "'username' parameter missing" if !exists $opts{username} || !$opts{username};

   $res = retrieve("$path/$opts{filename}");
   return $res if ($res && $opts{username} eq $res->{username}); 
   return {};
}

sub list_downloads {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my $res;
    
   croak "'username' parameter missing" if !exists $opts{username} || !$opts{username};
   foreach my $item (@{$obj->queue( username => $opts{username} )}) {
      my $tmp = $obj->get_download_info( username => $opts{username}, filename => $item );
      push @$res, $tmp if $tmp;
   }
   return $res;
}

sub count_downloads {
   my $obj = shift;
   my %opts = @_;
   my $path = $obj->{global}{config}{QUEUEDIR};
   my @dirs;

   opendir(DIR, "$path") || die "can't open $path";
   @dirs = 
        grep { /^[0-9]+\.[a-z]+\.[0-9]+/i }               
        readdir(DIR) if !exists $opts{username};                 
   @dirs = 
        grep { /^[0-9]+\.$opts{username}\.[0-9]+/i }               
        readdir(DIR) if exists $opts{username};                 
   close DIR;

   return scalar @dirs;
}

1;
__END__
