#!/usr/bin/perl

use strict;
use warnings;
no warnings 'redefine';

use Data::Dumper;

use params();
use db();
use markup();
use log();
use config();
use template();
use project();

binmode STDOUT, ":utf8";

my $r = shift;
(my $cgi, my $params, my $error) = params::get($r);
my $config = config::getFromScriptLocation();

#get request
my $request = {
    url    => $ENV{QUERY_STRING},
    params => {
        original => $params,
        checked  => check_params($config, $params)
    },
};

$params = $request->{params}->{checked};

#connect
my $dbh = db::connect($config);

#fill template
my $template_parameters = {};
$template_parameters->{projects}         = getProjects($dbh, $config, $params);

#output template
my $template = $params->{template};
my $out      = '';
template::process($config, $out, $params->{template}, $template_parameters);
print $out;

$out = undef;

sub getProjects {
    my $dbh    = shift;
    my $config = shift;
    my $params = shift;

    my $prev_series_names = undef;
    my $projects          = project::get_sorted($config);

    my $excludedProjects = {};
    if (defined $config->{filter}->{projects_to_exclude}) {
        for my $project (split(/\,/, $config->{filter}->{projects_to_exclude})) {
            $project =~ s/^\s+//g;
            $project =~ s/\s+$//g;
            $excludedProjects->{$project} = 1;
        }
    }

    my $results = [];
    for my $project (@$projects) {
        next if defined $excludedProjects->{ $project->{name} };

        my $series_names = getSeriesNames($dbh, $config, $project->{name}, $params);
        $project->{isEmpty} = 1 if scalar(@$series_names) == 0;
        $project->{series_names} = $series_names;

        $project->{js_name} = $project->{name};
        $project->{js_name} =~ s/[^a-zA-Z\_0-9]/\_/g;
        $project->{js_name} =~ s/\_+/\_/g;

        #mark last series_name entry of all non empty projects
        if ((defined $series_names) && (scalar @$series_names > 0)) {
            $series_names->[-1]->{last}      = 1;
            $prev_series_names->[-1]->{last} = 0
              if (defined $prev_series_names) && (scalar @$prev_series_names > 0);
            $prev_series_names = $series_names;
        }
        push @$results, $project;
    }
    return $results;
}

sub getSeriesNames {
    my $dbh     = shift;
    my $config  = shift;
    my $project = shift;
    my $params  = shift;

    my $bind_values = [];

    my @conds = ();
    if (defined $config->{filter}->{locations_to_exclude}) {
        my @exclude = ();
        for my $location (split(/\,/, $config->{filter}->{locations_to_exclude})) {
            $location =~ s/^\s+//g;
            $location =~ s/\s+$//g;
            push @exclude,      '?';
            push @$bind_values, $location;
        }
        push @conds, 'location not in (' . join(',', @exclude) . ')';
    }

    if (defined $config->{filter}->{projects_to_exclude}) {
        my @exclude = ();
        for my $project (split(/\,/, $config->{filter}->{projects_to_exclude})) {
            $project =~ s/^\s+//g;
            $project =~ s/\s+$//g;
            push @exclude,      '?';
            push @$bind_values, $project;
        }
        push @conds, 'project not in (' . join(',', @exclude) . ')';
    }

    if (($project ne '') && ($project ne 'all')) {
        push @conds,        'project=?';
        push @$bind_values, $project;
    }

    if (($params->{search} ne '')) {
        push @conds,        'series_name like ?';
        push @$bind_values, '%' . $params->{search} . '%';
    }

    my $where = '';
    if (scalar @conds > 0) {
        $where = 'where ' . join(' and ', @conds);
    }

    my $query = qq{
        select series_name, count(series_name) sum
        from calcms_events
        $where
        group by series_name
        order by series_name
    };

    my $series_names = db::get($dbh, $query, $bind_values);

    for my $series (@$series_names) {
        $series->{series_name} = '' unless defined $series->{series_name};
        $series->{series_name} =~ s/\"//g;
        $series->{series_name} = 'ohne'          if $series->{series_name} eq '';
        $series->{series_name} = 'Einzelsendung' if $series->{series_name} eq '_single_';
    }

    return $series_names;
}

sub check_params {
    my $config = shift;
    my $params = shift;

    my $template = template::check($config, $params->{template}, 'series_names.html');

    my $search = $params->{q} || $params->{search} || $params->{term} || '';
    if ($search =~ /([a-z0-9A-Z\_\,]+)/) {
        $search = $1;
    }

    return {
        template => $template,
        search   => $search,
    };
}

