#!/usr/bin/perl
use strict;
use warnings;

# Usage: ./manual.pl --target=T0283 --type=regular --debug=0

$| = 1;    # Unbuffer STDOUT

use File::Basename;
use DateTime;
use Getopt::Long;

use lib qw(Core);
use lib qw(Classes);

use Configuration;
use LocalConfiguration;
use TargetsManager;
use GroupsManager;
use Distribution;
use Email;
use Thread;

my $target = '';
my $type = '';
my $debug = 1;

if(scalar(@ARGV) < 1) {
    print_usage(basename($0));
    exit(0);
}

my $isparams = GetOptions(
    "target=s"       => \$target,
    "type=s"         => \$type,
    "debug=i"        => \$debug,
);

log_message(sprintf("START | DEBUG MODE %s", $debug ? 'ON' : 'OFF'));

if(($type ne 'regular') && ($type ne 'qa_only')) {
	log_message("INVALID TYPE PARAMETER");
}

my $groups_manager = new GroupsManager();

my $target_id = process_target($target);
my @distribution_servers = $groups_manager->distribution_servers($type);
my $distribution_servers_count = scalar(@distribution_servers);

my @servers = ();
for(my $i = 0; $i < $distribution_servers_count; $i++) {
	push(@servers, $distribution_servers[$i]->{ID});
}

my $servers_count = scalar(@servers);

shuffle(\@servers);

for(my $i = 0; $i < $servers_count; ++$i) {
	sent_request($target_id, $servers[$i], ($type eq 'qa_only') ? 1 : 0);
}

exit(0);

# Helper functions

sub sent_request {
	my ($target_id, $server_id, $is_qa_request) = @_;
	
	my $distribution_manager = new Distribution(0);
	$distribution_manager->submit($target_id, $server_id, $is_qa_request);
}

sub shuffle {
	my ($servers) = @_;
	
	my $servers_count = scalar(@{$servers});
	
	for(my $i = 0; $i < $servers_count; $i++) {
		my $index = int(rand($servers_count - 1));
		
		my $tmp = $$servers[$i];
		$$servers[$i] = $$servers[$index];
		$$servers[$index] = $tmp;
	}
	
	return;
}

sub process_target {
    my ($target) = @_;
    
    my $target_id = 0;
    
    my $targets_manager = new TargetsManager();
    
    # check if valid target passed
    if(!defined($target) || ($target eq '')) {
		log_message(sprintf("Target is required!"));
    } else {
        $target_id = $targets_manager->get_id_by_name($target);
        if($target_id <= 0) {
			log_message(sprintf("ERROR! Target %s wasn't found", $target));
		}
    }
    
    return $target_id;
}

sub print_usage {
    my ($script) = @_;
    
    printf("Usage: %s --target=<TARGET_NAME> --type=<regular|qa_only>\n\n", $script);
    printf(" --target        Target Name\n");
    printf(" --type          Servers Type. Use 'regular' for non qa and 'qa_only' for qa servers.\n");
    printf(" --debug         Debug Mode. 1 or 0 = on/off respectively. 1 by default. Because of security issues\n");
	printf("\n\nExample: ./manual.pl --target=T0283 --type=regular --debug=0");
}

sub log_message {
	my ($message) = @_;
	
	printf("%-30s%s\n", current_time_string(), $message);
}

sub current_time_string {
	my $current = DateTime->now( time_zone => 'America/Los_Angeles' );
	return sprintf("%4d/%02d/%02d %02d:%02d:%02d", $current->year, $current->month, $current->day, $current->hour, $current->minute, $current->second);
}
