<?php

function virtualCardMenu($chat_id)
{
    $message = "🪪 <b>FinoviaPay Virtual Card Services</b>\n\nWelcome to the secure FinoviaPay virtual card services section.\n\nPlease select one of the options below to continue.";

    $buttons = [
        [['text' => '➕ Request New Card', 'callback_data' => 'virtual_card_request_new']],
        [['text' => '🪪 Current Card', 'callback_data' => 'virtual_card_current']],
        [['text' => '⚙️ Manage Card', 'callback_data' => 'virtual_card_manage']],
        [['text' => '↩️ Back to Card Services', 'callback_data' => 'card_order']]
    ];

    sendInlineKeyboard($chat_id, $message, $buttons);
}

function vcUserId($states, $chat_id): int
{
    return (int)($states[$chat_id]['user']['id'] ?? $states[$chat_id]['identified_user_id'] ?? 0);
}

function vcGenerateReference(string $prefix = 'FNP-VC-'): string
{
    $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
    $random = '';
    for ($i = 0; $i < 8; $i++) {
        $random .= $chars[random_int(0, strlen($chars) - 1)];
    }
    return $prefix . date('ymd') . '-' . $random;
}

function vcIsEuropeanMobile(string $mobile): bool
{
    $mobile = trim($mobile);
    return (bool)preg_match('/^\+(?:3\d|4\d)\d{6,14}$/', $mobile);
}

function vcGetMobile(PDO $pdo, int $userId): string
{
    if ($userId <= 0) return '';
    try {
        $stmt = $pdo->prepare("SELECT eu_mobile_number FROM telegram_bot_user_card_contacts WHERE user_id = :user_id LIMIT 1");
        $stmt->execute([':user_id' => $userId]);
        return trim((string)($stmt->fetchColumn() ?: ''));
    } catch (Throwable $e) {
        return '';
    }
}

function vcSaveMobile(PDO $pdo, int $userId, string $mobile): bool
{
    if ($userId <= 0 || $mobile === '') return false;

    $countryCode = '';
    if (preg_match('/^\+(\d{2,3})/', $mobile, $m)) {
        $countryCode = '+' . $m[1];
    }

    try {
        $check = $pdo->prepare("SELECT id FROM telegram_bot_user_card_contacts WHERE user_id = :user_id LIMIT 1");
        $check->execute([':user_id' => $userId]);
        $existingId = (int)($check->fetchColumn() ?: 0);

        if ($existingId > 0) {
            $stmt = $pdo->prepare("UPDATE telegram_bot_user_card_contacts SET eu_mobile_number = :mobile, country_code = :country_code, is_verified_for_3ds = 1, updated_at = NOW() WHERE user_id = :user_id LIMIT 1");
            return $stmt->execute([
                ':mobile' => $mobile,
                ':country_code' => $countryCode,
                ':user_id' => $userId
            ]);
        }

        $stmt = $pdo->prepare("INSERT INTO telegram_bot_user_card_contacts (user_id, eu_mobile_number, country_code, is_verified_for_3ds, created_at, updated_at) VALUES (:user_id, :mobile, :country_code, 1, NOW(), NOW())");
        return $stmt->execute([
            ':user_id' => $userId,
            ':mobile' => $mobile,
            ':country_code' => $countryCode
        ]);
    } catch (Throwable $e) {
        return false;
    }
}

function vcFetchCard(PDO $pdo, int $userId): ?array
{
    if ($userId <= 0) return null;
    try {
        $stmt = $pdo->prepare("SELECT * FROM telegram_bot_virtual_card_inventory WHERE user_id = :user_id AND card_status IN ('assigned','blocked') ORDER BY id DESC LIMIT 1");
        $stmt->execute([':user_id' => $userId]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row ?: null;
    } catch (Throwable $e) {
        return null;
    }
}

function vcAssignAvailableCard(PDO $pdo, int $userId): ?array
{
    if ($userId <= 0) return null;

    try {
        $stmt = $pdo->prepare("SELECT * FROM telegram_bot_virtual_card_inventory WHERE user_id = :user_id AND card_status = 'available' ORDER BY id ASC LIMIT 1");
        $stmt->execute([':user_id' => $userId]);
        $card = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$card) return null;

        $upd = $pdo->prepare("UPDATE telegram_bot_virtual_card_inventory SET card_status = 'assigned', assigned_at = NOW(), updated_at = NOW() WHERE id = :id LIMIT 1");
        $upd->execute([':id' => $card['id']]);

        $stmt2 = $pdo->prepare("SELECT * FROM telegram_bot_virtual_card_inventory WHERE id = :id LIMIT 1");
        $stmt2->execute([':id' => $card['id']]);
        $row = $stmt2->fetch(PDO::FETCH_ASSOC);
        return $row ?: $card;
    } catch (Throwable $e) {
        return null;
    }
}

