#!/usr/bin/perl -w

use strict;
use warnings;

use DBI;
use Mojo::Template;
use SReview::Config::Common;
use SReview::Video::ProfileFactory;
use SReview::Files::Factory;
use SReview::Talk;

my $config = SReview::Config::Common::setup;

my $dbh = DBI->connect($config->get('dbistring'), '', '') or die "Cannot connect to database!";

my $talkid = $ARGV[0];

$dbh->prepare("UPDATE talks SET progress='running' WHERE id=?")->execute($talkid);

my $mt = Mojo::Template->new;
$mt->vars(1);

sub run_command($$) {
	my $file = shift;
	my $relative = shift;

	foreach my $command(@{$config->get('upload_actions')}) {
		my @run;
		foreach my $component(@$command) {
			my $rendered = $mt->render($component, {file => $file, relative_file => $relative });
			chomp($rendered);
			push @run, $rendered;
		}
		system(@run);
	}
}

my $actions = $config->get('upload_actions');

exit 0 if(scalar(@$actions) < 1);

my $raw_file = $dbh->prepare("SELECT filename FROM raw_files JOIN talks ON raw_files.room = talks.room JOIN events ON talks.event = events.id WHERE events.name = ? LIMIT 1");
$raw_file->execute($config->get("event"));
$raw_file = $raw_file->fetchrow_hashref();
$raw_file = SReview::Video->new(url => $raw_file->{filename});
my $talk_st = $dbh->prepare("SELECT event, room, room_output, starttime::date AS date, to_char(starttime, 'yyyy') AS year, name AS title, subtitle, slug FROM talk_list WHERE id = ?");
$talk_st->execute($talkid);
my $talkdata = $talk_st->fetchrow_hashref;

my $output_coll = SReview::Files::Factory->create("output", $config->get('outputdir'));
my $inter_coll = SReview::Files::Factory->create("intermediate", $config->get('pubdir'));

my $subdirs = $config->get('output_subdirs');
my @elems = ();

foreach my $subdir(@$subdirs) {
	push @elems, $talkdata->{$subdir};
}

my $reldir = join('/', @elems);

my $talk = SReview::Talk->new(talkid => $talkid);

my @files = ();

if($config->get('cleanup') eq "all" || $config->get('cleanup') eq 'previews') {
	push @files, (
		$inter_coll->get_file(relname => $talk->relative_name . ".mkv"),
		$inter_coll->get_file(relname => $talk->relative_name . ".webm"),
		$inter_coll->get_file(relname => $talk->relative_name . ".webm"),
		$inter_coll->get_file(relname => $talk->relative_name . ".mp4"),
		$inter_coll->get_file(relname => $talk->relative_name . "-post.mkv"),
		$inter_coll->get_file(relname => $talk->relative_name . "-post.webm"),
		$inter_coll->get_file(relname => $talk->relative_name . "-post.mp4"),
		$inter_coll->get_file(relname => $talk->relative_name . "-post.png"),
		$inter_coll->get_file(relname => $talk->relative_name . "-pre.mkv"),
		$inter_coll->get_file(relname => $talk->relative_name . "-pre.webm"),
		$inter_coll->get_file(relname => $talk->relative_name . "-pre.mp4"),
		$inter_coll->get_file(relname => $talk->relative_name . "-pre.png"),
	)
}

foreach my $profile(@{$config->get('output_profiles')}) {
	my $basename = join('.', $talkdata->{slug}, SReview::Video::ProfileFactory->create($profile, $raw_file)->exten());
	my $file = $output_coll->get_file(relname => join('/', $reldir, $basename));
	run_command($file->valid_path_filename, $file->relname);
	if($config->get('cleanup') eq "all" || $config->get('cleanup') eq 'output') {
		push @files, (
			$file,
			$output_coll->get_file(relname => $file->relname . "-multipass-0.log"),
		);
	}
}

if (scalar(@files) > 0) {
	foreach my $file(@files) {
		$file->delete;
	}
}

$dbh->prepare("UPDATE talks SET progress='done' WHERE id = ?")->execute($talkid);
