<?php
require_once __DIR__ . "/config/init.php";
date_default_timezone_set('Africa/Maputo');

$sender  = "FLEUSAMOLA";
$baseUrl = 'https://iiywyqfapgqkggvxyvfd.supabase.co/functions/v1/api';
$logFile = __DIR__ . '/sms_log.txt';

function escreverLog($mensagem){
    global $logFile;
    file_put_contents($logFile,date('Y-m-d H:i:s') . " - " . $mensagem . PHP_EOL,
        FILE_APPEND
    );
}

function normalizarTelefone($numero){
    if (empty($numero)) {
        return false;
    }
    // Remove espaços, traços, parênteses, etc.
    $numero = preg_replace('/\D/', '', trim($numero));
    if (substr($numero, 0, 3) === '258'){
        $numero = substr($numero, 3);
    }
    // Número móvel moçambicano deve possuir 9 dígitos
    if (strlen($numero) !== 9) {
        return false;
    }
    // Normalmente números móveis começam por 8
    if (substr($numero, 0, 1) !== '8'){
        return false;
    }
    return '+258' . $numero;
}


// ============================================================
// FUNÇÃO PARA CARREGAR API KEY
// ============================================================

function obterApiKey(){
    // Primeiro tenta variável de ambiente
    $apiKey = $_ENV['SMS_API_KEY'] ?? getenv('SMS_API_KEY');
    if ($apiKey){
        return $apiKey;
    }
    // Procura .env na raiz atual
    $envPath = __DIR__ . '/.env';
    if (!file_exists($envPath)){
        $envPath = dirname(__DIR__) . '/.env';
    }
    if (!file_exists($envPath)){
        return false;
    }
    $linhas = file($envPath,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) {
            [$nome, $valor] = explode('=', $linha, 2);
            if (trim($nome) === 'SMS_API_KEY'){
                return trim(trim($valor), "\"'");
            }
        }
    }
    return false;
}

function enviarSMS($contacto, $mensagem){
    global $baseUrl;
    global $sender;
    $apiKey = obterApiKey();

    if (!$apiKey){
        escreverLog("ERRO CRÍTICO: SMS_API_KEY não encontrada.");
        return [
            'sucesso' => false,
            'status'  => 0,
            'resposta'=> 'API KEY não encontrada'
        ];
    }
    // Garante UTF-8
    if (!mb_check_encoding($mensagem, 'UTF-8')) {
        $mensagem = mb_convert_encoding($mensagem,'UTF-8','ISO-8859-1');
    }
    $payload = json_encode(        [
            "to"     => [$contacto],
            "body"   => $mensagem,
            "sender" => $sender,
        ],
        JSON_UNESCAPED_UNICODE |
        JSON_UNESCAPED_SLASHES
    );


    if ($payload === false){
        escreverLog("Erro JSON: " . json_last_error_msg());
        return [
            'sucesso' => false,
            'status'  => 0,
            'resposta'=> json_last_error_msg()
        ];
    }
    $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; charset=utf-8",
                "Accept: application/json"
            ],

            CURLOPT_CONNECTTIMEOUT => 15,
            CURLOPT_TIMEOUT        => 30,
        ]
    );


    $response = curl_exec($ch);
    if ($response === false){
        $erro = curl_error($ch);
        curl_close($ch);
        escreverLog("Erro cURL para $contacto: $erro");
        return [
            'sucesso' => false,
            'status'  => 0,
            'resposta'=> $erro
        ];
    }
    $status = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    curl_close($ch);
    // Considera sucesso HTTP 200 até 299
    $sucesso = (
        $status >= 200 &&
        $status < 300
    );


    return [
        'sucesso'  => $sucesso,
        'status'   => $status,
        'resposta' => $response
    ];
}


// ============================================================
// INÍCIO DO PROCESSAMENTO
// ============================================================

escreverLog(
    "===== INÍCIO DA COBRANÇA AUTOMÁTICA ====="
);

$sql = "SELECT c.id AS id_credito,c.id_cliente,c.valor,c.v_prest,c.total,c.status,
        c.data AS data_lancamento,DATE_ADD(STR_TO_DATE(c.data, '%Y-%m-%d'),INTERVAL 30 DAY)
         AS data_vencimento,cli.nome_cliente,cli.cell1,cli.cell2 FROM creditos c INNER JOIN clientes cli
        ON cli.id_cliente = c.id_cliente WHERE LOWER(TRIM(c.status)) = 'pendente' AND (DATE_ADD(
                STR_TO_DATE(c.data, '%Y-%m-%d'),INTERVAL 30 DAY) = CURDATE() OR
            DATE_ADD(STR_TO_DATE(c.data, '%Y-%m-%d'),INTERVAL 30 DAY) = DATE_ADD(CURDATE(),INTERVAL 7 DAY))
      ORDER BY data_vencimento ASC";

$resultado = $database->query($sql);
if (!$resultado){
    escreverLog("ERRO SQL ao procurar créditos.");
    exit;
}


// ============================================================
// CONTADORES
// ============================================================

