package CPAN::Digger::Run;
use strict;
use warnings;

use Cwd qw(abs_path);
use Data::Dumper qw(Dumper);
use File::Basename qw(dirname);
use File::Spec;
use Getopt::Long qw(GetOptions);

use CPAN::Digger::Index;
use CPAN::Digger::Index::Projects;

our $VERSION = '0.06';

sub run {

	my $root = dirname dirname abs_path $0;

	my %opt;
	GetOptions(
		\%opt,
		'output=s',
		'dbfile=s',

		'cpan=s',
		'filter=s',

		'projects=s',

		'whois',
		'collect',
		'static',
		'process',


		'prepare',
		'pod',
		'syn',
		'outline',
		'critic=s',

		'full',
	) or usage();


	usage('--dbfile required')                            if not $opt{dbfile};
	usage('--cpan or --projects required')                if not $opt{cpan} and not $opt{projects};
	usage("Directory '$opt{cpan}' not found")             if $opt{cpan} and not -d $opt{cpan};
	usage("File '$opt{projects}' not found")              if $opt{projects} and not -e $opt{projects};
	usage('--output required')                            if not $opt{output};
	usage('--output must be given an existing directory') if not -d $opt{output};

	usage('On or more of --collect, --whois  or --process is needed')
		if not $opt{collect}
			and not $opt{whois}
			and not $opt{static}
			and not $opt{process};

	if ( $opt{process} ) {
		usage('On or more of --syn, --pod, --prepare, --outline or --full is needed')
			if not $opt{full}
				and not $opt{syn}
				and not $opt{pod}
				and not $opt{prepare}
				and not $opt{outline};
	}

	$opt{root} = $root;

	if ( delete $opt{full} ) {
		$opt{$_} = 1 for qw(prepare syn pod outline);
	}

	my %run;
	$run{$_} = delete $opt{$_} for qw(collect whois process static);

	$ENV{CPAN_DIGGER_DBFILE} = $opt{dbfile};

	my $cpan =
		$opt{cpan}
		? CPAN::Digger::Index->new(%opt)
		: CPAN::Digger::Index::Projects->new(%opt);

	if ( $run{whois} ) {
		$cpan->update_from_whois;
	}

	if ( $run{collect} ) {
		$cpan->collect_distributions;
	}

	if ( $run{process} ) {
		$cpan->process_all_distros();
	}

	if ( $run{static} ) {
		$cpan->generate_central_files;
	}
}


sub usage {
	my $msg = shift;
	if ($msg) {
		print "\n*** $msg\n\n";
	}
	die <<"END_USAGE";
Usage: perl $0
Required:
   --output PATH_TO_OUTPUT_DIRECTORY
   --dbfile path/to/database.db

One of these is required:
   --cpan PATH_TO_CPAN_MIRROR
   --projects PATH_TO_CONGIG.yml

Optional:
   --filter REGEX   only packages that match the regex will be indexed (can be used with --cpan)

One of these is required:
   --whois          update authors table of the database from the 00whois.xml file
   --collect        go over the CPAN mirror and add the name of each file to the 'distro' table
   --static         copy the static files

   --process  process all distros

If --process is given then one or more of the steps:
   --prepare
   --pod              generate HTML pages from POD
   --syn              generate syntax highlighted source files
   --outline
   --full             do all the steps one by one in the process
   --critic profile   Run Perl::Critic on every file using the give profile (e.g. public/critic-core.ini)

Examples:
$0 --cpan /var/www/cpan --output /var/www/digger --dbfile /var/www/digger/digger.db --collect --whois
$0 --cpan /var/www/cpan --output /var/www/digger --dbfile /var/www/digger/digger.db --filter CPAN-Digger

END_USAGE
}

1;
