package BackupPC::CGI::BurnMedia;

use strict;
use BackupPC::CGI::Lib qw(:all);
use BackupPC::SearchLib;
use Data::Dumper;
use vars qw($Cgi %In $MyURL $User %Conf $TopDir $BinDir $bpc);

my $dsn = $Conf{SearchDSN};
my $db_user = $Conf{SearchUser} || '';

sub action() {
	my $cont = "";
	my $title;
	my $subtitle;
	my @files;

	my $dbh = DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 0 } );

	BackupPC::CGI::Lib::NewRequest();
#	$cont = Dumper(%In);
	if (!defined($In{submitBurner})) {
		$title = eval(q{ ${h1($Lang->{Burn_media})}});
		$cont = Dumper(%In);
		$subtitle = eval(q{ ${h2($Lang->{Burn_media_select})}});
		$cont = <<EOF;

	$title
	$subtitle
	
EOF
	      
		$cont .= "Backups that have not been archived:<br>";
		$cont .= BackupPC::SearchLib::displayBackupsGrid( \%In );
	    
	} else {

		my @selected_backup_ids;

		my $total_size = 0;
		my $selected = 0;

		my $parts = 1;
		foreach my $key(keys(%In)) {
			if ($key =~ m/^fcb([0-9]+)_([0-9]+)_([0-9]+)$/gi) {

				my ($host_id, $backup_num, $backup_id) = ($1,$2,$3);
				push @selected_backup_ids, $backup_id;
				my $currSize = BackupPC::SearchLib::getGzipSizeFromBackupID($backup_id);
				my $sth_size = $dbh->prepare(q{select inc_size from backups where id = ?});
				$sth_size -> execute( $backup_id );
				my $db_size = $sth_size->fetchrow_hashref()->{inc_size};

				if ($db_size != $currSize) {
					$cont .= "NOT EQUAL!: [fs_size:$currSize, db_size:$db_size, backup_id:$backup_id] <br />";
				}
				
				if ($currSize > 0) {
					$total_size += $currSize;
				} 
				$selected++;

				my ($this_part) = $dbh->selectrow_array("select parts from backups where id = ?", undef, $backup_id);
				$this_part--;
				$parts += $this_part;
			} 
		}

		if ($total_size > ($Conf{MaxArchiveSize} * $parts)) {
			$cont .= eval( q{ ${h2(Error)}});
			$cont .= "Selected backups size " . sprintf("%1.2f", $total_size / 1024) ." Kb exceed max archive size " . sprintf("%1.2f", $Conf{MaxArchiveSize} / 1024) ." Kb.";
		} elsif ($total_size == 0) {
			$cont .= eval( q{ ${h2(Error)}});
			$cont .= "No backups selected.";
		} else {

			# create new archive
			my $sth = $dbh->prepare(q{
				INSERT INTO archive (
					id,
					dvd_nr,
					note,
					username,
					date,
					total_size
				) VALUES (
					nextVal('archive_id_seq'),
					nextVal('dvd_nr'),
					?,
					?,
					NOW(),
					?
				)
			});

			$sth->execute($In{'note'}, $User, $total_size);

			foreach my $backup_id (@selected_backup_ids) {

				# link backups with archive
				my $sth = $dbh->prepare(q{
					INSERT INTO archive_backup (
						archive_id, backup_id
					) VALUES (
						(SELECT last_value FROM archive_id_seq), ?
					)
				});

				$sth->execute($backup_id);

				$dbh->commit();

			}

			my ($dvd_nr) = $dbh->selectrow_array(qq{
				select last_value from dvd_nr
			});

			$dvd_nr ||= 'error';

			$dbh->commit();

			my $db_size = 0;
			$sth = $dbh->prepare('SELECT SUM(gzip_size) AS suma FROM backups_on_dvds WHERE dvd_nr=?');
			$sth->execute($dvd_nr);
			$db_size = $sth->fetchrow_hashref()->{suma};
			$sth->finish();
			
			$cont .= q{
				Archived following backups:
			} . join(", ", @selected_backup_ids) . q{
				<br/>with total size of
			<b>} . sprintf("%1.2f Mb", $total_size / 1024 / 1024) 
			. q{</b>
				to media <b>} . $dvd_nr . q{</b>
				with following message:
				<div style="background-color: #e0e0e0; display: inline; padding: 2px;">
			} . $In{'note'} . q{
				</div>
			};
		}
	}

	Header($Lang->{Burn_media}, "", 1, "", $cont);

	Trailer();
	$dbh->disconnect();
}

1;
