#!/usr/bin/perl -w
use strict;
use DBI;
use File::Basename;
use Term::ANSIColor qw(colored);
use Text::CharWidth qw(mbswidth);

my $dbfile = $ENV{"HOME"} . "/.config/slucto/slucto.db";
my $one_invoice = scalar @ARGV >= 1;
my @one;

my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","", {AutoCommit => 0}) ||
	die "connect to db error: " . DBI::errstr;

$dbh->do("PRAGMA foreign_keys = ON");

sub dump_items($) {
	my ($invoice) = @_;
	my $celkem = 0;

	my $data = $dbh->prepare("SELECT item.name, " .
		"invoice_item.note, " .
		"invoice_item.count, invoice_item.price, " .
		"invoice_item.count * invoice_item.price AS celkem " .
		"FROM item, invoice_item " .
		"ON item.id == invoice_item.id_item " .
		"WHERE invoice_item.id_invoice == ?") ||
			die "cannot prepare";
	$data->execute($invoice);
	while (my $item = $data->fetchrow_hashref) {
	#	print Dumper($item);
		my @one_copy = @one;
		my $name = $$item{'name'};
		if (defined $$item{'note'}) {
			$name .= ", " . $$item{'note'};
		}
		if ($one_invoice) {
			foreach (@one_copy) {
				s/\@POLOZKA\@/$name/;
				s/\@PMN\@/$$item{'count'}/;
				s/\@JCENA\@/$$item{'price'}/;
				s/\@PCENA\@/$$item{'celkem'}/;
				print OUT;
			}
		} else {
			printf("    %s%s %4d * %6.2f = %6.2f\n" ,$name,
				' ' x (75 - mbswidth($name)),
				$$item{'count'}, $$item{'price'},
				$$item{'celkem'});
		}
		$celkem += $$item{'celkem'};
	}
	$data->finish;

	return $celkem;
}

my $data = $dbh->prepare("SELECT invoice.id, printf('%.10d', invoice.id) var, " .
	"strftime('%d. %m. %Y', invoice.issuance, 'unixepoch', 'localtime') issuance, " .
	"strftime('%d. %m. %Y', invoice.due, 'unixepoch', 'localtime') due, " .
	"receiver.* FROM invoice, receiver ON invoice.receiver = receiver.ic " .
	($one_invoice ? "WHERE invoice.id = ?" : "")) || die "cannot prepare";

if (!$one_invoice) {
	$data->execute() || die 'cannot execute';
	while (my $invoice = $data->fetchrow_hashref) {
		print colored("ID($$invoice{'id'}) V($$invoice{'issuance'}) " .
			"S($$invoice{'due'}) RCV($$invoice{'name'})\n", 'green');
		dump_items($$invoice{'id'});
	}

	$dbh->disconnect;
	exit 0;
}

my $cislo_faktury = $ARGV[0];
my @search_dirs = (dirname($0) . '/faktura', "/usr/share/slucto/");
my $in = undef;
my $out = "/tmp/faktura_$cislo_faktury.tex";

foreach (@search_dirs) {
	if (-f "$_/faktura.tex") {
		$in = "$_/faktura.tex";
		last;
	}
}

die 'faktura.tex not found in search dirs' unless (defined $in);

open(IN, "<$in") || die "cannot open $in";
my @tex = <IN>;
close(IN);

my $i = 0;
my $beg_idx;

foreach (@tex) {
	if (/\@POLOZKA\@/) {
		$beg_idx = $i;
		last;
	}
	$i++;
}

my @begin = splice(@tex, 0, $beg_idx);
@one = splice(@tex, 0, 1);
my @end = @tex;

$data->execute($cislo_faktury) || die 'cannot execute';
my $invoice = $data->fetchrow_hashref;
if (!defined $invoice) {
	$dbh->disconnect;
	die 'no invoice of that number';
}
#print Dumper($invoice);
$data->finish;

open(OUT, ">$out") || die "cannot open $out";

foreach (@begin) {
	s/\@FAKTURA\@/$$invoice{'id'}/;
	s/\@VARIABILNI\@/$$invoice{'var'}/;
	s/\@VYSTAVENI\@/$$invoice{'issuance'}/;
	s/\@SPLATNOST\@/$$invoice{'due'}/;
	s/\@PRIJEMCENAZEV\@/$$invoice{'name'}/;
	s/\@PRIJEMCEADR1\@/$$invoice{'street'}/;
	s/\@PRIJEMCEADR2\@/$$invoice{'city'}/;
	s/\@PRIJEMCEADR3\@/$$invoice{'zip'}/;
	s/\@PRIJEMCEIC\@/$$invoice{'ic'}/;
	print OUT;
}
my $celkem = dump_items($cislo_faktury);

foreach (@end) {
	s/\@CELKEM\@/$celkem/;
	print OUT;
}

close(OUT);

chdir '/tmp';
system('pdflatex', $out) == 0 or die "cannot exec pdflatex on $out";
exec('xdg-open', "faktura_$cislo_faktury.pdf") or die;

1;
