<%args>
$user=>undef
$credits=>undef
</%args>
<%init>
#-------------------------------------------------------------------------
# error codes
#-------------------------------------------------------------------------
#  -1 undefined user
#  -2 unknown client
#  -3 mysql error while selecting records
#  -4 mysql error while updating records
#  -5 not enough credits
#-------------------------------------------------------------------------
my ($err, $errstr) = (0,'');
#-------------------------------------------------------------------------
# user tem que existir
#-------------------------------------------------------------------------
return (-1, 'undefined user') unless $user;

#-------------------------------------------------------------------------
# cliente tem que existir
#-------------------------------------------------------------------------
my ($cod_cliente) = $m->comp("/_shared/procs/users/login/user_getclient.m",  user=>$user);
return (-2, 'unknown client') unless $cod_cliente;

#-------------------------------------------------------------------------
# procurar registos com créditos, dando prioridade aos de tipo 2
#-------------------------------------------------------------------------
my %registos;

my $dbh = $m->comp("/_shared/procs/utils/dbi_connect.m", database=>'guianet');
my $sth = $dbh->prepare("select id, creditos_utilizados, creditos_disponiveis 
						from tdownloads_credits_new 
						where cod_cliente='$cod_cliente' 
						and creditos_disponiveis!=0 
						order by tipo_download desc");
						
my $sth_update = $dbh->prepare("update tdownloads_credits_new set creditos_utilizados=creditos_utilizados+?, creditos_disponiveis=creditos_disponiveis-? where id=?");
my $sth_restore = $dbh->prepare("update tdownloads_credits_new set creditos_utilizados=?, creditos_disponiveis=? where id=?");

$sth->execute;
#-------------------------------------------------------------------------
# verificar erros de mysql
#-------------------------------------------------------------------------
if ($sth->err){
	
	return (-3, $sth->errstr);

}else{
	
#-------------------------------------------------------------------------
# ler cada registo da selecção até termos os créditos necessários
#-------------------------------------------------------------------------
	while (my @row = $sth->fetchrow){
		
		my ($id, $creditos_utilizados, $creditos_disponiveis) = @row;
		$registos{$id} = [$creditos_utilizados, $creditos_disponiveis];
		
#-------------------------------------------------------------------------
# usar o primeiro registo que contenha os creditos necessários
#-------------------------------------------------------------------------
		if ($credits <= $creditos_disponiveis){
			
			$sth_update->execute($credits, $credits, $id);
			
			if ($sth_update->err){
				
				($err, $errstr) = (-4, $sth_update->errstr);
				
			}else{
				
				return (0, '');
				
			}
			
#-------------------------------------------------------------------------
# se os créditos não chegam, usar os que estiverem disponíveis e continuar
#-------------------------------------------------------------------------
		}else{
			
			$sth_update->execute($creditos_disponiveis, $creditos_disponiveis, $id);
			
			if ($sth_update->err){
				
				($err, $errstr) = (-4, $sth_update->errstr);
				last;
				
			}

			$credits -= $creditos_disponiveis;
			
		}
		
	}
	
#-------------------------------------------------------------------------
# se ficaram créditos por debitar o ocorreu algum erro,
# restaurar os registos e notificar, retornando o erro
#-------------------------------------------------------------------------
	if ($credits){
		
		($err, $errstr) = (-5,'not enough credits'); 

	}

	if ($err){
		
		foreach my $id (keys %registos){
			
			my $row = $registos{$id};
			my ($creditos_utilizados, $creditos_disponiveis) = @$row;
			$sth_restore->execute($creditos_utilizados, $creditos_disponiveis, $id); # FIXME test this also?
			
		}
		
	}

}

return ($err, $errstr); 
</%init>
