<?php 

class Loan{

    public function cancelLoan(){
        global $database;

        if(isset($_GET['cancelar']) && !empty($_GET['cancelar'])){

            $id = $_GET['cancelar'];

            $credito = $database->query("SELECT cr.*,cli.nome_cliente,cli.id_cliente FROM creditos cr INNER JOIN clientes cli
            ON cr.id_cliente = cli.id_cliente WHERE cr.id='$id'");
            $dados = $database->fetch_assoc($credito);

            $id_cliente = $dados['id_cliente'];
            $valor = $dados['valor'];

            $conta_id = $dados['conta'];

            $user = $_SESSION['nome'];
            $now = date('Y-m-d');
            $hora = date("H:i", mktime(gmdate("H")+2, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")));


            $buscaConta = $database->query("SELECT * FROM contas WHERE id='$conta_id'");
            $dados_conta = $database->fetch_assoc($buscaConta);
            $saldoActual = $dados_conta['saldo'];

            $saldoNovo = $saldoActual + $valor;

            $updateCreditos = $database->query("UPDATE creditos SET status='rejeitado' WHERE id='$id'");
            if($updateCreditos){
                $updateConta = $database->query("UPDATE contas SET saldo='$saldoNovo' WHERE id='$conta_id'");
                $insereTrans = $database->query("INSERT INTO transacoes(descricao,saida,entrada,saldo,caixa,id_cliente,data,hora,user)
                VALUES('Cancelamento de credito de $cliente','0','$valor','$saldoNovo','$conta_id','$id_cliente','$now','$hora','$user')");
           
        
           echo "<script>alert('Credito de $cliente cancelado com sucesso')</script>";
           echo "<script>window.open('mensais.php','_self')</script>";
        }else{
           
            echo "<script>alert('Ocorreu um erro')</script>";
            echo "<script>window.open('mensais.php','_self')</script>"; 
        }

        }
    }


    public function Addcreditos(){
        global $database;
        
        if(isset($_POST['cad_creditos'])){

            $nome = $_POST['nome'];
            $tipo_credito = $_POST['tipo_credito'];
            $taxas_de_juros = $_POST['taxas_de_juros'];
            $juros_de_mora = $_POST['juros_de_mora'];
          

            $taxaJurosConverted = $taxas_de_juros / 100;
            $jurosDemoraConverted = $juros_de_mora / 100;


            $sql = $database->query("INSERT INTO tipos_creditos(nome,tipo_credito,taxas_de_juros,juros_de_mora)
            VALUES('$nome','$tipo_credito','$taxaJurosConverted','$jurosDemoraConverted')");
            if($sql){
                echo "<script>alert('Credito cadastrado com sucesso')</script>";
                echo "<script>window.open('tipos_creditos.php','_self')</script>";
            }else{
                echo "<script>alert('Ocorreu um erro')</script>";
                echo "<script>window.open('tipos_creditos.php','_self')</script>";
            }
        }
    }

    public function updateLoan(){
        global $database;
        if(isset($_POST['update_creditos'])){
            
            $this->id = $_POST['id'];
            $this->nome = $_POST['nome'];
            $this->tipo_credito = $_POST['tipo_credito'];
            $this->taxas_de_juros = $_POST['taxas_de_juros'];
            $this->juros_de_mora = $_POST['juros_de_mora'];
            $this->taxa_esforco = $_POST['taxa_esforco'];
            $this->prazo_minimo = $_POST['prazo_minimo'];
            $this->prazo_maximo = $_POST['prazo_maximo'];

            $this->taxaJurosConverted = $this->taxas_de_juros / 100;
            $this->jurosDemoraConverted = $this->juros_de_mora / 100;
            $this->taxaEsforcoConverted = $this->taxa_esforco / 100;

            $updateThis = $database->query("UPDATE tipos_creditos SET nome='$this->nome',tipo_credito='$this->tipo_credito',taxas_de_juros='$this->taxaJurosConverted',
            juros_de_mora='$this->jurosDemoraConverted',taxa_esforco='$this->taxaEsforcoConverted',prazo_minimo='$this->prazo_minimo',prazo_maximo='$this->prazo_maximo'
            WHERE id='$this->id' ");

            if($updateThis){
            echo "<script>alert('Credito actualizado com sucesso')</script>";
           echo "<script>window.open('tipos_creditos.php','_self')</script>";
          }else{
            echo "<script>alert('Ocorreu um erro')</script>";
             echo "<script>window.open('tipos_creditos.php','_self')</script>";
}

        }
    }


    public function deleteLoan(){
        global $database;
        if(isset($_GET['id_delete']) && !empty($_GET['id_delete'])){
            $id = $_GET['id_delete'];

            if($sql = $database->query("DELETE FROM tipos_creditos WHERE id='$id'")){
                echo "<script>window.open('tipos_creditos.php','_self')</script>";
            }else{
                echo "<script>alert('Ocorreu um erro')</script>";

            }
        }
    }

    public function returnLoan(){
        global $database;

        if(isset($_GET['delete_Loan']) && !empty($_GET['delete_Loan'])){
            $id = $_GET['delete_Loan'];

            $loan = $database->query("SELECT cr.*,cl.* FROM creditos cr INNER JOIN clientes cl ON cr.id_cliente = cl.id_cliente WHERE cr.id='$id'");
            $fetch = $database->fetch_assoc($loan);
             $conta = $fetch['conta'];
             $valor = $fetch['valor'];
             $cliente = $fetch['nome_cliente'];
             $id_cliente = $fetch['id_cliente'];
             $user = $_SESSION['nome'];
             $hora = date("H:i", mktime(gmdate("H")+2, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")));
             $now = date('Y-m-d');
             $account = $database->query("SELECT * FROM contas WHERE id='$conta'");
             $assoc = $database->fetch_assoc($account);
             $saldoActual = $assoc['saldo'];

             $saldoNovo =$saldoActual + $valor;

             $update = $database->query("UPDATE creditos SET status='rejeitado' WHERE id='$id'");
             if($update){
                $actualiza = $database->query("UPDATE contas SET saldo='$saldoNovo' WHERE id='$conta'");
                $transancoes = $database->query("INSERT INTO transacoes(descricao,saida,entrada,saldo,caixa,id_cliente,data,hora,user)
                VALUES('Cancelamento de credito de $cliente','0','$valor','$saldoNovo','$conta','$id_cliente','$now','$hora','$user')");
                 echo "<script>alert('Credito cancelado com sucesso')</script>";
                 echo "<script>window.open('creditos.php','_self')</script>";
             }
        }
    }




    public function GetTypeLoan(){
        global $database;
        $tipoCredito = $database->query("SELECT * FROM tipos_creditos");
        while($sql = $database->fetch_assoc($tipoCredito)){
            $id = $sql['id'];
            $tipo = $sql['nome'];
            echo "<option value='$id'>$tipo</option>";
        }
    }

    public function fonteCredito(){
        global $database;
        $sql = $database->query("SELECT * FROM fonte_credito");
        while($row = $database->fetch_assoc($sql)){
            $id = $row['id'];
            $name = $row['name'];
            echo "<option value='$id'>$name</option>";
        }
    }
   


   public function prestacoesLimite(){
    global $database;

    $limite = 84;

    for ($x=1; $x <= $limite; $x++){
        echo "<option>$x</option>";
    }
   }

//FUNCAO DE REQUISITAR CREDITO

public function requisitaLoan(){
    global $database;

if(isset($_POST['submitLoan'])){
		$id_cliente = $_POST['nome_cliente'];
		$valor = $_POST['valor'];
		$id_conta_origem = $_POST['conta_origem'];
		$credito_id = $_POST['nome_credito'];
		$prestacoes = $_POST['prestacoes'];
		
		$tipoCredito = $database->query("SELECT * FROM tipos_creditos WHERE id ='$credito_id'");
		$sql = $database->fetch_assoc($tipoCredito);
		if(!$sql){
    die("Erro: tipo de crédito não encontrado");
}

		$taxas = $sql['taxas_de_juros'];
		$tipo = $sql['tipo_credito'];
    
	   $garantias = $_POST['garantias'];
		$estimado = $_POST['estimado'];
		$finalidade = $_POST['finalidade'];
		$tipo_pagamento = $_POST['tipo_pagamento'];
        $fonte = $_POST['fonte'];
		
	      $juros_final = $valor * $taxas * $prestacoes;
			$total = $valor + $juros_final;
	
		$busca_gestor = $database->query("SELECT * FROM clientes WHERE id_cliente='$id_cliente'");
		$trato = $database->fetch_assoc($busca_gestor);
		
		$vendedor = $trato['vendedor'];
		$contacto = $trato['cell1'];
        $tipo_cliente = $trato['tipo_cliente'];

        if($tipo_cliente == 'FP'){                              
        $v_prest = $valor * ($taxas * pow(1 + $taxas, $prestacoes)) / (pow(1 + $taxas, $prestacoes) - 1);
        }else{
		$v_prest = $total / $prestacoes;
        }
		
		$user = isset($_SESSION['nome']) ? $_SESSION['nome'] : 'Sistema';
	    $data = date('Y-m-d');
	    $hora = date("H:i", mktime(gmdate("H")+2, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")));
		
		$buscar_conta2 = $database->query("SELECT * FROM contas WHERE id='$id_conta_origem'");
		$nice_query2 = $database->fetch_assoc($buscar_conta2);
		$saldo_actual_conta = $nice_query2['saldo'];
        $conta = $nice_query2['conta'];
		
        

		
	$tem_um = $database->query("SELECT * FROM creditos WHERE id_cliente='$id_cliente' AND status = 'pendente'");
	$contagem = mysqli_num_rows($tem_um);
	
		$url = 'creditos.php';
	if($saldo_actual_conta < $valor){
		
		$message = "O valor solicitado superior ao disponivel,$conta apenas $saldo_actual_conta.";
		echo "<script>window.open('alertas/alertas_bad.php?url=$url&&message=$message','_self')</script>";
		
	}else{
		$insere = $database->query("INSERT INTO creditos(id_cliente,valor,tipo,prestacoes,taxas,v_prest,juros,total,vendedor,status,data,hora,user,conta,garantias,estimado,finalidade,tipo_pagamento,fonte)
		VALUES('$id_cliente','$valor','$tipo','$prestacoes','$taxas','$v_prest','$juros_final','$total','$vendedor','aguardar','$data','$hora','$user','$id_conta_origem','$garantias','$estimado','$finalidade','$tipo_pagamento','$fonte')");
	
		
		if($insere){
		$message = "Aguarde aprovacao do Admin.Obrigado";
		echo "<script>window.open('alertas/alertas_good.php?url=$url&&message=$message','_self')</script>";
		}else{
		 if(!$insere){
    die("Erro SQL: " . $database->connection->error);
}
		}
		
	 }
	}
}

//BUSCAR CONTA POR ID

public function selectContaId(){	
	global $database;
	
	$buscaConta = $database->query("SELECT * FROM contas");
	while($row = $database->fetch_assoc($buscaConta)){		
		$id = $row['id'];
		$conta = $row['conta'];		
		echo "<option value='$id'>$conta</option>";		
	}	
}

// public function aproveLoan(){
//     global $database;

//     if(isset($_POST['aprove'])){

//         $id_update = $_POST['id'];

//         $credito = $database->query("SELECT cr.*, cl.nome_cliente, cl.cell1, co.saldo, co.conta AS nome_conta
//             FROM creditos cr 
//             INNER JOIN clientes cl ON cr.id_cliente = cl.id_cliente
//             INNER JOIN contas co ON cr.conta = co.id 
//             WHERE cr.id = '$id_update'
//         ");

//         $dados = $database->fetch_assoc($credito);

//         $conta_origem_id = $dados['conta'];
//         $valor           = $dados['valor'];
//         $cliente         = $dados['nome_cliente'];
//         $id_cliente = $dados['id_cliente'];
        
//         // TRATAMENTO DO NÚMERO
//         $contacto_bruto = trim($dados['cell1']);
//         if (substr($contacto_bruto, 0, 4) !== '+258') {
//             if (substr($contacto_bruto, 0, 3) === '258') {
//                 $contacto = '+' . $contacto_bruto;
//             } else {
//                 $contacto = '+258' . $contacto_bruto;
//             }
//         } else {
//             $contacto = $contacto_bruto;
//         }

//         $saldo_actual_conta = $dados['saldo'];
//         $novo_saldo = $saldo_actual_conta - $valor;

//         $user = $_SESSION['nome'];
//         $today = date('Y-m-d');
//         $hora = date('H:i');
        
        
//         $database->query("UPDATE contas SET saldo='$novo_saldo' WHERE id='$conta_origem_id'");
//         $database->query("UPDATE creditos SET status='pendente' WHERE id='$id_update'");

//         if($database->query("INSERT INTO transacoes (descricao,saida,entrada,saldo,caixa,id_cliente,data,hora,user)
//             VALUES('Crédito concedido a $cliente','$valor','0','$novo_saldo','$conta_origem_id','$id_cliente','$today','$hora','$user')")){

//             $message = "Credito concedido com sucesso";
//             $url = "creditos.php";

//           // 1. Tenta obter das variáveis de ambiente globais
//             $apiKey = isset($_ENV['SMS_API_KEY']) ? $_ENV['SMS_API_KEY'] : getenv('SMS_API_KEY');

//           // 2. SEGURANÇA MÁXIMA: Se falhar, lê direto do .env na raiz (baseado no creditos.php)
//             if (!$apiKey) {
//                 $backupEnvPath = __DIR__ . '/.env'; // Se a classe estiver no mesmo nível da raiz
//                 if (!file_exists($backupEnvPath)) {
//                     // Se a classe estiver dentro de uma pasta (ex: classes/), sobe um nível
//                     $backupEnvPath = dirname(__DIR__) . '/.env'; 
//                 }

//                 if (file_exists($backupEnvPath)) {
//                     $linhasBackup = file($backupEnvPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
//                     foreach ($linhasBackup as $linhaB) {
//                         if (strpos(trim($linhaB), '#') === 0) continue;
//                         if (strpos($linhaB, '=') !== false) {
//                             list($nomeB, $valorB) = explode('=', $linhaB, 2);
//                             if (trim($nomeB) === 'SMS_API_KEY') {
//                                 $apiKey = trim(trim($valorB), "\"'");
//                                 break;
//                             }
//                         }
//                     }
//                 }
//             }

//             //Se mesmo com o backup falhar, regista no log
//             if (!$apiKey) {
//                 file_put_contents(
//                     'sms_log.txt',
//                     date('Y-m-d H:i:s') . " - ERRO CRÍTICO: Não foi possível localizar o ficheiro .env ou a chave SMS_API_KEY." . PHP_EOL . "--------------------------------" . PHP_EOL,
//                     FILE_APPEND
//                 );
//             }

//             $baseUrl = 'https://iiywyqfapgqkggvxyvfd.supabase.co/functions/v1/api';
// $texto_base = "Ola $cliente. Vimos por meio desta informar que o seu crédito no valor de $valor MZN foi aprovado,
//  Por favor aproxime-se ao nosso escritorio para assinatura do contrato.
// ";

// //Correção de acentuação: Garante que a string está em UTF-8 puro antes do JSON
// $mensagem_cliente = mb_convert_encoding($texto_base, 'UTF-8', mb_detect_encoding($texto_base, 'UTF-8, ISO-8859-1, ASCII', true));
//             $payload = json_encode([
//                 "to"     => [$contacto],
//                 "body"   => $mensagem_cliente,
//                 "sender" => "FLEUSAMOLA",
//             ]);

//             $ch = curl_init("$baseUrl/sms/send");
//             curl_setopt_array($ch, [
//                 CURLOPT_RETURNTRANSFER => true,
//                 CURLOPT_POST           => true,
//                 CURLOPT_POSTFIELDS     => $payload,
//                 CURLOPT_HTTPHEADER     => [
//                     "X-API-Key: " . $apiKey,
//                     "Content-Type: application/json",
//                 ],
//             ]);

//             $response = curl_exec($ch);

//             if (curl_errno($ch)) {
//                 $erro = curl_error($ch);
//                 file_put_contents(
//                     'sms_log.txt',
//                     date('Y-m-d H:i:s') . " - Erro cURL: $erro" . PHP_EOL,
//                     FILE_APPEND
//                 );
//             } else {
//                 $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//                 file_put_contents(
//                     'sms_log.txt',
//                     date('Y-m-d H:i:s') . PHP_EOL .
//                     "Status: $status" . PHP_EOL .
//                     "Payload: $payload" . PHP_EOL . 
//                     "Resposta: $response" . PHP_EOL .
//                     "--------------------------------" . PHP_EOL,
//                     FILE_APPEND
//                 );
//             }

//             curl_close($ch);
//       $database->query("INSERT INTO sms_log(id_cliente,mensagem)VALUES('$id_cliente','$mensagem_cliente')");
//             echo "<script>window.open('alertas/alertas_good.php?url=$url&&message=$message','_self')</script>";

//         } else {
//             echo "<script>alert('Ocorreu um erro')</script>";
//         }
//     }
// }


public function aproveLoan(){
    global $database;

    if(isset($_POST['aprove'])){

        $id_update = $_POST['id'];

        $credito = $database->query("SELECT cr.*, cl.nome_cliente, cl.cell1, co.saldo, co.conta AS nome_conta
            FROM creditos cr 
            INNER JOIN clientes cl ON cr.id_cliente = cl.id_cliente
            INNER JOIN contas co ON cr.conta = co.id 
            WHERE cr.id = '$id_update'
        ");

        $dados = $database->fetch_assoc($credito);

        $conta_origem_id = $dados['conta'];
        $valor           = $dados['valor'];
        $cliente         = $dados['nome_cliente'];
        $id_cliente      = $dados['id_cliente'];
        
        // TRATAMENTO DO NÚMERO
        $contacto_bruto = trim($dados['cell1']);
        if (substr($contacto_bruto, 0, 4) !== '+258') {
            if (substr($contacto_bruto, 0, 3) === '258') {
                $contacto = '+' . $contacto_bruto;
            } else {
                $contacto = '+258' . $contacto_bruto;
            }
        } else {
            $contacto = $contacto_bruto;
        }

        $saldo_actual_conta = $dados['saldo'];
        $novo_saldo = $saldo_actual_conta - $valor;

        $user = $_SESSION['nome'];
        $today = date('Y-m-d');
        $hora = date('H:i');
        
        $database->query("UPDATE contas SET saldo='$novo_saldo' WHERE id='$conta_origem_id'");
        $database->query("UPDATE creditos SET status='pendente' WHERE id='$id_update'");

        if($database->query("INSERT INTO transacoes (descricao,saida,entrada,saldo,caixa,id_cliente,data,hora,user)
            VALUES('Crédito concedido a $cliente','$valor','0','$novo_saldo','$conta_origem_id','$id_cliente','$today','$hora','$user')")){

            $message = "Credito concedido com sucesso";
            $url = "creditos.php";
            
            // $texto_base = "Ola $cliente. Vimos por meio desta informar que o seu credito no valor de $valor MZN foi aprovado. Por favor aproxime-se ao nosso escritorio para assinatura do contrato.";
   $mensagem_cliente = "Ola $cliente. Vimos por meio desta informar que o seu credito no valor de $valor MZN foi aprovado. Por favor aproxime-se ao nosso escritorio para assinatura do contrato.";
     
   $mensagemSQL = $database->escape_string($mensagem_cliente);
   $contactoSQL = $database->escape_string($contacto);

$database->query("INSERT INTO sms_log(id_cliente,contacto,mensagem,status,tentativas)
    VALUES('$id_cliente','$contactoSQL','$mensagemSQL','pendente','0')");
$sms_id = $database->the_insert_id();  
     
     $resultadoSMS = $this->enviarSMS($contacto,$mensagem_cliente);
    
  if ($resultadoSMS['sucesso']){
    $tentativas =  (int)$resultadoSMS['tentativas'];
    $database->query(" UPDATE sms_log SET status='enviado',tentativas='$tentativas',erro=NULL, enviado_em=NOW()
        WHERE id='$sms_id'
    ");

}else{
    $tentativas = (int)$resultadoSMS['tentativas'];
    $erro = $database->escape_string($resultadoSMS['erro']);

    $database->query("UPDATE sms_log SET status='pendente',tentativas='$tentativas',erro='$erro'
        WHERE id='$sms_id'
    ");
}
     
            echo "<script>window.open('alertas/alertas_good.php?url=$url&&message=$message','_self')</script>";

        } else {
            echo "<script>alert('Ocorreu um erro ao inserir a transação')</script>";
        }
    }
}

public function payLoan(){
    global $database;

if (isset($_POST['payLoan'])) {    
    // 1. Coleta e sanitização básica dos dados do formulário
    $id = $_POST['id'];
    $valor = (float)$_POST['valor'];
    $valorTotalComMulta = $_POST['valorMulta'];
    $jurosMora = $_POST['juros_de_mora'];
    $conta_id = $_POST['conta'];
    $hora = date('H:i');
    $dataPagamento = date('Y-m-d');
    $user = $_SESSION['nome'] ?? 'Sistema';

    // 2. Upload do Comprovativo
    if (isset($_FILES['recibo']) && $_FILES['recibo']['error'] == 0) {
        $extensao = pathinfo($_FILES['recibo']['name'], PATHINFO_EXTENSION);
        $recibo = time() . '_' . uniqid() . '.' . $extensao; 
        $recibo_tmp = $_FILES['recibo']['tmp_name'];    
        if (!is_dir("comprovativos")) {
            mkdir("comprovativos", 0777, true);
        }
        move_uploaded_file($recibo_tmp, "comprovativos/" . $recibo);
    } else {
        die("Erro ao carregar o comprovativo. Código do erro: " . ($_FILES['recibo']['error'] ?? 'Não enviado'));
    }
      
    // 3. Busca de Dados do Crédito e do Cliente (Usando LEFT JOIN na Conta)
    $credito_query = $database->query("SELECT cr.*, cli.*, co.saldo FROM creditos cr INNER JOIN clientes cli ON
     cr.id_cliente = cli.id_cliente LEFT JOIN contas co ON cr.conta = co.id WHERE cr.id = '$id'");
    $associate = $database->fetch_assoc($credito_query);
    
    if (!$associate) {
        die("Erro: Crédito não localizado no sistema.");
    }
    
    $cliente_id = $associate['id_cliente'];
    $totalLoan = (float)$associate['total'];
    $clienteNome = $associate['nome_cliente'];
    $taxa = (float)$associate['taxas'];
    $saldoActual = (float)$associate['saldo'];
    $saldoNovo = $saldoActual + $valor;
    $data_credito = $associate['data'];

    // 4. Cálculo de Prazo Limite (30 Dias)
    $date = new DateTime($data_credito);
    $date->modify('+30 days');
    $dataLimite = $date->format('Y-m-d');

    // 5. Cálculo do Saldo do Crédito Restante
    $verifyPagamentos = $database->query("SELECT saldo FROM pagamentos WHERE id_pagamento = '$id' ORDER BY ID DESC LIMIT 1");
    $fetch = $database->fetch_assoc($verifyPagamentos);
    $countPay = mysqli_num_rows($verifyPagamentos);
    
    $saldoAnterior = ($countPay == 0) ? $totalLoan : (float)$fetch['saldo'];
    $saldoCredito = $saldoAnterior - $valor;

    // 6. Bloco de Decisão (Apenas atualiza o Crédito e define a Mensagem)
    $message = "";

    if ($dataPagamento < $dataLimite && $valor < $totalLoan) {    
        $database->query("UPDATE creditos SET valor='$saldoCredito', v_prest='$saldoCredito', juros='0', total='$saldoCredito' WHERE id='$id'");
        $message = "Credito parcelado dentro do prazo";
        
    } elseif ($dataPagamento < $dataLimite && $valor == $totalLoan) {
        $database->query("UPDATE creditos SET status='Pago' WHERE id='$id'");    
        $message = "Credito pago na totalidade com sucesso";
        
    } elseif ($dataPagamento > $dataLimite && $valor < $totalLoan) {        
        $novoJuro = $saldoCredito * $taxa;
        $totalNovo = $saldoCredito + $novoJuro;
        $database->query("UPDATE creditos SET valor='$saldoCredito', v_prest='$totalNovo', juros='$novoJuro', total='$totalNovo', data='$dataPagamento', hora='$hora' WHERE id='$id'");
        $message = "Credito Recapitalizado com sucesso";
        
    } elseif ($dataPagamento > $dataLimite && $valor == $totalLoan) {        
        $database->query("UPDATE creditos SET status='Pago' WHERE id='$id'");    
        $message = "Credito pago na totalidade com sucesso";
        
    } elseif ($dataPagamento == $dataLimite && $valor < $totalLoan) {        
        $database->query("UPDATE creditos SET valor='$saldoCredito', v_prest='$saldoCredito', juros='0', total='$saldoCredito' WHERE id='$id'");
        $message = "Credito parcelado dentro do prazo";
    }

    // 7. Registro Único das Transações Financeiras e Históricos (Sem repetições!)
    $database->query("INSERT INTO transacoes (descricao, saida, entrada, saldo, caixa,id_cliente,data, hora, user)
                      VALUES ('Pagamento de prestacao de $clienteNome', '0', '$valor', '$saldoNovo', '$conta_id','$cliente_id', '$dataPagamento', '$hora', '$user')");
                      
    $database->query("INSERT INTO pagamentos (id_cliente, valor_pago, id_pagamento, prestacao, juros_de_mora, data, saldo, status)
                      VALUES ('$cliente_id', '$valor', '$id', '$valor', '$jurosMora', '$dataPagamento', '$saldoCredito', 'Pago')");
                      
    $database->query("UPDATE contas SET saldo='$saldoNovo' WHERE id='$conta_id'");
    
    $database->query("INSERT INTO comprovativos (id_cliente, valor_pago, recibo, usuario) 
                      VALUES ('$cliente_id', '$valor', '$recibo', '$user')");
        
    // 8. Redirecionamento Final Único
    $url = "processamentos.php?id=$id&&cliente=" . urlencode($clienteNome);
    echo "<script>window.open('alertas/alertas_good.php?url=$url&&message=" . urlencode($message) . "','_self')</script>";  
    exit;           
}

}


    public function reforcoLoan(){
        global $database;

        if(isset($_POST['submitReforco'])){

            $id_cliente = $_POST['id_cliente'];
            $valor = $_POST['valor'];
            $conta_id = $_POST['conta_origem'];

            $sql = $database->query("SELECT cr.*,cli.*,co.* FROM creditos cr INNER JOIN clientes cli 
            ON cr.id_cliente = cli.id_cliente INNER JOIN contas co ON cr.conta=co.id WHERE cr.id_cliente='$id_cliente' AND cr.status='pendente'");
            $query = $database->fetch_assoc($sql);

            $tipo = $query['tipo'];
            $taxas = $query['taxas'];

            $vendedor = $query['vendedor'];
            $data = $query['data'];
            $garantias = $query['garantias'];
            $estimado = $query['estimado'];
            $finalidade = $query['finalidade'];
            $tipo_pagamento = $query['tipo_pagamento'];
            $prazo = $query['prestacoes'];
            $totalAnterior = $query['valor'];

            $juros = $valor * $taxas;
            $total = $valor + $juros;
            
            
            $novo_saldo = $totalAnterior + $valor;
            $novo_juros = $novo_saldo * $taxas;
            $novo_total = $novo_saldo + $novo_juros;

            $nome_cliente = $query['nome_cliente'];           
            $saldoActual = $query['saldo'];

         if($tipo_cliente == 'FP'){                              
        $v_prest = $valor * ($taxas * pow(1 + $taxas, $prazo)) / (pow(1 + $taxas, $prazo) - 1);
        }else{
		$v_prest = $total / $prazo;
        }
            
            $id = $query['id'];
             
             $now = date('Y-m-d');
            $user = $_SESSION['nome'];
	    $hora = date("H:i", mktime(gmdate("H")+2, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")));

            if($reforco = $database->query("INSERT INTO creditos(id_cliente,valor,tipo,prestacoes,taxas,v_prest,juros,
            total,vendedor,status,data,hora,user,conta,garantias,estimado,finalidade,tipo_pagamento)
            VALUES('$id_cliente','$valor',' $tipo','$prazo','$taxas','$v_prest','$juros','$total',
            '$vendedor','aguardar','$data','$hora','$user','$conta_id','$garantias','$estimado','$finalidade','$tipo_pagamento')")){
            
             $Reports = $database->query("INSERT INTO transacoes(descricao,saida,entrada,saldo,caixa,id_cliente,data,hora,user)
             VALUES('Reforco de credito a $nome_cliente','$valor','0','$saldoActual','$conta_id','$id_cliente','$now','$hora','$user')");             
            
            $url = 'creditos.php';
            $message = "Reforço submetido. Aguarde aprovacao do Admin.";
            echo "<script>window.open('alertas/alertas_good.php?url={$url}&&message={$message}','_self')</script>";
            }else{
                echo "<script>window.open('alertas/alertas_bad.php?url={$url}','_self')</script>";

            }

        }
        
    }

    public function creditosBack(){
	    global $database;
	        
if(isset($_POST['submitBack'])){
    
    $id_cliente = $_POST['id_cliente'];
    $valor = $_POST['valor'];
    $credito_id = $_POST['nome_credito'];
    $garantias = $_POST['garantias'];
    $dataloan = $_POST['data'];
    $conta_id = $_POST['conta_id'];
    
    $tipo_pagamento = $_POST['tipo_pagamento'];
    $prestacoes = $_POST['prestacoes'];

    $clienteQuery = $database->query("
    SELECT nome_cliente, cell1 
    FROM clientes 
    WHERE id_cliente = '$id_cliente'
");

$clienteDados = $database->fetch_assoc($clienteQuery);

$cliente = $clienteDados['nome_cliente'];
$contacto = $clienteDados['cell1'];

$dataConcessao = new DateTime($dataloan);

$dataVencimento = clone $dataConcessao;
$dataVencimento->modify('+30 days');

$dataHoje = new DateTime(date('Y-m-d'));

$diasAtraso = 0;

if ($dataHoje > $dataVencimento) {
    $diasAtraso = $dataVencimento->diff($dataHoje)->days;
}
    
    $search = $database->query("SELECT * FROM tipos_creditos WHERE id='$credito_id'");
    $result = $database->fetch_assoc($search);
    $taxas = $result['taxas_de_juros'];
    
    $juros = $valor * $taxas;
    $total = $valor + $juros;
    
    	$user = $_SESSION['nome'];
	    $data = date('Y-m-d');
	    $hora = date("H:i", mktime(gmdate("H")+2, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")));
    
        $takeUser = $database->query("SELECT * FROM usuarios WHERE nome='$user'");
        $result = $database->fetch_assoc($takeUser);
        $user_id = $result['id_user'];

    if($tipo_pagamento =="Negociado"){
    $query = $database->query("INSERT INTO creditos(id_cliente,valor,tipo,prestacoes,taxas,v_prest,juros,total,vendedor,status,data,hora,user,conta,garantias,estimado,
    finalidade,tipo_pagamento,fonte)VALUES('$id_cliente','$valor','Mensal','$prestacoes','$taxas','$valor','0','$valor','$user_id','pendente','$dataloan','$hora','$user','$conta_id',
    '$garantias','0','N/A','$tipo_pagamento','1')");
    
    echo "<script>alert('Credito Negociado lancado com sucesso')</script>";
    echo "<script>window.open('creditos.php','_self')</script>";
        
    }else{

     $mensagem_cliente = "Ola $cliente. Informamos que o seu credito no valor de $valor MZN, concedido em $dataloan, encontra-se com $diasAtraso dias de atraso. Por favor aproxime-se ao nosso escritorio para regularizar a sua situacao.";


$mensagemSQL = $database->escape_string($mensagem_cliente);
   $contactoSQL = $database->escape_string($contacto);

$database->query("INSERT INTO sms_log(id_cliente,contacto,mensagem,status,tentativas)
    VALUES('$id_cliente','$contactoSQL','$mensagemSQL','pendente','0')");
$sms_id = $database->the_insert_id();  
     
     $resultadoSMS = $this->enviarSMS($contacto,$mensagem_cliente);
    
  if ($resultadoSMS['sucesso']){
    $tentativas =  (int)$resultadoSMS['tentativas'];
    $database->query(" UPDATE sms_log SET status='enviado',tentativas='$tentativas',erro=NULL, enviado_em=NOW()
        WHERE id='$sms_id'
    ");

}else{
    $tentativas = (int)$resultadoSMS['tentativas'];
    $erro = $database->escape_string($resultadoSMS['erro']);

    $database->query("UPDATE sms_log SET status='pendente',tentativas='$tentativas',erro='$erro'
        WHERE id='$sms_id'
    ");
}
    $query = $database->query("INSERT INTO creditos(id_cliente,valor,tipo,prestacoes,taxas,v_prest,juros,total,vendedor,status,data,hora,user,conta,garantias,estimado,
    finalidade,tipo_pagamento,fonte)VALUES('$id_cliente','$valor','Mensal','$prestacoes','$taxas','$total','$juros','$total','$user_id','pendente','$dataloan','$hora','$user','$conta_id',
    '$garantias','0','N/A','$tipo_pagamento','1')");
 
    if($query){
    echo "<script>alert('Credito lançado com sucesso')</script>";
        echo "<script>window.open('creditos.php','_self')</script>";
        
    }else{
  echo "<script>alert('Ocorreu um erro')</script>";
        echo "<script>window.open('creditos.php','_self')</script>";
    }
}      
    
    
 }
}

public function payCambiado(){
    global $database;

    if(isset($_POST['submitFinal'])){

        $id_cliente = $_POST['id_cliente'];
        $id_credito = $_POST['id_credito']; // PEGANDO O ID EXATO DO CRÉDITO SELECIONADO NO RADIO
        $valor = $_POST['valor'];
        $conta_id = $_POST['conta_id'];

        // CORREÇÃO: Buscamos as informações com base no ID do crédito específico, não apenas do cliente
        $findQueries = $database->query("SELECT cr.*, cli.nome_cliente 
                                         FROM creditos cr 
                                         INNER JOIN clientes cli ON cr.id_cliente = cli.id_cliente 
                                         WHERE cr.id = '$id_credito' AND cr.id_cliente = '$id_cliente'");
        
        $associate = $database->fetch_assoc($findQueries);
        
        if(!$associate) {
            echo "<script>alert('Crédito não encontrado ou inválido!');</script>";
            return;
        }
        
        $cliente = $associate['nome_cliente'];
        $totalCapital = $associate['total'];
        $id = $associate['id']; // ID do crédito confirmado
        $taxas = $associate['taxas'];
        $vendedor = $associate['vendedor'];
        $garantias = $associate['garantias'];
        $estimado = $associate['estimado'];
        $finalidade = $associate['finalidade'];
        $user = $_SESSION['nome'];
        $data = date('Y-m-d');
        
        // Ajuste de fuso horário seguro
        $hora = date("H:i"); 

        $accountLoan = $database->query("SELECT * FROM contas WHERE id = '$conta_id'");
        $dadosAccount = $database->fetch_assoc($accountLoan);
        $saldoActual = $dadosAccount['saldo'];
        
        $saldoNew = $saldoActual + $valor;
        $now = date('Y-m-d');
         
        // 1. Atualizar o crédito correto para 'Pago' ou 'finalizado'
        $actualiza = $database->query("UPDATE creditos SET status='Pago' WHERE id='$id'");

        // 2. Inserir o pagamento associado a este ID de crédito específico
        $payments = $database->query("INSERT INTO pagamentos(id_cliente, valor_pago, id_pagamento, prestacao, juros_de_mora, data, saldo, status)
                                      VALUES('$id_cliente', '$valor', '$id', '$valor', '0', '$now', '0', 'Pago')");

        // 3. Atualizar o caixa da conta
        $Account = $database->query("UPDATE contas SET saldo = '$saldoNew' WHERE id='$conta_id'");

        // 4. Gravar a transação no relatório
        $Reports = $database->query("INSERT INTO transacoes(descricao, saida, entrada, saldo, caixa,id_cliente, data, hora, user)
                                     VALUES('Pagamento da prestacao de $cliente (Credito #$id)', '0', '$valor', '$saldoNew', '$conta_id','$id_cliente', '$now', '$hora', '$user')");
             
        $message = "Credito pago na totalidade!";
        $url = 'creditos.php';
        echo "<script>window.open('alertas/alertas_good.php?url=$url&&message=$message','_self')</script>";
    }
}


private function enviarSMS($contacto, $mensagem)
{
    // Evita que a operação seja interrompida facilmente
    @set_time_limit(120);

    $contacto = preg_replace('/\s+/', '', trim($contacto));
    if (substr($contacto, 0, 4) !== '+258') {
        if (substr($contacto, 0, 3) === '258') {
            $contacto = '+' . $contacto;
        } else {
            $contacto = '+258' . $contacto;
        }
    }
    $apiKey = $_ENV['SMS_API_KEY'] ?? getenv('SMS_API_KEY');
    if (!$apiKey){
        $backupEnvPath = __DIR__ . '/.env';

        if (!file_exists($backupEnvPath)) {
            $backupEnvPath = dirname(__DIR__) . '/.env';
        }

        if (file_exists($backupEnvPath)){
            $linhas = file($backupEnvPath,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($linhas as $linha){
                $linha = trim($linha);
                if ($linha === '' || strpos($linha, '#') === 0) {
                    continue;
                }

                if (strpos($linha, '=') !== false){
                    list($nome, $valor) = explode('=', $linha, 2);
                    if (trim($nome) === 'SMS_API_KEY'){
                        $apiKey = trim(trim($valor),"\"'");
                        break;
                    }
                }
            }
        }
    }
    if (!$apiKey){
        return [
            'sucesso' => false,
            'status' => 0,
            'erro' => 'SMS_API_KEY não encontrada.',
            'resposta' => null,
            'tentativas' => 0
        ];
    }
    $baseUrl ='https://iiywyqfapgqkggvxyvfd.supabase.co/functions/v1/api';
    $mensagem = mb_convert_encoding($mensagem,'UTF-8',mb_detect_encoding($mensagem,'UTF-8, ISO-8859-1, ASCII',true));
    $payload = json_encode(
        [
            "to"     => [$contacto],
            "body"   => $mensagem,
            "sender" => "FLEUSAMOLA",
        ],
        JSON_UNESCAPED_UNICODE
    );


    /*
    |--------------------------------------------------------------------------
    | RETRY AUTOMÁTICO
    |--------------------------------------------------------------------------
    */

    $maxTentativas = 3;

    $ultimoErro = '';
    $ultimaResposta = '';
    $ultimoStatus = 0;


    for ($tentativa = 1; $tentativa <= $maxTentativas; $tentativa++){
        $ch = curl_init($baseUrl . "/sms/send");

        curl_setopt_array($ch, [

            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $payload,

            CURLOPT_HTTPHEADER => [
                "X-API-Key: " . $apiKey,
                "Content-Type: application/json",
                "Accept: application/json",
                "Connection: close"
            ],

            /*
            |--------------------------------------------------------------------------
            | TIMEOUTS IMPORTANTES
            |--------------------------------------------------------------------------
            */

            // Tempo máximo para estabelecer conexão
            CURLOPT_CONNECTTIMEOUT => 10,

            // Tempo máximo da operação completa
            CURLOPT_TIMEOUT => 25,

            /*
            |--------------------------------------------------------------------------
            | SEGURANÇA SSL
            |--------------------------------------------------------------------------
            */

            CURLOPT_SSL_VERIFYPEER => true,

            CURLOPT_SSL_VERIFYHOST => 2,
        ]);


        $response = curl_exec($ch);
        $curlErro = curl_error($ch);
        $curlNumero = curl_errno($ch);

        $status = curl_getinfo(
            $ch,
            CURLINFO_HTTP_CODE
        );

        curl_close($ch);


        $ultimaResposta = $response;
        $ultimoStatus = $status;


        /*
        |--------------------------------------------------------------------------
        | SMS ENVIADO
        |--------------------------------------------------------------------------
        */

        if ($curlNumero === 0 && $status >= 200 && $status < 300){
            file_put_contents(__DIR__ . '/sms_log.txt',date('Y-m-d H:i:s') ." - SMS ENVIADO\n" .

                "Contacto: $contacto\n" .
                "Tentativa: $tentativa\n" .
                "HTTP Status: $status\n" .
                "Resposta: $response\n" .

                "--------------------------------\n",

                FILE_APPEND
            );


            return [

                'sucesso' => true,
                'status' => $status,
                'erro' => null,
                'resposta' => $response,
                'tentativas' => $tentativa
            ];
        }


        /*
        |--------------------------------------------------------------------------
        | ERRO
        |--------------------------------------------------------------------------
        */

        if ($curlNumero !== 0){
            $ultimoErro = "Erro cURL ($curlNumero): $curlErro";
        } else{
            $ultimoErro = "HTTP Status: $status";
        }


        file_put_contents(

            __DIR__ . '/sms_log.txt',

            date('Y-m-d H:i:s') .
            " - FALHA SMS\n" .

            "Contacto: $contacto\n" .
            "Tentativa: $tentativa/$maxTentativas\n" .
            "Erro: $ultimoErro\n" .
            "Resposta: $response\n" .

            "--------------------------------\n",

            FILE_APPEND
        );


        /*
        |--------------------------------------------------------------------------
        | AGUARDAR ANTES DA PRÓXIMA TENTATIVA
        |--------------------------------------------------------------------------
        */

        if ($tentativa < $maxTentativas){
            // 2, 4 segundos...
            sleep($tentativa * 2);
        }
    }


    /*
    |--------------------------------------------------------------------------
    | AS 3 TENTATIVAS FALHARAM
    |--------------------------------------------------------------------------
    */

    return [

        'sucesso' => false,
        'status' => $ultimoStatus,
        'erro' => $ultimoErro,
        'resposta' => $ultimaResposta,
        'tentativas' => $maxTentativas
    ];
}

}



$loan = new Loan();


?>