<?php
ini_set("display_errors", 0);

$stmtInvestments = $pdo->prepare("SELECT * FROM investments WHERE user_id = :user_id AND is_active = 1");
$stmtInvestments->execute([
    ':user_id' => $user['id']
]);
$resultInvestments = $stmtInvestments->fetchAll(PDO::FETCH_ASSOC);

// --- Lógica do Cronômetro de Resgate de Rendimento (NOVO) ---
$proximo_resgate_diario = null;
$tempo_restante_segundos = 0;
$agora_timestamp = time(); // Timestamp atual

foreach ($resultInvestments as $investimento) {
    if ($investimento['is_active'] == 1 && $investimento['type'] === 'diary') {
        
        // Determina a data base: se já pagou, é a última data, senão é a criação
        $ultima_base_timestamp = strtotime($investimento['last_paid_at'] ?? $investimento['created_at']);
        
        // O próximo pagamento deve ocorrer 24 horas após a última base
        $proximo_pagamento_timestamp = $ultima_base_timestamp + 86400; // 86400 segundos = 24 horas

        // Se o próximo pagamento ainda é futuro...
        if ($proximo_pagamento_timestamp > $agora_timestamp) {
            // E se for o menor tempo restante encontrado até agora, ou o primeiro encontrado
            if (is_null($proximo_resgate_diario) || $proximo_pagamento_timestamp < $proximo_resgate_diario) {
                $proximo_resgate_diario = $proximo_pagamento_timestamp;
            }
        }
    }
}

// Calcula o tempo restante em segundos para o resgate mais próximo
if (!is_null($proximo_resgate_diario)) {
    $tempo_restante_segundos = max(0, $proximo_resgate_diario - $agora_timestamp);
} else {
    // Se não há investimentos ativos ou todos já podem resgatar, forçamos o contador a 0
    $tempo_restante_segundos = 0;
}
// -----------------------------------------------------------


