<?php
ini_set("display_errors", 0);
require '../config/db.php';

session_start();
if (!isset($_SESSION['user'])) {
    header('Location: login.php');
    exit;
}

// Consultar taxa saque
$consultTaxa = $pdo->prepare("SELECT taxa_saq FROM configs");
$consultTaxa->execute();
$resultTaxa = $consultTaxa->fetch(PDO::FETCH_ASSOC);

$data = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$foto = $_FILES['profile-img'] ?? null;
$archive = 'uploads/';
$maxSize = 5 * 1024 * 1024;

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($foto) && $foto['error'] == 0) {
    $ext = pathinfo($foto['name'], PATHINFO_EXTENSION);
    $name = 'profile_img-' . bin2hex(random_bytes(10)) . '.' . $ext;
    $local = '../public/uploads/';

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $foto['tmp_name']);
    finfo_close($finfo);

    $allowedTypes = [
        'image/jpg',
        'image/jpeg',
        'image/png',
        'image/gif'
    ];

    if (!in_array($foto['type'], $allowedTypes) || !in_array($mimeType, $allowedTypes)) {
        $_SESSION['toastMessage'] = 'Formato do arquivo não aceito.';
        $_SESSION['toastType'] = 'error';
    } elseif (!is_dir($local)) {
        mkdir($local, 0755, true);
    } elseif (!is_writable($local)) {
        $_SESSION['toastMessage'] = "A pasta $local não tem permissão de escrita.";
        $_SESSION['toastType'] = 'error';
    } elseif ($foto['size'] > $maxSize) {
        $_SESSION['toastMessage'] = 'Arquivo maior que o permitido. (5MB)';
        $_SESSION['toastType'] = 'error';
    } else {
        if ((move_uploaded_file($foto['tmp_name'], $local . $name))) {
            $_SESSION['toastMessage'] = 'Foto de perfil atualizada com sucesso!';
            $_SESSION['toastType'] = 'success';
            $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action) VALUES (:user_id, :action)");
            $stmtHistory->execute([
                ':user_id' => $user['id'],
                ':action' => 'Acabou de alterar sua foto de Perfil!'
            ]);
            try {
                $pdo->beginTransaction();
                $stmtUpdateImg = $pdo->prepare("UPDATE users SET avatar = :avatar WHERE id = :id");
                $stmtUpdateImg->execute([
                    ':avatar' => $name,
                    ':id' => $user['id']
                ]);
                $pdo->commit();
                header('Location: ' . $_SERVER['PHP_SELF']);
            } catch (PDOException $e) {
                $pdo->rollBack();
                $_SESSION['toastMessage'] = 'Erro na atualização: ' . $e->getMessage();
                $_SESSION['toastType'] = 'error';
            }
        } else {
            $_SESSION['toastMessage'] = 'Falha ao atualizar a foto de perfil!';
            $_SESSION['toastType'] = 'error';
        }
    }
} elseif ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['alter_pass'])) {
    $dataPass = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    if (strlen($dataPass['actual_pass']) < 6 || strlen($dataPass['new_pass']) < 6 || strlen($dataPass['confirm_new_pass']) < 6) {
        $_SESSION['toastMessage'] = 'Senha deve conter no mínimo 6 caracteres.';
        $_SESSION['toastType'] = 'error';
    } elseif (password_verify($dataPass['actual_pass'], $user['password'])) {
        if ($dataPass['new_pass'] === $dataPass['confirm_new_pass']) {
            try {
                $pdo->beginTransaction();
                $stmtUpdatePass = $pdo->prepare("UPDATE users SET password = :password WHERE id = :id");
                $stmtUpdatePass->execute([
                    ':password' => password_hash($dataPass['new_pass'], PASSWORD_DEFAULT),
                    ':id' => $user['id']
                ]);
                $pdo->commit();
                $_SESSION['toastMessage'] = 'Senha alterada com sucesso!';
                $_SESSION['toastType'] = 'success';
                $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action) VALUES (:user_id, :action)");
                $stmtHistory->execute([
                    ':user_id' => $user['id'],
                    ':action' => 'Acabou de alterar sua senha!'
                ]);
            } catch (PDOException $e) {
                $pdo->rollBack();
                $_SESSION['toastMessage'] = 'Erro na atualização (ocorreu um erro interno)';
                $_SESSION['toastType'] = 'error';
            }
        } else {
            $_SESSION['toastMessage'] = 'Nova senha e confirmação da nova senha não conferem.';
            $_SESSION['toastType'] = 'error';
        }
    } else {
        $_SESSION['toastMessage'] = 'Senha atual está incorreta.';
        $_SESSION['toastType'] = 'error';
    }
}

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['send_withdrawal'])) {

    $dataWith = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $valueTrated = str_replace(',', '.', $dataWith['value_withdrawal']);
    $value = filter_var($valueTrated, FILTER_VALIDATE_FLOAT);

    // Consultar se o usuário tem investimentos
    $stmtConsultInvestimentUser = $pdo->prepare("SELECT * FROM investments WHERE user_id = :user_id LIMIT 1");
    $stmtConsultInvestimentUser->execute([
        ':user_id' => $user['id']
    ]);
    $investimentUser = $stmtConsultInvestimentUser->fetch(PDO::FETCH_ASSOC);

    // Recebe o valor bruto do POST, tipo: "R$ 1.234,56"
    $rawValue = $_POST['value_withdrawal'] ?? '';

    // Remove o R$, pontos de milhar, troca vírgula decimal por ponto decimal
    $cleanValue = str_replace(['R$', '.', ' '], '', $rawValue);
    $cleanValue = str_replace(',', '.', $cleanValue);

    // Agora tenta converter para float
    $value = filter_var($cleanValue, FILTER_VALIDATE_FLOAT);
    $dataAtual1 = new DateTime();
    $dataInicia1 = new DateTime('today 10:00');
    $dataFinal1 = new DateTime('today 16:00');
    $finalDeSemana = $dataAtual1->format('N');

    // Valida saldo suficiente
    if ($value > $user['balance']) {
        $_SESSION['toastMessage'] = 'Saldo insuficiente. O valor do saque excede seu saldo.';
        $_SESSION['toastType'] = 'error';
        return;
    }
    if ($dataAtual1 < $dataInicia1 || $dataAtual1 > $dataFinal1 || $finalDeSemana > 6) {
        $_SESSION['toastMessage'] = 'Horário para saques das 10h as 16h de segunda a sexta.';
        $_SESSION['toastType'] = 'error';
        return;
    }
    if ($value < $stmtConfigsPlatformResult['min_with']) {
        $_SESSION['toastMessage'] = 'Saque mínimo R$ ' . htmlspecialchars(number_format($stmtConfigsPlatformResult['min_with'], 2, ',', '.'));
        $_SESSION['toastType'] = 'error';
        return;
    } elseif ($value > $stmtConfigsPlatformResult['max_with']) {
        $_SESSION['toastMessage'] = 'Saque máximo R$ ' . htmlspecialchars(number_format($stmtConfigsPlatformResult['max_with'], 2, ',', '.'));
        $_SESSION['toastType'] = 'error';
        return;
    } elseif ($stmtWithdrawalPendingUser->rowCount() > 0) {
        $_SESSION['toastMessage'] = 'Você já tem um saque pendente, aguarde a conclusão.';
        $_SESSION['toastType'] = 'error';
        return;
    } elseif (!$investimentUser) {
        $_SESSION['toastMessage'] = 'Você precisa investir antes de poder sacar.';
        $_SESSION['toastType'] = 'error';
        return;
    } elseif ($value === false || $value === null) {
        $_SESSION['toastMessage'] = 'Valor inválido para saque.';
        $_SESSION['toastType'] = 'error';
    } elseif ($value > $user['balance']) {
        $_SESSION['toastMessage'] = $_SESSION['toastMessage'] = 'Valor de saque maior que o saldo disponível.';
        $_SESSION['toastType'] = $_SESSION['toastType'] = 'error';
        // } elseif (strlen($dataWith['cpf_withdrawal'] < 11)) {
        //     $_SESSION['toastMessage'] = 'CPF inválido.';
        //     $_SESSION['toastType'] = 'error';
    } else {

        try {
            $pdo->beginTransaction();
            $stmtWithdrawal = $pdo->prepare("UPDATE users SET balance = balance - :balance WHERE id = :id");
            $stmtWithdrawal->execute([
                ':balance' => $value,
                ':id' => $user['id']
            ]);

            $stmtHistoryWith = $pdo->prepare("INSERT INTO history (user_id, action) VALUES (:user_id, :action)");
            $stmtHistoryWith->execute([
                ':user_id' => $user['id'],
                ':action' => 'O usuário solicitou um saque de ' . $value
            ]);

            $valueComTaxa = $value - (($value * $resultTaxa['taxa_saq']) / 100);
            $valorTotal = $value + (($value * $resultTaxa['taxa_saq']) / 100);

            do {
                $reference = bin2hex(random_bytes(6));
                $stmtReference = $pdo->prepare("SELECT 1 FROM withdrawal WHERE reference_id = :reference_id LIMIT 1");
                $stmtReference->execute([
                    ':reference_id' => $reference
                ]);
                $exists = $stmtReference->fetchColumn() > 0;
            } while ($exists);

            $stmtRegisterWith = $pdo->prepare("INSERT INTO withdrawal (user_id, phone, reference_id, type_pix, name_beneficiary, cpf_beneficiary, key_beneficiary, value, with_liquid, taxa, value_taxa, status, created_at) VALUES (:user_id, :phone, :reference_id, :type_pix, :name_beneficiary, :cpf_beneficiary, :key_beneficiary, :value, :with_liquid, :taxa, :value_taxa, :status, :created_at)");
            $stmtRegisterWith->execute([
                ':user_id' => $user['id'],
                ':phone' => $user['phone'],
                ':reference_id' => $reference,
                ':type_pix' => $stmtResultPix['type_pix'],
                ':name_beneficiary' => $stmtResultPix['name_beneficiary'],
                ':key_beneficiary' => $stmtResultPix['key_beneficiary'],
                ':cpf_beneficiary' => $stmtResultPix['cpf_beneficiary'],
                ':value' => $value,
                ':with_liquid' => $valueComTaxa,
                ':taxa' => $resultTaxa['taxa_saq'],
                ':value_taxa' => $valorTotal,
                ':status' => 'pending',
                ':created_at' => date("Y-m-d H:i:s")
            ]);

            $pdo->commit();
            $_SESSION['toastMessage'] = 'Saque em processamento.';
            $_SESSION['toastType'] = 'success';
            echo "
            <script>
            setTimeout(() => {
            window.location.href = 'history_with.php'
            }, 3000)
            </script>
            ";
        } catch (PDOException $e) {
            $pdo->rollBack();
            $_SESSION['toastMessage'] = 'Erro na atualização (ocorreu um erro interno)';
            $_SESSION['toastType'] = 'error';
        }
    }
}