function vcCreateOrUpdateRequest(PDO $pdo, int $userId, string $mobile): void
{
    try {
        $card = vcFetchCard($pdo, $userId);

        $check = $pdo->prepare("SELECT id FROM telegram_bot_virtual_card_requests WHERE user_id = :user_id ORDER BY id DESC LIMIT 1");
        $check->execute([':user_id' => $userId]);
        $existingId = (int)($check->fetchColumn() ?: 0);

        $status = $card ? 'completed' : 'submitted';
        $virtualCardId = $card['id'] ?? null;
        $notes = $card ? 'Virtual card assigned successfully.' : 'Virtual card request submitted and awaiting assignment.';

        if ($existingId > 0) {
            $stmt = $pdo->prepare("UPDATE telegram_bot_virtual_card_requests SET virtual_card_id = :virtual_card_id, request_status = :request_status, eu_mobile_number = :eu_mobile_number, request_notes = :request_notes, updated_at = NOW() WHERE id = :id LIMIT 1");
            $stmt->execute([
                ':virtual_card_id' => $virtualCardId,
                ':request_status' => $status,
                ':eu_mobile_number' => $mobile,
                ':request_notes' => $notes,
                ':id' => $existingId
            ]);
            return;
        }

        $stmt = $pdo->prepare("INSERT INTO telegram_bot_virtual_card_requests (user_id, virtual_card_id, request_reference, request_status, eu_mobile_number, request_notes, created_at, updated_at) VALUES (:user_id, :virtual_card_id, :request_reference, :request_status, :eu_mobile_number, :request_notes, NOW(), NOW())");
        $stmt->execute([
            ':user_id' => $userId,
            ':virtual_card_id' => $virtualCardId,
            ':request_reference' => vcGenerateReference(),
            ':request_status' => $status,
            ':eu_mobile_number' => $mobile,
            ':request_notes' => $notes
        ]);
    } catch (Throwable $e) {
    }
}

function vcRequestNotice(): string
{
    return "➕ <b>Request a New Virtual Card</b>\n\nBefore FinoviaPay can issue your virtual card, a valid European mobile number is required for secure 3D verification SMS authentication.\n\n• This verification requirement is completed only once.\n• Your number must include the full international country code.\n• Example accepted format: <b>+34XXXXXXXXX</b>\n\nPlease enter your European mobile number now to continue.";
}

function vcCardMessage(array $card): string
{
    $masked = trim((string)($card['masked_card_number'] ?? ''));
    if ($masked === '') {
        $digits = preg_replace('/\D+/', '', (string)($card['card_number'] ?? ''));
        $masked = $digits !== '' ? '•••• •••• •••• ' . substr($digits, -4) : 'Not Available Yet';
    }
    $expMonth = trim((string)($card['exp_month'] ?? ''));
    $expYear = trim((string)($card['exp_year'] ?? ''));
    $exp = ($expMonth !== '' || $expYear !== '') ? ($expMonth . '/' . $expYear) : 'Not Available Yet';
    $status = trim((string)($card['card_status'] ?? 'Not Available Yet'));
    $brand = trim((string)($card['card_brand'] ?? 'Visa'));
    $label = trim((string)($card['card_label'] ?? 'Virtual Card'));
    $reference = trim((string)($card['reference_code'] ?? 'Not Available Yet'));

    $msg  = "🪪 <b>Current Virtual Card</b>\n\n";
    $msg .= "<b>Card Label</b>\n" . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . "\n\n";
    $msg .= "<b>Card Brand</b>\n" . htmlspecialchars($brand, ENT_QUOTES, 'UTF-8') . "\n\n";
    $msg .= "<b>Masked Card Number</b>\n" . htmlspecialchars($masked, ENT_QUOTES, 'UTF-8') . "\n\n";
    $msg .= "<b>Expiry Date</b>\n" . htmlspecialchars($exp, ENT_QUOTES, 'UTF-8') . "\n\n";
    $msg .= "<b>Card Status</b>\n" . htmlspecialchars(ucfirst($status), ENT_QUOTES, 'UTF-8') . "\n\n";
    $msg .= "<b>Reference Code</b>\n" . htmlspecialchars($reference, ENT_QUOTES, 'UTF-8');
    return $msg;
}