if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['send-verify'])) {
    $data_hoje = date('Y-m-d H:i:s');
    $rendimento_pago = false;

    // Lógica para investimentos DIÁRIOS
    foreach ($resultInvestments as $inv) {
        
        // CORREÇÃO ESSENCIAL: Ignora o pagamento diário para planos de ciclo.
        // Eles serão pagos integralmente no segundo bloco, ao atingir a data de release.
        if ($inv['type'] === 'cicle') {
            continue; 
        }

        $data_inicio = $inv['created_at'];
        $dias_duracao = $inv['duration_days'];
        $rendimento_total = $inv['total_return'];
        $renda_diaria = $rendimento_total / $dias_duracao;

        // Se já houve pagamento, usamos a última data para contar
        $ultima_base = $inv['last_paid_at'] ?? $data_inicio;

        // Quantos dias se passaram desde o último pagamento
        $dias_pendentes = floor((strtotime($data_hoje) - strtotime($ultima_base)) / 86400);

        // Limite: não pode ultrapassar a duração
        $dias_passados_total = floor((strtotime($data_hoje) - strtotime($data_inicio)) / 86400);
        $dias_pendentes = min($dias_pendentes, $dias_duracao - floor($inv['total_paid'] / $renda_diaria));

        if ($dias_pendentes <= 0) {
            continue; // Sem rendimentos para coletar
        }

        $valor_a_pagar_hoje = $dias_pendentes * $renda_diaria;

        try {
            $pdo->beginTransaction();

            $stmtUpdate = $pdo->prepare("
                UPDATE investments 
                SET calc_payment = :calc_payment, 
                    last_paid_at = :last_paid_at, 
                    total_paid = total_paid + :valor 
                WHERE id = :id
            ");
            $stmtUpdate->execute([
                ':calc_payment' => $data_hoje,
                ':last_paid_at' => $data_hoje,
                ':valor' => $valor_a_pagar_hoje,
                ':id' => $inv['id']
            ]);

            $stmtSaldo = $pdo->prepare("
                UPDATE users 
                SET balance = balance + :valor, 
                    profit_investments = profit_investments + :valor 
                WHERE id = :id
            ");
            $stmtSaldo->execute([
                ':valor' => $valor_a_pagar_hoje,
                ':id' => $inv['user_id']
            ]);
            
            // Registramos na nova tabela de registro de coletas
            $stmtInsertColet1 = $pdo->prepare('INSERT INTO investments_rescues (user_id, name_investment, id_investment, value, type_investment, created_at) VALUES (:user_id, :name_investment, :id_investment, :value, :type_investment, :created_at)');
            $stmtInsertColet1->execute([
                ':user_id' => $inv['user_id'],
                ':name_investment' => $inv['name'],
                ':id_investment' => $inv['id'],
                ':type_investment' => $inv['type'],
                ':value' => $valor_a_pagar_hoje,
                ':created_at' => date('Y-m-d H:i:s')
            ]);

            // Registra em log no banco
            $stmtHistory2 = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
            $stmtHistory2->execute([
                ':user_id' => $inv['user_id'],
                ':action' => 'O usuário acabou de resgatar sua renda diária. Produto: ' . $inv['name'] . ' Valor: ' . $valor_a_pagar_hoje,
                ':created_at' => date('Y-m-d H:i:s')
            ]);

            // Fecha o investimento se atingiu o rendimento total
            if (($inv['total_paid'] + $valor_a_pagar_hoje) >= $rendimento_total) {
                $stmtClose = $pdo->prepare("UPDATE investments SET is_active = 0 WHERE id = :id");
                $stmtClose->execute([':id' => $inv['id']]);
            }

            $pdo->commit();
            $rendimento_pago = true;
        } catch (PDOException $e) {
            $pdo->rollBack();
            $_SESSION['toastMessage'] = 'Erro ao resgatar rendimento: ' . $e->getMessage();
            $_SESSION['toastType'] = 'error';
            header("Location: my-investments.php");
            exit;
        }
    }

// Mensagem final consolidada
if ($rendimento_pago) {
    // Se houve algum pagamento diário, a mensagem de sucesso já foi definida no bloco acima
} elseif (!isset($_SESSION['toastMessage'])) {
    // Se não houve pagamento diário, e não houve sucesso no ciclo, define a mensagem padrão.
    $_SESSION['toastMessage'] = 'Aguarde o cronometro finalizar, para coletar seus rendimentos.';
    $_SESSION['toastType'] = 'error';
}
    
header("Location: my-investments.php");
exit;
}

 // Lógica para investimentos de CICLO
    $stmtInvestments2 = $pdo->prepare("SELECT * FROM investments WHERE user_id = :user_id AND is_active = :is_active AND type = :type");
    $stmtInvestments2->execute([
        ':user_id' => $user['id'],
        ':is_active' => 1,
        ':type' => 'cicle'
    ]);
    $resultInvestments2 = $stmtInvestments2->fetchAll(PDO::FETCH_ASSOC);

    $currentDate = date('Y-m-d H:i:s');

    if ($resultInvestments2) {

        // Percorremos cada investimento
        foreach ($resultInvestments2 as $inv2) {

        // Verificamos se a data atual é maior ou igual a data do pagamento.
        if ($inv2['date_release'] !== null && $currentDate >= $inv2['date_release']) {
            try {
                $pdo->beginTransaction();

                // Atualizamos o investimento
                $stmtFinal = $pdo->prepare('UPDATE investments SET is_active = :is_active, last_paid_at = :last_paid_at, total_paid = :total_paid WHERE id = :id');
                $stmtFinal->execute([
                    ':is_active' => 0,
                    ':last_paid_at' => $currentDate,
                    ':total_paid' => $inv2['total_return'],
                    ':id' => $inv2['id']
                ]);


                // Registramos na nova tabela de registro de coletas
                $stmtInsertColet = $pdo->prepare('INSERT INTO investments_rescues (user_id, name_investment, id_investment, value, type_investment, created_at) VALUES (:user_id, :name_investment, :id_investment, :value, :type_investment, :created_at)');
                $stmtInsertColet->execute([
                    ':user_id' => $inv2['user_id'],
                    ':name_investment' => $inv2['name'],
                    ':id_investment' => $inv2['id'],
                    ':type_investment' => $inv2['type'],
                    ':value' => $inv2['total_return'],
                    ':created_at' => date('Y-m-d H:i:s')
                ]);

                // Registra em log no banco
                $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
                $stmtHistory->execute([
                    ':user_id' => $inv2['user_id'],
                    ':action' => 'O usuário acabou de resgatar sua renda por ciclo. Produto: ' . $inv2['name'] . ' Valor: ' . $inv2['total_return'], // Corrigido para usar total_return
                    ':created_at' => date('Y-m-d H:i:s')
                ]);

                // Atualizamos o usuário
                $stmtUserUp = $pdo->prepare('UPDATE users SET balance = balance + :balance, profit_investments = profit_investments + :profit_investments WHERE id = :id');
                $stmtUserUp->execute([
                    ':balance' => (float)$inv2['total_return'],
                    ':profit_investments' => (float)$inv2['total_return'],
                    ':id' => $inv2['user_id']
                ]);

                $pdo->commit();
                
                // Define a mensagem de sucesso
                $_SESSION['toastMessage'] = 'Rendimento por Ciclo (100%) coletado com sucesso! Valores já disponíveis em sua conta.';
                $_SESSION['toastType'] = 'success';
            } catch (PDOException $e) {
                $pdo->rollBack();
                $_SESSION['toastMessage'] = 'Erro fatal ao resgatar rendimento por ciclo: ' . $e->getMessage();
                $_SESSION['toastType'] = 'error';
                header("Location: my-investments.php");
                exit;
            }
        }
    }
}