<?php
session_start();
$_SESSION['user'] = '(98) 79978-9097';
require_once '../app/Controllers/sessions.php';
require_once '../app/Controllers/security_access.php';
require_once '../app/models/user.php';
require_once '../app/Controllers/controller_investments.php';
ini_set("display_errors", 0);

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

$data = filter_input(INPUT_GET, "ref", FILTER_SANITIZE_FULL_SPECIAL_CHARS);

if ($_SERVER['REQUEST_METHOD'] == 'GET' && !empty($data)) {
    // Procura investimentos com status ativo
    $stmt = $pdo->prepare("SELECT * FROM investment_products WHERE token = :token AND is_active = 1");
    $stmt->execute([':token' => $data]);
    $product = $stmt->fetch(PDO::FETCH_ASSOC);

    // Procura se o usuário ja tem esse investimento e verifica o limite de compra
    $stmtVerify = $pdo->prepare("SELECT COUNT(*) AS total_comprado FROM investments WHERE product_id = :product_id AND user_id = :user_id");
    $stmtVerify->execute([
        ':product_id' => $product['id'],
        ':user_id' => $user['id']
    ]);
    $resultVerify = $stmtVerify->fetch(PDO::FETCH_ASSOC);
    $totalPurchase = $resultVerify['total_comprado'];
    
     // Validação de novo usuario
    if ($user['qtd_investments'] > 0 && (int)$product['new_user'] == 1) {
        $_SESSION['toastMessage'] = 'Produto disponível apenas para novos usuários.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Validação de limite de compra
    if ((int)$totalPurchase >= (int)$product['limit_purchase']) {
        $_SESSION['toastMessage'] = 'Limite de compras para esse produto excedido.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Verificação se ainda há itens disponíveis
    if ((int)$product['total_purchases'] >= (int)$product['available']) {
        $_SESSION['toastMessage'] = 'A venda desse produto esgotou. :(';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Verificar se o produto está ativo
    if ($product['is_active'] != 1) {
        $_SESSION['toastMessage'] = 'Esse produto ainda não está disponível para compras.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Verificação extra de token/Status
    if (!$product) {
        $_SESSION['toastMessage'] = 'TOKEN inválido ou plano inativo.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Verificacao de final de evento
    if ($dataDeAgora >= $product['date_expired_event'] && $product['event'] == 1 && $product['automatic_expired'] == 1) {
        $_SESSION['toastMessage'] = 'O evento desse produto foi encerrado, as vendas desse produto näo estäo mais disponíveis.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    if (!$stmtResultTransactionPaid && $user['lider'] === 'no') {
        $_SESSION['toastMessage'] = 'Realize um depósito em sua conta.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    // Verificação de saldo
    if ($user['balance'] < $product['value']) {
        $_SESSION['toastMessage'] = 'Saldo insuficiente.';
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }

    try {
        $pdo->beginTransaction();
        // Insere o investimento na tabela
        $stmtInsert = $pdo->prepare("
            INSERT INTO investments (user_id, name, img, invested_amount, total_return, duration_days, created_at, calc_payment, product_id, type, date_release)
            VALUES (:user_id, :name, :img, :invested_amount, :total_return, :duration_days, :created_at, :calc_payment, :product_id, :type, :date_release)
        ");

        // Verificar se é do tipo ciclo para incluir a data do final do projeto.
        if ($product['type'] === 'cicle') {
            $dateRelease = date('Y-m-d H:i:s', strtotime('+ ' . $product['total_days'] . ' days'));
        } else {
            $dateRelease = null;
        }

        $stmtInsert->execute([
            ':user_id' => $user['id'],
            ':name' => $product['name'],
            ':img' => $product['img'],
            ':invested_amount' => $product['value'],
            ':total_return' => $product['total_return'],
            ':duration_days' => $product['total_days'],
            ':created_at' => date('Y-m-d H:i:s'),
            ':calc_payment' => date('Y-m-d H:i:s'),
            ':product_id' => $product['id'],
            ':date_release' => $dateRelease,
            ':type' => $product['type']
        ]);

        // Atualiza o saldo do investidor
        $stmtUpdateUser = $pdo->prepare("UPDATE users SET balance = balance - :value WHERE id = :id");
        $stmtUpdateUser->execute([
            ':value' => $product['value'],
            ':id' => $user['id']
        ]);

        // Atualiza quantidade de investimentos do usuário
        $stmtInvestCount = $pdo->prepare("UPDATE users SET qtd_investments = qtd_investments + 1, last_investment = :last_investment WHERE id = :id");
        $stmtInvestCount->execute([
            ':id' => $user['id'],
            ':last_investment' => $product['name']
        ]);
        
        if ($product['value'] >= 150) {
            // Atualiza quantidade de rodadas do usuário
            $stmtInvestSpin = $pdo->prepare("UPDATE users SET qtd_spins = qtd_spins + 1 WHERE id = :id");
            $stmtInvestSpin->execute([
            ':id' => $user['id'],
        ]);
        
        createHistory('Recebeu sua recompensa (1 Giro grátis) pelo investimento: ' . $product['name']);
        
        }

        // Atualiza unidades do produto
        $stmtInvestUpdate = $pdo->prepare("UPDATE investment_products SET total_purchases = total_purchases + 1, available = available - 1 WHERE id = :id");
        $stmtInvestUpdate->execute([
            ':id' => $product['id']
        ]);

        // Registra um log de investimento no banco
        $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
        $stmtHistory->execute([
            ':user_id' => $user['id'],
            ':action' => 'Investiu R$ ' . $product['value'] . ' no produto: ' . $product['id'],
            ':created_at' => date('Y-m-d H:i:s')
        ]);

         // Toasts sucesso
        $_SESSION['toastMessage'] = 'Você acabou de investir no produto ' . $product['name'] . ($product['value'] >= 150) ? ' Com esse investimento você ganhou 1 rodada no Envelope Dourado! ' : '';
        $_SESSION['toastType'] = 'success';
        $pdo->commit();


        // Verifica existencia de codigo de indicacao
        if ($user['indicated_by'] !== null && $stmtResultTransactionPaid) {
            $stmtAffiliate = $pdo->prepare("SELECT * FROM users WHERE affiliate_code = :affiliate_code");
            $stmtAffiliate->execute([
                ':affiliate_code' => $user['indicated_by']
            ]);

            // Valor percentual do afiliado
            $balanceAfilliateLvl1 = ($product['value'] * $stmtConfigsPlatformResult['percentage_lvl1']) / 100;

            // Se retornar resultado, encontrou o afiliado
            if ($stmtAffiliate->rowCount() > 0) {
                $resultAffiliate = $stmtAffiliate->fetch(PDO::FETCH_ASSOC);

                // Atualiza o saldo de comissao do afiliado e total lvl1
                try {
                    $pdo->beginTransaction();
                    $stmtUpdateAffiliate = $pdo->prepare("UPDATE users SET balance = balance + :balance, total_lvl1 = total_lvl1 + :total_lvl1 WHERE id = :id");
                    $stmtUpdateAffiliate->execute([
                        ':balance' => $balanceAfilliateLvl1,
                        ':total_lvl1' => $balanceAfilliateLvl1,
                        ':id' => $resultAffiliate['id'],
                    ]);
                    
                    if ($product['value'] >= 150) {
                    // Atualiza quantidade de rodadas do usuário
                    $stmtInvestCount23 = $pdo->prepare("UPDATE users SET qtd_spins = qtd_spins + 1 WHERE id = :id");
                    $stmtInvestCount23->execute([
                    ':id' => $resultAffiliate['id'],
                    ]);

                    $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
                    $stmtHistory->execute([
                        ':user_id' => $resultAffiliate['id'],
                        ':action' => 'Afiliado recebeu sua recompensa 1 Giro grátis pelo investimento do seu indicado ID: ' . $user['id'],
                        ':created_at' => date('Y-m-d H:i:s')
                    ]);

                    }

                    // Insere a comissao detalhada no banco 
                    $insertComissionAfilliate = $pdo->prepare("INSERT INTO comission_affiliates 
                    (affiliate_id, indicated_id, affiliate_lvl, indicated_phone, investment_id, investment_name, investment_value, liquid_affiliate, message) VALUES (:affiliate_id, :indicated_id, :affiliate_lvl, :indicated_phone, :investment_id, :investment_name, :investment_value, :liquid_affiliate, :message)");
                    $insertComissionAfilliate->execute([
                        ':affiliate_id' => $resultAffiliate['id'],
                        ':indicated_id' => $user['id'],
                        ':affiliate_lvl' => 1,
                        ':indicated_phone' => $user['phone'],
                        ':investment_id' => $product['id'],
                        ':investment_name' => $product['name'],
                        ':investment_value' => $product['value'],
                        ':liquid_affiliate' => $balanceAfilliateLvl1,
                        ':message' => 'O indicado do Afiliado ' . $resultAffiliate['id'] . ' Fez um investimento de R$ ' . $product['value'] . ' / Comissão do afiliado: ' . $balanceAfilliateLvl1
                    ]);

                    // Insere um log de comissao recebida lvl1
                    $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
                    $stmtHistory->execute([
                        ':user_id' => $resultAffiliate['id'],
                        ':action' => 'Recebeu comissão de nível 1 pelo investimento de R$' . $product['value'],
                        ':created_at' => date('Y-m-d H:i:s')
                    ]);
                    $pdo->commit();
                } catch (PDOException $e) {
                    $pdo->rollBack();
                    $_SESSION['toastMessage'] = 'Erro ao efetuar pagamento LVL1: ' . $e->getMessage();
                    $_SESSION['toastType'] = 'error';
                    header('Location: index.php');
                    exit;
                }
            }
        }

        // Procura se tem um afiliado lvl2
        if (isset($resultAffiliate) && $resultAffiliate['indicated_by'] !== null) {
            // Comissão lvl2
            $balanceAfilliateLvl2 = ($product['value'] * $stmtConfigsPlatformResult['percentage_lvl2']) / 100;

            // Seleciona o usuário Afiliado
            $stmtLvl2 = $pdo->prepare("SELECT * FROM users WHERE affiliate_code = :affiliate_code");
            $stmtLvl2->execute([
                ':affiliate_code' => $resultAffiliate['indicated_by']
            ]);

            if ($stmtLvl2->rowCount() > 0) {

                $resultAffiliatelvl2 = $stmtLvl2->fetch(PDO::FETCH_ASSOC);

                // Atualiza comissões do lvl2
                try {
                    $pdo->beginTransaction();
                    $stmtBalancelvl2 = $pdo->prepare("UPDATE users SET balance = balance + :balance, total_lvl2 = total_lvl2 + :total_lvl2 WHERE id = :id");
                    $stmtBalancelvl2->execute([
                        ':balance' => $balanceAfilliateLvl2,
                        ':total_lvl2' => $balanceAfilliateLvl2,
                        ':id' => $resultAffiliatelvl2['id']
                    ]);

                    // Insere a comissao detalhada no banco 
                    $insertComissionAfilliatelvl2 = $pdo->prepare("INSERT INTO comission_affiliates 
           (affiliate_id, indicated_id, affiliate_lvl, indicated_phone, investment_id, investment_name, investment_value, liquid_affiliate, message) VALUES (:affiliate_id, :indicated_id, :affiliate_lvl, :indicated_phone, :investment_id, :investment_name, :investment_value, :liquid_affiliate, :message)");
                    $insertComissionAfilliatelvl2->execute([
                        ':affiliate_id' => $resultAffiliatelvl2['id'],
                        ':indicated_id' => $resultAffiliate['id'],
                        ':affiliate_lvl' => 2,
                        ':indicated_phone' => $resultAffiliate['phone'],
                        ':investment_id' => $product['id'],
                        ':investment_name' => $product['name'],
                        ':investment_value' => $product['value'],
                        ':liquid_affiliate' => $balanceAfilliateLvl2,
                        ':message' => 'O indicado do Afiliado ' . $resultAffiliatelvl2['id'] . ' Fez um investimento de R$ ' . $product['value'] . ' / Comissão do afiliado: ' . $balanceAfilliateLvl2
                    ]);

                    // Insere um log de comissao recebida lvl2
                    $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
                    $stmtHistory->execute([
                        ':user_id' => $resultAffiliatelvl2['id'],
                        ':action' => 'Recebeu comissão de nível 2 pelo indicado do seu indicado (R$' . $balanceAfilliateLvl2 . ')',
                        ':created_at' => date('Y-m-d H:i:s')
                    ]);
                    $pdo->commit();
                } catch (PDOException $e) {
                    $pdo->rollBack();
                    $_SESSION['toastMessage'] = 'Erro ao efetuar pagamento LVL2: ' . $e->getMessage();
                    $_SESSION['toastType'] = 'error';
                    header('Location: index.php');
                    exit;
                }
            }
        }

        if (isset($resultAffiliatelvl2) && $resultAffiliatelvl2['indicated_by'] !== null) {
            $balanceAfilliateLvl3 = ($product['value'] * $stmtConfigsPlatformResult['percentage_lvl3']) / 100;

            // Seleciona o usuário Afiliado
            $stmtLvl3 = $pdo->prepare("SELECT * FROM users WHERE affiliate_code = :affiliate_code");
            $stmtLvl3->execute([
                ':affiliate_code' => $resultAffiliatelvl2['indicated_by']
            ]);

            if ($stmtLvl3->rowCount() > 0) {

                $resultAffiliatelvl3 = $stmtLvl3->fetch(PDO::FETCH_ASSOC);

                // Atualiza comissões do lvl3
                try {
                    $pdo->beginTransaction();
                    $stmtBalancelvl3 = $pdo->prepare("UPDATE users SET balance = balance + :balance, total_lvl3 = total_lvl3 + :total_lvl3 WHERE id = :id");
                    $stmtBalancelvl3->execute([
                        ':balance' => $balanceAfilliateLvl3,
                        ':total_lvl3' => $balanceAfilliateLvl3,
                        ':id' => $resultAffiliatelvl3['id']
                    ]);

                    // Insere a comissao detalhada no banco 
                    $insertComissionAfilliatelvl3 = $pdo->prepare("INSERT INTO comission_affiliates 
           (affiliate_id, indicated_id, affiliate_lvl, indicated_phone, investment_id, investment_name, investment_value, liquid_affiliate, message) VALUES (:affiliate_id, :indicated_id, :affiliate_lvl, :indicated_phone, :investment_id, :investment_name, :investment_value, :liquid_affiliate, :message)");
                    $insertComissionAfilliatelvl3->execute([
                        ':affiliate_id' => $resultAffiliatelvl3['id'],
                        ':indicated_id' => $resultAffiliatelvl2['id'],
                        ':affiliate_lvl' => 3,
                        ':indicated_phone' => $resultAffiliatelvl2['phone'],
                        ':investment_id' => $product['id'],
                        ':investment_name' => $product['name'],
                        ':investment_value' => $product['value'],
                        ':liquid_affiliate' => $balanceAfilliateLvl3,
                        ':message' => 'O indicado do Afiliado ' . $resultAffiliatelvl3['id'] . ' Fez um investimento de R$ ' . $product['value'] . ' / Comissão do afiliado: ' . $balanceAfilliateLvl3
                    ]);

                    // Insere um log de comissao recebida lvl3
                    $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action, created_at) VALUES (:user_id, :action, :created_at)");
                    $stmtHistory->execute([
                        ':user_id' => $resultAffiliatelvl3['id'],
                        ':action' => 'Recebeu comissão de nível 3 (R$' . $balanceAfilliateLvl3 . ') pelo terceiro nível de indicação',
                        ':created_at' => date('Y-m-d H:i:s')
                    ]);
                    $pdo->commit();
                } catch (PDOException $e) {
                    $pdo->rollBack();
                    $_SESSION['toastMessage'] = 'Erro ao efetuar pagamento LVL3: ' . $e->getMessage();
                    $_SESSION['toastType'] = 'error';
                    header('Location: index.php');
                    exit;
                }
            }
        }

        header('Location: my-investments.php');
        exit;
        // Se houver falha cai aqui
    } catch (PDOException $e) {
        $pdo->rollBack();
        $_SESSION['toastMessage'] = 'Erro ao efetuar o investimento: ' . $e->getMessage();
        $_SESSION['toastType'] = 'error';
        header('Location: index.php');
        exit;
    }
} else {
    $_SESSION['toastMessage'] = 'Método não permitido ou TOKEN ausente.';
    $_SESSION['toastType'] = 'error';
    header('Location: index.php');
    exit;
}
