=head1 NAME

CLIPSeqTools::App::all - Run all clipseqtools analyses

=head1 SYNOPSIS

clipseqtools all [options/parameters]

=head1 DESCRIPTION

Run all clipseqtools analyses.

=head1 OPTIONS

  Input options for library.
    --driver <Str>         driver for database connection (eg. mysql,
                           SQLite).
    --database <Str>       database name or path to database file for file
                           based databases (eg. SQLite).
    --table <Str>          database table.
    --host <Str>           hostname for database connection.
    --user <Str>           username for database connection.
    --password <Str>       password for database connection.
    --records_class <Str>  type of records stored in database.
    --filter <Filter>      filter library. May be used multiple times.
                           Syntax: column_name="pattern"
                           e.g. keep reads with deletions AND not repeat
                                masked AND longer than 31
                                -filter deletion="def"
                                -filter rmsk="undef" .
                                -filter query_length=">31".
                           Operators: >, >=, <, <=, =, !=, def, undef

  Other input
    -gtf <Str>             GTF file with genes/transcripts. [Required]
    -rname_sizes <Str>     file with sizes for reference alignment sequences
                           (rnames). Must be tab delimited (chromosome\tsize)
                           with one line per rname. [Required]

  Output
    --o_prefix <Str>       output path prefix. Script will create and add
                           extension to path. [Default: ./]

  Other options.
    --allowed_dis <Int>    reads closer than this value are assembled in
                           clusters. Default: 0
    --plot                 call plotting script to create plots.
    -v --verbose           print progress lines and extra information.
    -h -? --usage --help   print help message

=cut

package CLIPSeqTools::App::all;


# Make it an app command
use MooseX::App::Command;
extends 'CLIPSeqTools::App';


#######################################################################
#######################   Load External modules   #####################
#######################################################################
use Modern::Perl;
use autodie;
use namespace::autoclean;


#######################################################################
#######################   Command line options   ######################
#######################################################################
option 'rname_sizes' => (
	is            => 'rw',
	isa           => 'Str',
	required      => 1,
	documentation => 'file with sizes for reference alignment sequences (rnames). Must be tab delimited (chromosome\tsize) with one line per rname.',
);


#######################################################################
##########################   Consume Roles   ##########################
#######################################################################
with
	"CLIPSeqTools::Role::Option::Library" => {
		-alias    => { validate_args => '_validate_args_for_library' },
		-excludes => 'validate_args',
	},
	"CLIPSeqTools::Role::Option::Genes" => {
		-alias    => { validate_args => '_validate_args_for_genes' },
		-excludes => 'validate_args',
	},
	"CLIPSeqTools::Role::Option::Plot" => {
		-alias    => { validate_args => '_validate_args_for_plot' },
		-excludes => 'validate_args',
	},
	"CLIPSeqTools::Role::Option::OutputPrefix" => {
		-alias    => { validate_args => '_validate_args_for_output_prefix' },
		-excludes => 'validate_args',
	};


#######################################################################
########################   Interface Methods   ########################
#######################################################################
sub validate_args {
	my ($self) = @_;

	$self->_validate_args_for_library;
	$self->_validate_args_for_genes;
	$self->_validate_args_for_plot;
	$self->_validate_args_for_output_prefix;
}

sub run {
	my ($self) = @_;

	my %options;

	$options{'driver'}        = $self->driver        if defined $self->driver;
	$options{'database'}      = $self->database      if defined $self->database;
	$options{'table'}         = $self->table         if defined $self->table;
	$options{'host'}          = $self->host          if defined $self->host;
	$options{'user'}          = $self->user          if defined $self->user;
	$options{'password'}      = $self->password      if defined $self->password;
	$options{'records_class'} = $self->records_class if defined $self->records_class;
	$options{'filter'}        = $self->filter        if defined $self->filter;
	$options{'o_prefix'}      = $self->o_prefix      if defined $self->o_prefix;
	$options{'gtf'}           = $self->gtf           if defined $self->gtf;
	$options{'rname_sizes'}   = $self->rname_sizes   if defined $self->rname_sizes;
	$options{'plot'}          = $self->plot          if defined $self->plot;
	$options{'verbose'}       = $self->verbose       if defined $self->verbose;

	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::cluster_size_and_score_distribution', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::count_reads_on_genic_elements', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::distribution_on_genic_elements', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::distribution_on_introns_exons', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::genome_coverage', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::genomic_distribution', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::nmer_enrichment_over_shuffled', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::nucleotide_composition', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::reads_long_gaps_size_distribution', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::size_distribution', %options)->run();
	CLIPSeqTools::App->initialize_command_class('CLIPSeqTools::App::conservation_distribution', %options)->run();
}


1;