$totalEncontrados = 0;
$totalEnviados = 0;
$totalErros = 0;


// ============================================================
// LOOP DE TODOS OS CLIENTES
// ============================================================

while ($result = $database->fetch_assoc($resultado)){
    $totalEncontrados++;


    // --------------------------------------------------------
    // DADOS DO CRÉDITO
    // --------------------------------------------------------

    $id_credito = (int) $result['id_credito'];
    $id_cliente = (int) $result['id_cliente'];
    $nome_cliente = trim($result['nome_cliente']);


    $v_prest = (float) $result['v_prest'];
    $data_vencimento = $result['data_vencimento'];
    $valor_formatado = number_format($v_prest,2,',','.');

    $data_formatada = date('d/m/Y',strtotime($data_vencimento));


    // --------------------------------------------------------
    // CALCULA QUANTOS DIAS FALTAM
    // --------------------------------------------------------

    $hoje = new DateTime(date('Y-m-d'));
    $vencimento = new DateTime($data_vencimento);


    $diasRestantes = (int) $hoje->diff($vencimento)->format('%r%a');


    // ========================================================
    // MENSAGEM 7 DIAS ANTES
    // ========================================================

    if ($diasRestantes === 7){

        $mensagem =
            "Prezado(a) {$nome_cliente}, "
            . "a FLEUSA MOLA MICROCREDITO,EI informa que a sua prestação "
            . "no valor de {$valor_formatado} MT vence no dia "
            . "{$data_formatada}. "
            . "Faltam 7 dias para o vencimento. "
            . "Solicitamos que efetue o pagamento dentro do prazo "
            . "para evitar encargos por atraso. "
            . "Agradecemos a sua confiança.";
    }


    // ========================================================
    // MENSAGEM NO DIA DO VENCIMENTO
    // ========================================================

    elseif ($diasRestantes === 0) {

        $mensagem =
            "Prezado(a) {$nome_cliente}, "
            . "a FLEUSA MOLA MICROCREDITO,EI informa que a sua prestação "
            . "no valor de {$valor_formatado} MT vence hoje, "
            . "{$data_formatada}. "
            . "Solicitamos que efetue o pagamento dentro do prazo "
            . "para evitar encargos ou penalidades por atraso. "
            . "Agradecemos a sua confiança.";
    }


    // Segurança extra
    else {

        continue;
    }


    // ========================================================
    // TRATAR TELEFONE
    // ========================================================

    $contacto = normalizarTelefone($result['cell1']);

    // Caso cell1 seja inválido, tenta cell2
    if (!$contacto){
        $contacto = normalizarTelefone(
            $result['cell2']
        );
    }


    if (!$contacto) {

        $totalErros++;

        escreverLog(
            "Telefone inválido | "
            . "Cliente: {$nome_cliente} | "
            . "ID Cliente: {$id_cliente} | "
            . "cell1: {$result['cell1']} | "
            . "cell2: {$result['cell2']}"
        );

        continue;
    }


    // ========================================================
    // ENVIAR SMS
    // ========================================================

    $envio = enviarSMS($contacto,$mensagem);


    // ========================================================
    // SMS ENVIADA
    // ========================================================

    if ($envio['sucesso']) {

        $totalEnviados++;


        escreverLog(
            "SMS ENVIADA | "
            . "Crédito: {$id_credito} | "
            . "Cliente: {$nome_cliente} | "
            . "Telefone: {$contacto} | "
            . "Vencimento: {$data_vencimento} | "
            . "Dias restantes: {$diasRestantes} | "
            . "HTTP: {$envio['status']} | "
            . "Resposta: {$envio['resposta']}"
        );


        // ----------------------------------------------------
        // Guarda também no banco de dados
        // ----------------------------------------------------

        $mensagem_db = $database->escape_string(
            $mensagem
        );

        $database->query("INSERT INTO sms_log(id_cliente,mensagem)
            VALUES('{$id_cliente}','{$mensagem_db}')");
    }


    // ========================================================
    // ERRO AO ENVIAR
    // ========================================================

    else {

        $totalErros++;


        escreverLog(
            "ERRO SMS | "
            . "Crédito: {$id_credito} | "
            . "Cliente: {$nome_cliente} | "
            . "Telefone: {$contacto} | "
            . "HTTP: {$envio['status']} | "
            . "Resposta: {$envio['resposta']}"
        );
    }
}


// ============================================================
// FINAL
// ============================================================

escreverLog(
    "FINALIZADO | "
    . "Encontrados: {$totalEncontrados} | "
    . "Enviados: {$totalEnviados} | "
    . "Erros: {$totalErros}"
);

escreverLog(
    "===== FIM DA COBRANÇA AUTOMÁTICA ====="
);


// Somente útil se executar manualmente
echo "Processamento terminado."
    . PHP_EOL
    . "Encontrados: {$totalEncontrados}"
    . PHP_EOL
    . "Enviados: {$totalEnviados}"
    . PHP_EOL
    . "Erros: {$totalErros}"
    . PHP_EOL;