function vcManageMenu($chat_id): void
{
    $message = "⚙️ <b>Manage Virtual Card</b>\n\nPlease select one of the professional options below to continue.";

    $buttons = [
        [['text' => '🪪 Current Card', 'callback_data' => 'virtual_card_current']],
        [['text' => '🛠️ Card Support', 'callback_data' => 'virtual_card_support']],
        [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
    ];

    sendInlineKeyboard($chat_id, $message, $buttons);
}

if ($callbackId) {
    answerCallbackQuery($callbackId);
}

if ($callbackData === 'ticket_card_type_virtual') {
    $states[$chat_id]['step'] = 'virtual_card_menu';
    $states[$chat_id]['ticket_flow']['card_type'] = 'Virtual Card';
    saveStates($states, $state_file);
    virtualCardMenu($chat_id);
    exit;
}

if ($callbackData === 'virtual_card_request_new') {
    $userId = vcUserId($states, $chat_id);
    $mobile = vcGetMobile($pdo, $userId);

    if ($mobile === '' || !vcIsEuropeanMobile($mobile)) {
        $states[$chat_id]['step'] = 'awaiting_eu_mobile';
        $states[$chat_id]['ticket_flow']['card_type'] = 'Virtual Card';
        saveStates($states, $state_file);
        sendMessage($chat_id, vcRequestNotice());
        exit;
    }

    $card = vcFetchCard($pdo, $userId);
    if (!$card) {
        $card = vcAssignAvailableCard($pdo, $userId);
    }
    vcCreateOrUpdateRequest($pdo, $userId, $mobile);

    if ($card) {
        sendInlineKeyboard(
            $chat_id,
            vcCardMessage($card),
            [
                [['text' => '⚙️ Manage Card', 'callback_data' => 'virtual_card_manage']],
                [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
            ]
        );
        exit;
    }

    sendInlineKeyboard(
        $chat_id,
        "✅ <b>Virtual Card Request Accepted</b>\n\nYour request has been registered successfully.\n\nAs soon as your card is prepared by our Card Operations Department, it will become available in the <b>Current Card</b> section.",
        [
            [['text' => '🪪 Current Card', 'callback_data' => 'virtual_card_current']],
            [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
        ]
    );
    exit;
}

if ($callbackData === 'virtual_card_current') {
    $userId = vcUserId($states, $chat_id);
    $card = vcFetchCard($pdo, $userId);
    if (!$card) {
        sendInlineKeyboard(
            $chat_id,
            "🪪 <b>Current Virtual Card</b>\n\nNo active virtual card is currently assigned to your verified FinoviaPay account.\n\nPlease tap <b>Request New Card</b> to continue your secure virtual card request.",
            [
                [['text' => '➕ Request New Card', 'callback_data' => 'virtual_card_request_new']],
                [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
            ]
        );
        exit;
    }

    sendInlineKeyboard(
        $chat_id,
        vcCardMessage($card),
        [
            [['text' => '⚙️ Manage Card', 'callback_data' => 'virtual_card_manage']],
            [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
        ]
    );
    exit;
}

if ($callbackData === 'virtual_card_manage') {
    vcManageMenu($chat_id);
    exit;
}

if ($callbackData === 'virtual_card_support') {
    $states[$chat_id]['step'] = 'ticket_issue_type';
    $states[$chat_id]['ticket_flow']['card_type'] = 'Virtual Card';
    saveStates($states, $state_file);
    cardServicesIssueMenu($chat_id, 'Virtual Card');
    exit;
}

if (($states[$chat_id]['step'] ?? '') === 'awaiting_eu_mobile' && empty($callbackData) && !empty($text)) {
    $userId = vcUserId($states, $chat_id);
    $mobile = trim((string)$text);

    if (!vcIsEuropeanMobile($mobile)) {
        sendMessage($chat_id, "📲 <b>Invalid Mobile Number Format</b>\n\nPlease enter a valid European mobile number with the full country code.\n\nExample: <b>+34XXXXXXXXX</b>");
        exit;
    }

    if (!vcSaveMobile($pdo, $userId, $mobile)) {
        sendMessage($chat_id, "We were unable to save your European mobile number at this time. Please try again shortly.");
        exit;
    }

    vcCreateOrUpdateRequest($pdo, $userId, $mobile);
    unset($states[$chat_id]['step']);
    $states[$chat_id]['ticket_flow']['card_type'] = 'Virtual Card';
    saveStates($states, $state_file);

    sendInlineKeyboard(
        $chat_id,
        "✅ <b>European Mobile Number Confirmed</b>\n\nYour mobile number has been recorded successfully for secure 3D verification SMS authentication.\n\nPlease tap <b>Request New Card</b> again to continue. If a card has already been prepared for your account, it will be assigned automatically.",
        [
            [['text' => '➕ Request New Card', 'callback_data' => 'virtual_card_request_new']],
            [['text' => '↩️ Back to Virtual Card Menu', 'callback_data' => 'ticket_card_type_virtual']]
        ]
    );
    exit;
}

if (($states[$chat_id]['step'] ?? '') === 'virtual_card_menu' && empty($callbackData) && empty($text)) {
    virtualCardMenu($chat_id);
    exit;
}

?>