<?php

require_once __DIR__ . "/config.php";

// =====================================================
// NÚCLEO - SISTEMA DE LOG E ERROS
// =====================================================
function bot_log($file, $data)
{
    $content = date("Y//-d H:i:s")
        . "\n"
        . (
            is_array($data)
            ? json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
            : $data
        )
        . "\n\n";

    file_put_contents(
        __DIR__ . "/" . $file,
        $content,
        FILE_APPEND
    );
}


// =====================================================
// NÚCLEO - TELEGRAM API
// =====================================================
function telegram_api_request($method, $params = [])
{
    $url = API_URL . $method;

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($params),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTPHEADER => ["Content-Type: application/json"]
    ]);

    $response = curl_exec($ch);
    if ($response === false) {
        log_error("TELEGRAM_API", curl_error($ch), ["method" => $method]);
    } elseif (curl_errno($ch)) {
        bot_log("telegram_error.log", curl_error($ch));
    }

    curl_close($ch);

    $json = json_decode($response, true);
    if (!is_array($json)) {
        bot_log("telegram_error.log", [
            "method" => $method,
            "response" => $response
        ]);
        return [];
    }

    return $json;
}


// =====================================================
// ENVIO DE MENSAGEM
// =====================================================
function send_message($chat_id, $text, $reply_markup = null)
{
    $params = [
        "chat_id" => $chat_id,
        "text" => $text,
        "parse_mode" => "HTML",
        "disable_web_page_preview" => true
    ];

    if ($reply_markup !== null) {
        $params["reply_markup"] = $reply_markup;
    }

    return telegram_api_request("sendMessage", $params);
}


// =====================================================
// ENVIO DE DOCUMENTO
// =====================================================
function send_document($chat_id, $file, $caption = "")
{
    if (!file_exists($file)) {
        return false;
    }

    $ch = curl_init(API_URL . "sendDocument");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => [
            "chat_id" => $chat_id,
            "caption" => $caption,
            "document" => new CURLFile($file)
        ]
    ]);

    $response = curl_exec($ch);
    if ($response === false) {
        bot_log("telegram_error.log", curl_error($ch));
        curl_close($ch);
        return false;
    }

    curl_close($ch);
    return json_decode($response, true);
}


// =====================================================
// BLOCO 2 - SISTEMA DE USUÁRIOS
// =====================================================
function get_user($telegram_id)
{
    return db_fetch(
        "SELECT * FROM users WHERE telegram_id=?",
        [$telegram_id]
    );
}

function create_user($telegram_id, $data = [])
{
    $exists = get_user($telegram_id);
    if ($exists) return $exists;

    db_exec(
        "INSERT INTO users (telegram_id, username, first_name, last_name, balance, is_blocked, referral_code) VALUES (?,?,?,?,0,0,?)",
        [
            $telegram_id,
            $data["username"] ?? null,
            $data["first_name"] ?? "",
            $data["last_name"] ?? "",
            generate_referral_code($telegram_id)
        ]
    );

    return get_user($telegram_id);
}

function update_user_profile($telegram_id, $data = [])
{
    db_exec(
        "UPDATE users SET username=?, first_name=?, last_name=? WHERE telegram_id=?",
        [
            $data["username"] ?? null,
            $data["first_name"] ?? "",
            $data["last_name"] ?? "",
            $telegram_id
        ]
    );
    return get_user($telegram_id);
}

function block_user($telegram_id)
{
    $result = db_exec(
        "UPDATE users SET is_blocked=1 WHERE telegram_id=?",
        [$telegram_id]
    );
    audit_log($telegram_id, "USER_BLOCKED");
    return $result;
}

function unblock_user($telegram_id)
{
    $result = db_exec(
        "UPDATE users SET is_blocked=0 WHERE telegram_id=?",
        [$telegram_id]
    );
    audit_log($telegram_id, "USER_UNBLOCKED");
    return $result;
}

function user_blocked($telegram_id)
{
    $user = get_user($telegram_id);
    return $user ? ($user["is_blocked"] == 1) : false;
}

function get_balance($telegram_id)
{
    $user = get_user($telegram_id);
    return $user ? (float)$user["balance"] : 0;
}

function add_balance($telegram_id, $amount, $description = "")
{
    db_begin();
    try {
        db_exec(
            "UPDATE users SET balance = balance + ? WHERE telegram_id=?",
            [$amount, $telegram_id]
        );

        if (!empty($description)) {
            db_exec(
                "INSERT INTO wallet_transactions (telegram_id, type, amount, description, created_at) VALUES (?,?,?,?,datetime('now'))",
                [$telegram_id, "credit", $amount, $description]
            );
        }

        db_commit();
        return true;
    } catch (Exception $e) {
        db_rollback();
        bot_log("wallet_error.log", $e->getMessage());
        return false;
    }
}

function remove_balance($telegram_id, $amount, $description = "")
{
    $user = db_fetch("SELECT balance FROM users WHERE telegram_id=?", [$telegram_id]);
    if (!$user || $user["balance"] < $amount) return false;

    db_begin();
    try {
        db_exec(
            "UPDATE users SET balance = balance - ? WHERE telegram_id=?",
            [$amount, $telegram_id]
        );

        if (!empty($description)) {
            db_exec(
                "INSERT INTO wallet_transactions (telegram_id, type, amount, description, created_at) VALUES (?,?,?,?,datetime('now'))",
                [$telegram_id, "debit", $amount, $description]
            );
        }

        // Adiciona cashback e bônus de indicação se houver descrição de compra
        if (preg_match('/Plano ID: (\d+)/', $description, $matches)) {
            $plan = get_plan($matches[1]);
            if ($plan) {
                give_cashback($telegram_id, $plan["price_client"]);
                give_referral_bonus($telegram_id, $plan["price_client"]);
            }
        }

        db_commit();
        return true;
    } catch (Exception $e) {
        db_rollback();
        return false;
    }
}


function transfer_balance($from, $to, $amount)
{
    db_begin();
    try {
        $removed = remove_balance($from, $amount, "Transferência para ID: $to");
        if (!$removed) throw new Exception("Saldo insuficiente");

        add_balance($to, $amount, "Transferência recebida de ID: $from");
        db_exec(
            "INSERT INTO transfers (from_user, to_user, amount) VALUES (?,?,?)",
            [$from, $to, $amount]
        );

        db_commit();
        return true;
    } catch (Exception $e) {
        db_rollback();
        bot_log("user_error.log", $e->getMessage());
        return false;
    }
}


// =====================================================
// BLOCO 3 - SISTEMA DE ESTADOS
// =====================================================
function set_state($telegram_id, $state, $data = null, $minutes = 15)
{
    $expire = date("Y-m-d H:i:s", strtotime("+" . $minutes . " minutes"));
    db_exec(
        "INSERT OR REPLACE INTO user_states (telegram_id, state, data, expires_at) VALUES (?,?,?,?)",
        [
            $telegram_id,
            $state,
            $data !== null ? json_encode($data, JSON_UNESCAPED_UNICODE) : null,
            $expire
        ]
    );
    return true;
}

function get_state($telegram_id)
{
    $state = db_fetch("SELECT * FROM user_states WHERE telegram_id=?", [$telegram_id]);
    if (!$state) return null;

    // Verifica validade
    if (isset($state["expires_at"]) && strtotime($state["expires_at"]) < time()) {
        clear_state($telegram_id);
        return null;
    }

    $state["data"] = !empty($state["data"]) ? json_decode($state["data"], true) : [];
    return $state;
}

function clear_state($telegram_id)
{
    return db_exec("DELETE FROM user_states WHERE telegram_id=?", [$telegram_id]);
}

function update_state_data($telegram_id, $data)
{
    return db_exec(
        "UPDATE user_states SET data=? WHERE telegram_id=?",
        [json_encode($data, JSON_UNESCAPED_UNICODE), $telegram_id]
    );
}

function has_state($telegram_id, $state = null)
{
    $current = get_state($telegram_id);
    if (!$current) return false;
    return $state ? ($current["state"] == $state) : true;
}

function cleanup_states()
{
    db_exec("DELETE FROM user_states WHERE expires_at < CURRENT_TIMESTAMP");
}


// =====================================================
// BLOCO 4 - PLANOS E ASSINATURAS
// =====================================================
function get_plan($id)
{
    return db_fetch("SELECT * FROM plans WHERE id=?", [$id]);
}

function get_plans($only_active = true)
{
    if ($only_active) {
        return db_fetchAll("SELECT * FROM plans WHERE status=1 ORDER BY id DESC");
    }
    return db_fetchAll("SELECT * FROM plans ORDER BY id DESC");
}

function create_plan($name, $price_client, $price_reseller, $duration_value, $duration_unit)
{
    return db_exec(
        "INSERT INTO plans (name, price_client, price_reseller, duration_value, duration_unit, status) VALUES (?,?,?,?,?,1)",
        [$name, $price_client, $price_reseller, $duration_value, $duration_unit]
    );
}

function update_plan($id, $data = [])
{
    return db_exec(
        "UPDATE plans SET name=?, price_client=?, price_reseller=?, duration_value=?, duration_unit=? WHERE id=?",
        [
            $data["name"],
            $data["price_client"],
            $data["price_reseller"],
            $data["duration_value"],
            $data["duration_unit"],
            $id
        ]
    );
}

function toggle_plan($id)
{
    return db_exec(
        "UPDATE plans SET status = CASE WHEN status=1 THEN 0 ELSE 1 END WHERE id=?",
        [$id]
    );
}

function delete_plan($id)
{
    return db_exec("DELETE FROM plans WHERE id=?", [$id]);
}

function get_subscription($user_id, $plan_id = null)
{
    if ($plan_id) {
        return db_fetch(
            "SELECT * FROM subscriptions WHERE user_id=? AND plan_id=? AND status='active' LIMIT 1",
            [$user_id, $plan_id]
        );
    }
    return db_fetch(
        "SELECT * FROM subscriptions WHERE user_id=? AND status='active' ORDER BY id DESC LIMIT 1",
        [$user_id]
    );
}

function activate_subscription($user_id, $plan_id)
{
    $plan = get_plan($plan_id);
    if (!$plan) return false;

    $current = get_subscription($user_id, $plan_id);
    if ($current) {
        $base = strtotime($current["expire_date"]) < time() ? time() : strtotime($current["expire_date"]);
        $end = date("Y-m-d H:i:s", strtotime("+" . $plan["duration_value"] . " " . $plan["duration_unit"], $base));
        db_exec(
            "UPDATE subscriptions SET expire_date=?, status='active' WHERE id=?",
            [$end, $current["id"]]
        );
    } else {
        $end = date("Y-m-d H:i:s", strtotime("+" . $plan["duration_value"] . " " . $plan["duration_unit"]));
        db_exec(
            "INSERT INTO subscriptions (user_id, plan_id, expire_date, status) VALUES (?,?,?,'active')",
            [$user_id, $plan_id, $end]
        );
    }

    create_notification(
        $user_id,
        "SUBSCRIPTION_ACTIVE",
        "✅ <b>Plano ativado com sucesso!</b>\n\n📦 Plano: {$plan['name']}\n📅 Validade até: {$end}"
    );
    return $end;
}

function cancel_subscription($subscription_id)
{
    return db_exec("UPDATE subscriptions SET status='cancelled' WHERE id=?", [$subscription_id]);
}

function check_subscription_expired()
{
    $expired = db_fetchAll("SELECT * FROM subscriptions WHERE status='active' AND expire_date < CURRENT_TIMESTAMP");
    foreach ($expired as $sub) {
        db_exec("UPDATE subscriptions SET status='expired' WHERE id=?", [$sub["id"]]);
    }
    return count($expired);
}

function renew_subscription($user_id, $plan_id)
{
    $plan = get_plan($plan_id);
    if (!$plan) return false;

    $subscription = db_fetch(
        "SELECT * FROM subscriptions WHERE user_id=? AND plan_id=? ORDER BY id DESC LIMIT 1",
        [$user_id, $plan_id]
    );

    if ($subscription) {
        $current_end = strtotime($subscription["expire_date"]) < time() ? time() : strtotime($subscription["expire_date"]);
        $new_end = date("Y-m-d H:i:s", strtotime("+" . $plan["duration_value"] . " " . $plan["duration_unit"], $current_end));
        db_exec(
            "UPDATE subscriptions SET expire_date=?, status='active' WHERE id=?",
            [$new_end, $subscription["id"]]
        );
    } else {
        $new_end = date("Y-m-d H:i:s", strtotime("+" . $plan["duration_value"] . " " . $plan["duration_unit"]));
        db_exec(
            "INSERT INTO subscriptions (user_id, plan_id, expire_date, status) VALUES (?,?,?,'active')",
            [$user_id, $plan_id, $new_end]
        );
    }

    db_exec(
        "INSERT INTO subscription_history (user_id, plan_id, action, created_at) VALUES (?,?,?,CURRENT_TIMESTAMP)",
        [$user_id, $plan_id, "renew"]
    );
    return $new_end;
}


// =====================================================
// LOG CENTRAL / SISTEMA DE AUDITORIA
// =====================================================
function audit_log($telegram_id, $action, $details = null)
{
    db_exec(
        "INSERT INTO audit_logs (telegram_id, action, details, created_at) VALUES (?,?,?,datetime('now'))",
        [
            $telegram_id,
            $action,
            $details !== null ? json_encode($details, JSON_UNESCAPED_UNICODE) : null
        ]
    );
}

function user_action_log($telegram_id, $action, $data = [])
{
    audit_log($telegram_id, $action, $data);
}


// =====================================================
// SISTEMA DE NOTIFICAÇÕES
// =====================================================
function create_notification($telegram_id, $type, $message)
{
    db_exec(
        "INSERT INTO notifications (telegram_id, type, message, status, created_at) VALUES (?,?,?,?,datetime('now'))",
        [$telegram_id, $type, $message, "pending"]
    );
}

function get_pending_notifications($telegram_id)
{
    return db_fetchAll(
        "SELECT * FROM notifications WHERE telegram_id=? AND status='pending' ORDER BY id ASC",
        [$telegram_id]
    );
}

function send_pending_notifications($telegram_id)
{
    $notifications = get_pending_notifications($telegram_id);
    foreach ($notifications as $n) {
        send_message($telegram_id, $n["message"]);
        db_exec("UPDATE notifications SET status='sent' WHERE id=?", [$n["id"]]);
    }
}

function notify_subscription_expire()
{
    $subs = db_fetchAll(
        "SELECT s.*, u.telegram_id, p.name 
         FROM subscriptions s
         INNER JOIN users u ON u.id=s.user_id
         INNER JOIN plans p ON p.id=s.plan_id
         WHERE s.status='active'
         AND datetime(s.expire_date) BETWEEN datetime('now') AND datetime('now','+3 day')"
    );

    foreach ($subs as $sub) {
        create_notification(
            $sub["telegram_id"],
            "EXPIRING",
            "⚠️ <b>Aviso de vencimento</b>\n\n📦 Plano: {$sub['name']}\n📅 Vencimento: {$sub['expire_date']}\n\nRenove para continuar usando."
        );
    }
}


// =====================================================
// SISTEMA ANTIFRAUDE
// =====================================================
function get_client_ip()
{
    return $_SERVER["REMOTE_ADDR"] ?? "unknown";
}

function register_access($telegram_id)
{
    $ip = get_client_ip();
    db_exec(
        "INSERT INTO access_logs (telegram_id, ip, user_agent, created_at) VALUES (?,?,?,datetime('now'))",
        [
            $telegram_id,
            $ip,
            $_SERVER["HTTP_USER_AGENT"] ?? ""
        ]
    );
}

function count_accounts_by_ip($ip)
{
    $result = db_fetch("SELECT COUNT(DISTINCT telegram_id) total FROM access_logs WHERE ip=?", [$ip]);
    return $result["total"] ?? 0;
}

function check_fraud($telegram_id)
{
    $ip = get_client_ip();
    $accounts = count_accounts_by_ip($ip);
    $limit = (int)get_setting("max_accounts_ip", 5);

    if ($accounts > $limit) {
        db_exec("UPDATE users SET is_blocked=1 WHERE telegram_id=?", [$telegram_id]);
        audit_log($telegram_id, "AUTO_BLOCK_FRAUD", ["ip" => $ip, "accounts" => $accounts]);
        return false;
    }
    return true;
}

function register_attempt($telegram_id, $action)
{
    db_exec(
        "INSERT INTO fraud_attempts (telegram_id, action, created_at) VALUES (?,?,datetime('now'))",
        [$telegram_id, $action]
    );
}


// =====================================================
// CARTEIRA FINANCEIRA
// =====================================================
function get_wallet_history($telegram_id, $limit = 20)
{
    return db_fetchAll(
        "SELECT * FROM wallet_transactions WHERE telegram_id=? ORDER BY id DESC LIMIT {$limit}",
        [$telegram_id]
    );
}


// =====================================================
// SISTEMA DE CASHBACK E AFILIADOS
// =====================================================
function generate_referral_code($telegram_id)
{
    return "USR" . $telegram_id;
}

function set_referrer($user_id, $referrer_id)
{
    if ($user_id == $referrer_id) return false;
    $exists = db_fetch("SELECT * FROM referrals WHERE user_id=?", [$user_id]);
    if ($exists) return false;

    db_exec(
        "INSERT INTO referrals (user_id, referrer_id, created_at) VALUES (?,?,datetime('now'))",
        [$user_id, $referrer_id]
    );
    return true;
}

function get_referrer($user_id)
{
    return db_fetch("SELECT * FROM referrals WHERE user_id=?", [$user_id]);
}

function give_cashback($telegram_id, $amount)
{
    $percent = (float)get_setting("cashback_percent", 5);
    if ($percent <= 0) return;

    $cashback = ($amount * $percent) / 100;
    add_balance($telegram_id, $cashback, "Cashback de compra");
    audit_log($telegram_id, "CASHBACK_RECEIVED", ["value" => $cashback]);
}

function give_referral_bonus($buyer_id, $purchase_value)
{
    $ref = get_referrer($buyer_id);
    if (!$ref) return;

    $percent = (float)get_setting("affiliate_percent", 10);
    $bonus = ($purchase_value * $percent) / 100;
    add_balance($ref["referrer_id"], $bonus, "Comissão de indicação");
    audit_log($ref["referrer_id"], "AFFILIATE_BONUS", ["buyer" => $buyer_id, "value" => $bonus]);
}


// =====================================================
// SISTEMA DE CUPONS
// =====================================================
function create_coupon($code, $type, $value, $limit = 1, $expires = null)
{
    db_exec(
        "INSERT INTO coupons (code, type, value, usage_limit, used_count, expires_at, status) VALUES (?,?,?,?,0,?,1)",
        [strtoupper($code), $type, $value, $limit, $expires]
    );
    return true;
}

function get_coupon($code)
{
    return db_fetch("SELECT * FROM coupons WHERE code=? AND status=1", [strtoupper($code)]);
}

function check_coupon_available($coupon)
{
    if (!$coupon) return false;
    if ($coupon["usage_limit"] > 0 && $coupon["used_count"] >= $coupon["usage_limit"]) return false;
    if ($coupon["expires_at"] && strtotime($coupon["expires_at"]) < time()) return false;
    return true;
}

function redeem_coupon($telegram_id, $code)
{
    $coupon = get_coupon($code);
    if (!check_coupon_available($coupon)) return false;

    $already = db_fetch("SELECT * FROM coupon_users WHERE telegram_id=? AND coupon_id=?", [$telegram_id, $coupon["id"]]);
    if ($already) return false;

    db_exec("INSERT INTO coupon_users (telegram_id, coupon_id) VALUES (?,?)", [$telegram_id, $coupon["id"]]);
    db_exec("UPDATE coupons SET used_count=used_count+1 WHERE id=?", [$coupon["id"]]);

    if ($coupon["type"] == "balance") {
        add_balance($telegram_id, $coupon["value"], "Cupom {$coupon['code']}");
    }
    return $coupon;
}


// =====================================================
// SISTEMA ADMINISTRATIVO AVANÇADO
// =====================================================
function is_admin($telegram_id)
{
    $user = get_user($telegram_id);
    return $user ? ($user["is_admin"] == 1) : false;
}

function admin_stats()
{
    $users = db_fetch("SELECT COUNT(*) total FROM users");
    $active = db_fetch("SELECT COUNT(*) total FROM subscriptions WHERE status='active'");
    $sales = db_fetch("SELECT SUM(amount) total FROM sales");

    return [
        "users" => $users["total"] ?? 0,
        "active" => $active["total"] ?? 0,
        "sales" => $sales["total"] ?? 0
    ];
}

function update_setting($key, $value)
{
    db_exec("INSERT OR REPLACE INTO settings (key, value) VALUES (?,?)", [$key, $value]);
}

function get_all_settings()
{
    return db_fetchAll("SELECT * FROM settings ORDER BY key");
}

function get_setting($key, $default = null)
{
    $result = db_fetch("SELECT value FROM settings WHERE key=?", [$key]);
    return $result ? $result["value"] : $default;
}


// =====================================================
// CRIAR LINK DE CONVITE + VERIFICAR ACESSO AO GRUPO
// =====================================================
function create_invite_link($chat_id, $telegram_id, $plan_id)
{
    $response = telegram_api_request("createChatInviteLink", [
        "chat_id" => $chat_id,
        "member_limit" => 1,
        "expire_date" => time() + 86400
    ]);

    if (isset($response["ok"]) && $response["ok"]) {
        $link = $response["result"]["invite_link"];
        db_exec(
            "INSERT INTO group_members (telegram_id, group_id, plan_id, invite_link) VALUES (?,?,?,?)",
            [$telegram_id, $chat_id, $plan_id, $link]
        );
        return $link;
    }

    bot_log("invite_error.log", $response);
    return false;
}

function check_group_access($user_id, $group_id) {
    $sub = get_subscription($user_id);
    $group_plan = db_fetch("SELECT plan_id FROM plan_groups WHERE group_id=?", [$group_id]);
    
    if (!$sub || !$group_plan || $sub["plan_id"] != $group_plan["plan_id"]) {
        telegram_api_request("banChatMember", [
            "chat_id" => $group_id,
            "user_id" => $user_id,
            "revoke_messages" => false
        ]);
        telegram_api_request("unbanChatMember", [
            "chat_id" => $group_id,
            "user_id" => $user_id,
            "only_if_banned" => true
        ]);
        send_message($user_id, "🚫 Você não tem acesso a este grupo.");
    }
}


// =====================================================
// SISTEMA DE BACKUP SQLITE
// =====================================================
function create_backup()
{
    if (!file_exists(DB_PATH)) return false;

    $folder = __DIR__ . "/backups";
    if (!is_dir($folder)) mkdir($folder, 0755, true);

    $file = $folder . "/backup_" . date("Y-m-d_H-i-s") . ".db";
    return copy(DB_PATH, $file) ? $file : false;
}

function list_backups()
{
    $folder = __DIR__ . "/backups";
    if (!is_dir($folder)) return [];
    return glob($folder . "/backup_*.db");
}

function delete_old_backups($days = 30)
{
    $files = list_backups();
    foreach ($files as $file) {
        if (filemtime($file) < time() - ($days * 86400)) {
            unlink($file);
        }
    }
}

function restore_backup($file)
{
    if (!file_exists($file)) return false;
    $before = create_backup();
    if (!$before) return false;
    return copy($file, DB_PATH);
}

function secure_backup()
{
    $backup = create_backup();
    if ($backup) {
        bot_log("backup.log", ["created" => $backup]);
    }
    delete_old_backups();
}


// =====================================================
// SISTEMA AVANÇADO DE LOGS
// =====================================================
function system_log($level, $module, $message, $data = null)
{
    db_exec(
        "INSERT INTO system_logs (level, module, message, data, created_at) VALUES (?,?,?,?,datetime('now'))",
        [
            $level,
            $module,
            $message,
            $data !== null ? json_encode($data, JSON_UNESCAPED_UNICODE) : null
        ]
    );
}

function log_error($module, $error, $data = [])
{
    system_log("ERROR", $module, $error, $data);
    bot_log("system_error.log", ["module" => $module, "error" => $error, "data" => $data]);
}

function log_event($module, $event, $data = [])
{
    system_log("INFO", $module, $event, $data);
}

function system_health()
{
    $users = db_fetch("SELECT COUNT(*) total FROM users");
    $plans = db_fetch("SELECT COUNT(*) total FROM plans");
    $subs = db_fetch("SELECT COUNT(*) total FROM subscriptions WHERE status='active'");

    return [
        "users" => $users["total"] ?? 0,
        "plans" => $plans["total"] ?? 0,
        "subscriptions" => $subs["total"] ?? 0,
        "php" => PHP_VERSION,
        "memory" => memory_get_usage(true)
    ];
}

function get_system_errors($limit = 10)
{
    return db_fetchAll("SELECT * FROM system_logs WHERE level='ERROR' ORDER BY id DESC LIMIT {$limit}");
}


// =====================================================
// CRIAR LINK DE CONVITE
// =====================================================
function create_invite_link($chat_id, $telegram_id, $plan_id)
{
    $response = telegram_api_request("createChatInviteLink", [
        "chat_id" => $chat_id,
        "member_limit" => 1,
        "expire_date" => time() + 86400
    ]);

    if (isset($response["ok"]) && $response["ok"]) {
        $link = $response["result"]["invite_link"];
        db_exec(
            "INSERT INTO group_members (telegram_id, group_id, plan_id, invite_link) VALUES (?,?,?,?)",
            [$telegram_id, $chat_id, $plan_id, $link]
        );
        return $link;
    }

    bot_log("invite_error.log", $response);
    return false;
}


// =====================================================
// TON - COTAÇÃO E VERIFICAÇÃO DE PAGAMENTO
// =====================================================
function get_ton_price_brl()
{
    $url = "https://api.coingecko.com/api/v3/simple/price?ids=the-open-network&vs_currencies=brl";
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 15
    ]);

    $response = curl_exec($ch);
    curl_close($ch);
    $data = json_decode($response, true);
    return $data["the-open-network"]["brl"] ?? false;
}

function check_ton_payment($address, $expected_amount, $comment)
{
    $url = "https://toncenter.com/api/v2/getTransactions?address=" . urlencode($address) . "&limit=50";
    $headers = [];

    if (defined("TON_API_KEY") && TON_API_KEY) {
        $headers[] = "X-API-Key: " . TON_API_KEY;
    }

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_TIMEOUT => 20
    ]);

    $response = curl_exec($ch);
    curl_close($ch);
    $data = json_decode($response, true);

    if (!isset($data["result"])) return false;

    foreach ($data["result"] as $tx) {
        $value = $tx["in_msg"]["value"] ?? 0;
        $msg = $tx["in_msg"]["message"] ?? "";

        if ((int)$value === (int)$expected_amount && $msg === $comment) {
            return $tx["transaction_id"]["hash"] ?? false;
        }
    }
    return false;
}


// =====================================================
// TECLADOS DINÂMICOS
// =====================================================
function get_dynamic_keyboard($telegram_id)
{
    $user = db_fetch("SELECT * FROM users WHERE telegram_id=?", [$telegram_id]);
    if ($user && $user["is_blocked"]) {
        return ["remove_keyboard" => true];
    }

    $buttons = [
        [
            ["text" => "🛒 Comprar Plano"],
            ["text" => "💰 Meu Saldo"]
        ],
        [
            ["text" => "🎁 Resgatar Gift"],
            ["text" => "🎟 Usar Cupom"],
            ["text" => "💎 Adicionar Saldo"]
        ]
    ];

    if (get_setting("p2p_enabled", "1") == "1") {
        $buttons[] = [["text" => "💸 Transferir P2P"]];
    }

    if (defined("ADMIN_USERNAME") && $user && $user["username"] === ADMIN_USERNAME) {
        $buttons[] = [["text" => "⚙️ Admin"]];
    }

    $reseller = db_fetch("SELECT * FROM resellers WHERE telegram_id=?", [$telegram_id]);
    if ($reseller) {
        $buttons[] = [["text" => "👤 Painel Revendedor"]];
    } else {
        $buttons[] = [["text" => "🤝 Ser Revendedor"]];
    }

    return ["keyboard" => $buttons, "resize_keyboard" => true];
}

function get_admin_keyboard()
{
    return [
        "keyboard" => [
            [["text" => "📋 Planos"], ["text" => "➕ Criar Plano"]],
            [["text" => "👥 Clientes"], ["text" => "📊 Financeiro"], ["text" => "📈 Estatísticas"]],
            [["text" => "🎫 Gifts/Cupons"], ["text" => "📢 Broadcast"]],
            [["text" => "💾 Backup"], ["text" => "💾 Criar Backup"], ["text" => "🔍 Checar Vencidos"]],
            [["text" => "🩺 Diagnóstico"], ["text" => "🔙 Voltar"]]
        ],
        "resize_keyboard" => true
    ];
}

function get_reseller_keyboard()
{
    return [
        "keyboard" => [
            [["text" => "🛒 Vender Plano"]],
            [["text" => "👥 Meus Clientes"], ["text" => "📜 Minhas Vendas"]],
            [["text" => "💰 Meu Saldo"], ["text" => "💎 Adicionar Saldo"]],
            [["text" => "🔙 Voltar"]]
        ],
        "resize_keyboard" => true
    ];
}


// =====================================================
// ENVIA ACESSO DO PLANO
// =====================================================
function send_plan_access($telegram_id, $plan_id, $plan_name, $end_date)
{
    $groups = db_fetchAll("SELECT group_id FROM plan_groups WHERE plan_id=?", [$plan_id]);
    $msg = "✅ <b>Plano ativado!</b>\n\n📦 Plano: {$plan_name}\n📅 Validade: {$end_date}\n\n🔗 <b>Links de acesso:</b>";

    if (!$groups) {
        $msg .= "\n\n⚠️ Nenhum grupo vinculado.";
    } else {
        foreach ($groups as $group) {
            $link = create_invite_link($group["group_id"], $telegram_id, $plan_id);
            if ($link) $msg .= "\n{$link}";
        }
    }

    send_message($telegram_id, $msg);
}


// =====================================================
// PROCESSAMENTO DE PAGAMENTOS
// =====================================================
function confirm_payment($payment_id)
{
    $payment = db_fetch("SELECT * FROM payments WHERE id=?", [$payment_id]);
    if (!$payment || $payment["status"] == "paid") return false;

    db_begin();
    try {
        db_exec("UPDATE payments SET status='paid' WHERE id=?", [$payment_id]);
        db_exec("UPDATE users SET balance=balance+? WHERE telegram_id=?", [$payment["amount"], $payment["telegram_id"]]);
        db_exec(
            "INSERT INTO balance_history (telegram_id, amount, type, description, created_at) VALUES (?,?,?,?,datetime('now'))",
            [$payment["telegram_id"], $payment["amount"], "credit", "Pagamento confirmado"]
        );

        db_commit();
        send_message(
            $payment["telegram_id"],
            "✅ <b>Pagamento confirmado!</b>\n\n💰 Saldo adicionado: R$ " . number_format($payment["amount"], 2, ",", ".")
        );
        return true;
    } catch (Exception $e) {
        db_rollback();
        bot_log("payment_error.log", $e->getMessage());
        return false;
    }
}

function process_payment_success($transaction_id)
{
    $payment = db_fetch("SELECT * FROM payments WHERE transaction_id=? LIMIT 1", [$transaction_id]);
    if (!$payment || $payment["status"] === "approved") return false;

    db_exec("UPDATE payments SET status='approved', updated_at=CURRENT_TIMESTAMP WHERE id=?", [$payment["id"]]);
    $plan = get_plan($payment["plan_id"]);
    if (!$plan) return false;

    $end_date = renew_subscription($payment["user_id"], $payment["plan_id"]);
    send_plan_access($payment["user_id"], $payment["plan_id"], $plan["name"], $end_date);
    db_exec(
        "INSERT INTO payment_history (payment_id, action, created_at) VALUES (?,?,CURRENT_TIMESTAMP)",
        [$payment["id"], "approved"]
    );

    bot_log("payment_success.log", [
        "transaction_id" => $transaction_id,
        "user_id" => $payment["user_id"],
        "plan_id" => $payment["plan_id"]
    ]);
    return true;
}

function create_payment_checkout($transaction_id)
{
    $payment = db_fetch("SELECT * FROM payments WHERE transaction_id=? LIMIT 1", [$transaction_id]);
    if (!$payment) return false;

    $checkout = [
        "code" => "AGUARDANDO_GATEWAY",
        "qr" => null,
        "expires" => date("Y-m-d H:i:s", strtotime("+30 minutes"))
    ];

    db_exec(
        "UPDATE payments SET payment_code=?, expires_at=?, updated_at=CURRENT_TIMESTAMP WHERE id=?",
        [$checkout["code"], $checkout["expires"], $payment["id"]]
    );
    return $checkout;
}


// =====================================================
// GERENCIAMENTO DE MEMBROS E VENCIMENTOS
// =====================================================
function remove_expired_members()
{
    $members = db_fetchAll("SELECT * FROM group_members");
    foreach ($members as $m) {
        $sub = db_fetch("SELECT * FROM subscriptions WHERE user_id=? AND status='active'", [$m["telegram_id"]]);
        if (!$sub) {
            telegram_api_request("banChatMember", [
                "chat_id" => $m["group_id"],
                "user_id" => $m["telegram_id"],
                "revoke_messages" => false
            ]);
            telegram_api_request("unbanChatMember", [
                "chat_id" => $m["group_id"],
                "user_id" => $m["telegram_id"],
                "only_if_banned" => true
            ]);
            db_exec("DELETE FROM group_members WHERE id=?", [$m["id"]]);
        }
    }
}

function check_expired_subscriptions()
{
    $expired = db_fetchAll("SELECT * FROM subscriptions WHERE status='active' AND end_date < datetime('now')");
    foreach ($expired as $sub) {
        db_exec("UPDATE subscriptions SET status='expired' WHERE id=?", [$sub["id"]]);

        $groups = db_fetchAll("SELECT group_id FROM plan_groups WHERE plan_id=?", [$sub["plan_id"]]);
        $user = db_fetch("SELECT telegram_id FROM users WHERE id=?", [$sub["user_id"]]);

        if ($user && $groups) {
            foreach ($groups as $group) {
                telegram_api_request("banChatMember", [
                    "chat_id" => $group["group_id"],
                    "user_id" => $user["telegram_id"],
                    "revoke_messages" => false
                ]);
                telegram_api_request("unbanChatMember", [
                    "chat_id" => $group["group_id"],
                    "user_id" => $user["telegram_id"],
                    "only_if_banned" => true
                ]);
            }
        }

        send_message(
            $user["telegram_id"],
            "⚠️ <b>Sua assinatura venceu.</b>\n\nSeu acesso aos grupos foi removido.\n\nRenove seu plano para continuar usando o serviço."
        );

        bot_log("subscription_expired.log", [
            "user_id" => $sub["user_id"],
            "plan_id" => $sub["plan_id"],
            "expired_at" => $sub["end_date"]
        ]);
    }
}

function send_expiration_alerts()
{
    $users = db_fetchAll(
        "SELECT u.telegram_id, p.name, s.end_date
         FROM subscriptions s
         INNER JOIN users u ON u.id=s.user_id
         INNER JOIN plans p ON p.id=s.plan_id
         WHERE s.status='active'"
    );

    foreach ($users as $u) {
        $dias = floor((strtotime($u["end_date"]) - time()) / 86400);
        if ($dias == 3 || $dias == 1) {
            send_message(
                $u["telegram_id"],
                "⚠️ <b>Aviso de vencimento</b>\n\n📦 Plano: {$u['name']}\n⏳ Vence em {$dias} dia(s)."
            );
        }
    }
}


// =====================================================
// RECEBE WEBHOOK TELEGRAM
// =====================================================
$input = file_get_contents("php://input");
if (!$input) exit;

$update = json_decode($input, true);
if (!$update) {
    bot_log("webhook_error.log", $input);
    exit;
}


// =====================================================
// TRATA ATUALIZAÇÕES DE MEMBROS DE GRUPO
// =====================================================
if (isset($update["chat_member"])) {
    $member = $update["chat_member"];
    $user_id = $member["new_chat_member"]["user"]["id"];
    $group_id = $member["chat"]["id"];

    if (function_exists("check_group_access")) {
        check_group_access($user_id, $group_id);
    }
    exit;
}


// =====================================================
// IDENTIFICA TIPO DE ATUALIZAÇÃO
// =====================================================
$message = null;
$callback = null;
$chat_id = null;
$from_id = null;
$text = "";
$data = "";

if (isset($update["callback_query"])) {
    $callback = $update["callback_query"];
    $chat_id = $callback["message"]["chat"]["id"];
    $from_id = $callback["from"]["id"];
    $data = $callback["data"];
} elseif (isset($update["message"])) {
    $message = $update["message"];
    $chat_id = $message["chat"]["id"];
    $from_id = $message["from"]["id"];
    $text = trim($message["text"] ?? "");
} else {
    exit;
}


// =====================================================
// IGNORA GRUPOS E CANAIS
// =====================================================
if ($message && $message["chat"]["type"] !== "private") {
    db_exec(
        "INSERT OR IGNORE INTO managed_chats (chat_id, chat_title, chat_type) VALUES (?,?,?)",
        [
            $chat_id,
            $message["chat"]["title"] ?? "",
            $message["chat"]["type"]
        ]
    );
    exit;
}


// =====================================================
// CRIA/ATUALIZA USUÁRIO AUTOMÁTICO
// =====================================================
$user = get_user($from_id);
if (!$user && $message) {
    $userData = [
        "username" => $message["from"]["username"] ?? null,
        "first_name" => $message["from"]["first_name"] ?? "",
        "last_name" => $message["from"]["last_name"] ?? ""
    ];
    $user = create_user($from_id, $userData);
}


// =====================================================
// VERIFICA BLOQUEIO
// =====================================================
if ($user && $user["is_blocked"]) {
    send_message($chat_id, "🚫 Sua conta está bloqueada.");
    exit;
}


// =====================================================
// REGISTRA ACESSO E VERIFICA FRAUDE
// =====================================================
register_access($from_id);
check_fraud($from_id);


// =====================================================
// CARREGA ESTADO ATUAL DO USUÁRIO
// =====================================================
$state_data = get_state($from_id);
$state = $state_data["state"] ?? null;
$data_state = $state_data["data"] ?? [];


// =====================================================
// COMANDO /START OU VOLTAR
// =====================================================
if (isset($text) && ($text == "/start" || $text == "🔙 Voltar")) {
    clear_state($from_id);
    send_message(
        $chat_id,
        "Olá <b>" . $user["first_name"] . "</b>!\n\nEscolha uma opção:",
        get_dynamic_keyboard($from_id)
    );
    exit;
}


// =====================================================
// MENU ADMINISTRATIVO
// =====================================================
if (isset($text)) {
    switch ($text) {
        // ABRIR ADMIN
        case "⚙️ Admin":
            set_state($from_id, "WAITING_ADMIN_PIN");
            send_message($chat_id, "🔐 Digite o PIN administrativo:");
            exit;

        // ESTATÍSTICAS ADMIN
        case "📈 Estatísticas":
            if (!is_admin($from_id)) {
                send_message($chat_id, "❌ Sem permissão.");
                exit;
            }
            $stats = admin_stats();
            send_message(
                $chat_id,
                "📊 <b>Estatísticas</b>\n\n👥 Usuários: {$stats['users']}\n✅ Assinaturas ativas: {$stats['active']}\n💰 Vendas: R$ " . number_format($stats['sales'], 2, ",", ".")
            );
            exit;

        // CRIAR BACKUP MANUAL
        case "💾 Criar Backup":
            if (!is_admin($from_id)) exit;
            $file = create_backup();
            if ($file) {
                send_document($chat_id, $file, "💾 Backup criado");
            } else {
                send_message($chat_id, "❌ Erro ao criar backup.");
            }
            exit;

        // LISTAR PLANOS
        case "📋 Planos":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            $plans = db_fetchAll("SELECT * FROM plans ORDER BY id DESC");
            if (!$plans) {
                send_message($chat_id, "📭 Nenhum plano cadastrado.");
                exit;
            }
            foreach ($plans as $p) {
                $status = $p["status"] ? "✅ Ativo" : "❌ Inativo";
                $keyboard = [
                    [["text" => "✏️ Editar nome", "callback_data" => "edit_name_" . $p["id"]]],
                    [["text" => "💰 Editar preço", "callback_data" => "edit_price_" . $p["id"]]],
                    [["text" => "⏳ Editar duração", "callback_data" => "edit_time_" . $p["id"]]],
                    [["text" => "🔄 Status", "callback_data" => "toggle_plan_" . $p["id"]], ["text" => "🗑 Excluir", "callback_data" => "delete_plan_" . $p["id"]]]
                ];
                send_message(
                    $chat_id,
                    "📦 <b>{$p['name']}</b>\n\n💰 Cliente: R$ " . number_format($p['price_client'], 2, ",", ".") . "\n🤝 Revendedor: R$ " . number_format($p['price_reseller'], 2, ",", ".") . "\n⏳ Duração: {$p['duration_value']} {$p['duration_unit']}\n{$status}",
                    ["inline_keyboard" => $keyboard]
                );
            }
            exit;

        // CRIAR PLANO
        case "➕ Criar Plano":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            clear_state($from_id);
            set_state($from_id, "WAITING_PLAN_NAME");
            send_message($chat_id, "Digite o nome do plano:");
            exit;

        // CLIENTES
        case "👥 Clientes":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            set_state($from_id, "WAITING_SEARCH_USER");
            send_message($chat_id, "Digite ID ou @username do cliente:");
            exit;

        // FINANCEIRO
        case "📊 Financeiro":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            $vendas = db_fetch("SELECT SUM(amount) total FROM sales");
            $clientes = db_fetch("SELECT SUM(balance) total FROM users");
            $revendedores = db_fetch("SELECT SUM(balance) total FROM resellers");
            send_message(
                $chat_id,
                "📊 <b>Financeiro</b>\n\n🛒 Vendas:\nR$ " . number_format($vendas['total'] ?? 0, 2, ",", ".") . "\n\n👥 Saldo clientes:\nR$ " . number_format($clientes['total'] ?? 0, 2, ",", ".") . "\n\n🤝 Saldo revendedores:\nR$ " . number_format($revendedores['total'] ?? 0, 2, ",", ".")
            );
            exit
            exit;

        // BACKUP GERAL
        case "💾 Backup":
            if (!is_admin($from_id) || !file_exists(DB_PATH)) {
                send_message($chat_id, "❌ Banco não encontrado.");
                exit;
            }
            send_document($chat_id, DB_PATH, "💾 Backup " . date("d/m/Y H:i"));
            exit;

        // DIAGNÓSTICO
        case "🩺 Diagnóstico":
            if (!is_admin($from_id)) exit;
            $status = system_health();
            send_message(
                $chat_id,
                "🩺 <b>Status do Sistema</b>\n\n👥 Usuários: {$status['users']}\n📦 Planos: {$status['plans']}\n✅ Assinaturas: {$status['subscriptions']}\n🐘 PHP: {$status['php']}\n💾 Memória: {$status['memory']} bytes"
            );
            exit;

        // RELATÓRIO GERAL
        case "📊 Relatório":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            $usuarios = db_fetch("SELECT COUNT(*) total FROM users");
            $ativos = db_fetch("SELECT COUNT(*) total FROM subscriptions WHERE status='active'");
            $vendas = db_fetch("SELECT SUM(amount) total FROM sales");
            send_message(
                $chat_id,
                "📊 <b>Relatório geral</b>\n\n👥 Usuários: " . ($usuarios['total'] ?? 0) . "\n\n✅ Assinaturas ativas: " . ($ativos['total'] ?? 0) . "\n\n💰 Total vendido: R$ " . number_format($vendas['total'] ?? 0, 2, ",", ".")
            );
            exit;

        // GERENCIAR GRUPOS
        case "👥 Grupos":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            $groups = db_fetchAll("SELECT * FROM managed_chats ORDER BY id DESC");
            if (!$groups) {
                send_message($chat_id, "📭 Nenhum grupo cadastrado.\n\nAdicione o bot como administrador no grupo.");
                exit;
            }
            foreach ($groups as $g) {
                send_message(
                    $chat_id,
                    "👥 <b>Grupo</b>\n\nNome: {$g['chat_title']}\nID: <code>{$g['chat_id']}</code>",
                    ["inline_keyboard" => [[["text" => "🔗 Vincular plano", "callback_data" => "link_group_" . $g['chat_id']]]]]
                );
            }
            exit;

        // BROADCAST
        case "📢 Broadcast":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            set_state($from_id, "WAITING_BROADCAST");
            send_message($chat_id, "📢 Digite a mensagem para enviar para todos:");
            exit;

        // GESTÃO DE REVENDEDORES
        case "🤝 Ser Revendedor":
            $exists = db_fetch("SELECT * FROM resellers WHERE telegram_id=?", [$from_id]);
            if ($exists) {
                send_message($chat_id, "⏳ Você já possui uma solicitação.");
                exit;
            }
            db_exec("INSERT INTO resellers (telegram_id, balance, approved) VALUES (?,?,0)", [$from_id, 0]);
            send_message($chat_id, "✅ Solicitação enviada.\nAguarde aprovação do administrador.");
            
            $admin = db_fetch("SELECT telegram_id FROM users WHERE username=?", [ADMIN_USERNAME]);
            if ($admin) {
                send_message(
                    $admin["telegram_id"],
                    "📢 Novo pedido de revendedor\n\nID: <code>{$from_id}</code>",
                    ["inline_keyboard" => [
                        [["text" => "✅ Aprovar", "callback_data" => "approve_reseller_" . $from_id], ["text" => "❌ Recusar", "callback_data" => "reject_reseller_" . $from_id]]
                    ]]
                );
            }
            exit;

        case "👤 Painel Revendedor":
            $res = db_fetch("SELECT * FROM resellers WHERE telegram_id=?", [$from_id]);
            if (!$res) {
                send_message($chat_id, "❌ Você não é revendedor.");
                exit;
            }
            if (!$res["approved"]) {
                send_message($chat_id, "⏳ Aguarde aprovação.");
                exit;
            }
            send_message(
                $chat_id,
                "👤 <b>Painel Revendedor</b>\n\n💰 Saldo: R$ " . number_format($res['balance'], 2, ",", "."),
                get_reseller_keyboard()
            );
            exit;

        case "🛒 Vender Plano":
            $res = db_fetch("SELECT * FROM resellers WHERE telegram_id=? AND approved=1", [$from_id]);
            if (!$res) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            set_state($from_id, "WAITING_RESELLER_CLIENT");
            send_message($chat_id, "Digite ID ou @username do cliente.");
            exit;

        // CUPONS E GIFTS
        case "🎟 Usar Cupom":
            set_state($from_id, "WAITING_COUPON");
            send_message($chat_id, "🎟 Digite o código do cupom:");
            exit;

        case "🎁 Resgatar Gift":
            set_state($from_id, "WAITING_GIFT");
            send_message($chat_id, "Digite o código do gift.");
            exit;

        // SALDO E COMPRAS
        case "💎 Adicionar Saldo":
            set_state($from_id, "WAITING_BALANCE_VALUE");
            send_message($chat_id, "💎 Digite o valor que deseja adicionar:\n\nExemplo: 10 ou 25.50");
            exit;

        case "💰 Meu Saldo":
            $saldo = get_balance($from_id);
            send_message(
                $chat_id,
                "💰 <b>Seu saldo:</b>\n\nR$ " . number_format($saldo, 2, ",", ".")
            );
            exit;

        case "🛒 Comprar Plano":
            $plans = db_fetchAll("SELECT * FROM plans WHERE status=1 ORDER BY id ASC");
            if (!$plans) {
                send_message($chat_id, "📭 Nenhum plano disponível.");
                exit;
            }
            $buttons = [];
            foreach ($plans as $plan) {
                $buttons[][] = [
                    "text" => $plan["name"] . " - R$ " . number_format($plan['price_client'], 2, ",", "."),
                    "callback_data" => "buy_plan_" . $plan["id"]
                ];
            }
            send_message(
                $chat_id,
                "📦 Escolha o plano desejado:",
                ["inline_keyboard" => $buttons]
            );
            exit;

        case "📅 Minha Assinatura":
            $sub = db_fetch(
                "SELECT s.*, p.name FROM subscriptions s INNER JOIN plans p ON p.id=s.plan_id WHERE s.user_id=? ORDER BY s.id DESC LIMIT 1",
                [$user["id"]]
            );
            if (!$sub) {
                send_message($chat_id, "📭 Você não possui assinatura ativa.");
                exit;
            }
            $status = $sub["status"] == "active" ? "✅ Ativa" : "❌ Expirada";
            send_message(
                $chat_id,
                "📅 <b>Minha assinatura</b>\n\n📦 Plano: {$sub['name']}\n\n⏳ Vencimento: " . date("d/m/Y H:i", strtotime($sub['end_date'])) . "\n\nStatus: {$status}"
            );
            exit;

        case "📜 Histórico":
            $sales = db_fetchAll(
                "SELECT s.*, p.name FROM sales s INNER JOIN plans p ON p.id=s.plan_id WHERE user_id=? ORDER BY s.id DESC LIMIT 10",
                [$user["id"]]
            );
            if (!$sales) {
                send_message($chat_id, "📭 Nenhuma compra encontrada.");
                exit;
            }
            $msg = "📜 <b>Últimas compras</b>\n\n";
            foreach ($sales as $s) {
                $msg .= "📦 {$s['name']}\n💰 R$ " . number_format($s['amount'], 2, ",", ".") . "\n📅 {$s['created_at']}\n\n";
            }
            send_message($chat_id, $msg);
            exit;

        case "🔄 Renovar Plano":
            $sub = db_fetch("SELECT * FROM subscriptions WHERE user_id=? ORDER BY id DESC LIMIT 1", [$user["id"]]);
            if (!$sub) {
                send_message($chat_id, "❌ Nenhuma assinatura encontrada.");
                exit;
            }
            $plan = get_plan($sub["plan_id"]);
            if ($user["balance"] < $plan["price_client"]) {
                send_message($chat_id, "❌ Saldo insuficiente.");
                exit;
            }

            db_begin();
            try {
                remove_balance($from_id, $plan["price_client"], "Renovação de plano ID: " . $plan["id"]);
                activate_subscription($user["id"], $plan["id"]);
                db_exec(
                    "INSERT INTO sales (user_id, plan_id, amount, created_at) VALUES (?,?,?,datetime('now'))",
                    [$user["id"], $plan["id"], $plan["price_client"]]
                );
                db_commit();
                send_message($chat_id, "✅ Plano renovado com sucesso!");
            } catch (Exception $e) {
                db_rollback();
                send_message($chat_id, "❌ Erro na renovação.");
            }
            exit;

        // GESTÃO DE GIFT/COUPONS ADMIN
        case "🎫 Gifts/Cupons":
            if (!has_state($from_id, "ADMIN_LOGGED")) {
                send_message($chat_id, "❌ Acesso negado.");
                exit;
            }
            set_state($from_id, "WAITING_GIFT_VALUE");
            send_message($chat_id, "Digite o valor do gift:");
            exit;
    }
}


// =====================================================
// TRATAMENTO DE ESTADOS DO USUÁRIO
// =====================================================

// PIN ADMINISTRATIVO
if ($state == "WAITING_ADMIN_PIN") {
    // Defina o PIN correto no config.php como ADMIN_PIN
    if (defined("ADMIN_PIN") && $text === ADMIN_PIN) {
        set_state($from_id, "ADMIN_LOGGED");
        send_message($chat_id, "✅ Acesso concedido!", get_admin_keyboard());
    } else {
        send_message($chat_id, "❌ PIN incorreto.");
    }
    exit;
}

// CRIAÇÃO DE PLANO
if ($state == "WAITING_PLAN_NAME") {
    set_state($from_id, "WAITING_PLAN_PRICE_CLIENT", ["name" => $text]);
    send_message($chat_id, "Digite o preço para clientes:");
    exit;
}

if ($state == "WAITING_PLAN_PRICE_CLIENT") {
    $price = floatval(str_replace(",", ".", $text));
    $data_state["price_client"] = $price;
    set_state($from_id, "WAITING_PLAN_PRICE_RESELLER", $data_state);
    send_message($chat_id, "Digite o preço para revendedores:");
    exit;
}

if ($state == "WAITING_PLAN_PRICE_RESELLER") {
    $price = floatval(str_replace(",", ".", $text));
    $data_state["price_reseller"] = $price;
    set_state($from_id, "WAITING_PLAN_DURATION_VALUE", $data_state);
    send_message($chat_id, "Digite o valor da duração (ex: 30):");
    exit;
}

if ($state == "WAITING_PLAN_DURATION_VALUE") {
    $value = intval($text);
    $data_state["duration_value"] = $value;
    set_state($from_id, "WAITING_PLAN_DURATION_UNIT", $data_state);
    send_message($chat_id, "Digite a unidade da duração (ex: days, months):");
    exit;
}

if ($state == "WAITING_PLAN_DURATION_UNIT") {
    $data_state["duration_unit"] = $text;
    create_plan(
        $data_state["name"],
        $data_state["price_client"],
        $data_state["price_reseller"],
        $data_state["duration_value"],
        $data_state["duration_unit"]
    );
    clear_state($from_id);
    send_message($chat_id, "✅ Plano criado com sucesso!");
    exit;
}

// PESQUISA DE USUÁRIO ADMIN
if ($state == "WAITING_SEARCH_USER") {
    $client = db_fetch(
        "SELECT * FROM users WHERE telegram_id=? OR username=?",
        [$text, str_replace("@", "", $text)]
    );
    if (!$client) {
        send_message($chat_id, "❌ Cliente não encontrado.");
        exit;
    }
    $status = $client["is_blocked"] ? "🚫 Bloqueado" : "✅ Ativo";
    send_message(
        $chat_id,
        "👤 <b>Cliente</b>\n\nID: <code>{$client['telegram_id']}</code>\nUsuário: @" . ($client['username'] ?? "sem_usuario") . "\n💰 Saldo: R$ " . number_format($client['balance'], 2, ",", ".") . "\n{$status}",
        ["inline_keyboard" => [
            [["text" => "💰 Adicionar saldo", "callback_data" => "add_balance_" . $client["id"]]],
            [["text" => ($client['is_blocked'] ? "✅ Desbloquear" : "🚫 Bloquear"), "callback_data" => ($client['is_blocked'] ? "unblock_user_" : "block_user_") . $client["id"]]]
        ]]
    );
    exit;
}

// ADIÇÃO DE SALDO ADMIN
if ($state == "WAITING_ADMIN_BALANCE") {
    $valor = floatval(str_replace(",", ".", $text));
    $user_id = $data_state["user_id"];
    add_balance($user_id, $valor, "Adição manual por administrador");
    clear_state($from_id);
    send_message($chat_id, "✅ Saldo atualizado.");
    exit;
}

// CRIAÇÃO DE GIFT ADMIN
if ($state == "WAITING_GIFT_VALUE") {
    $valor = floatval(str_replace(",", ".", $text));
    $codigo = strtoupper(substr(md5(uniqid()), 0, 10));
    db_exec("INSERT INTO gift_codes (code, value, is_used) VALUES (?,?,0)", [$codigo, $valor]);
    clear_state($from_id);
    send_message(
        $chat_id,
        "🎁 Gift criado:\n\n<code>{$codigo}</code>\n💰 Valor: R$ " . number_format($valor, 2, ",", ".")
    );
    exit;
}

// RECEBIMENTO DE MENSAGEM DE BROADCAST
if ($state == "WAITING_BROADCAST") {
    $usuarios = db_fetchAll("SELECT telegram_id FROM users WHERE is_blocked=0");
    $enviados = 0;
    foreach ($usuarios as $u) {
        $resultado = send_message($u["telegram_id"], $text);
        if ($resultado) $enviados++;
        usleep(30000); // Evita limite da API do Telegram
    }
    clear_state($from_id);
    send_message($chat_id, "📢 Broadcast finalizado.\n\n✅ Enviados: {$enviados}");
    exit;
}

// RECEBIMENTO DE CLIENTE REVENDEDOR
if ($state == "WAITING_RESELLER_CLIENT") {
    $client = db_fetch(
        "SELECT * FROM users WHERE telegram_id=? OR username=?",
        [$text, str_replace("@", "", $text)]
    );
    if (!$client) {
        send_message($chat_id, "❌ Cliente não encontrado.");
        exit;
    }
    set_state($from_id, "WAITING_RESELLER_PLAN", ["client_id" => $client["id"]]);
    $plans = db_fetchAll("SELECT * FROM plans WHERE status=1");
    $buttons = [];
    foreach ($plans as $p) {
        $buttons[][] = [
            "text" => $p["name"] . " R$ " . number_format($p['price_reseller'], 2, ",", "."),
            "callback_data" => "sell_plan_" . $p["id"]
        ];
    }
    send_message($chat_id, "Escolha o plano:", ["inline_keyboard" => $buttons]);
    exit;
}

// RECEBIMENTO DE VALOR DE SALDO
if ($state == "WAITING_BALANCE_VALUE") {
    $valor = floatval(str_replace(",", ".", $text));
    if ($valor < 2) {
        send_message($chat_id, "❌ Valor mínimo R$ 2,00");
        exit;
    }

    // Gera cobrança (integre com gateway de pagamento aqui)
    $transaction_id = "BAL_" . time() . "_" . $from_id;
    db_exec(
        "INSERT INTO payments (user_id, amount, transaction_id, status) VALUES (?,?,?,'pending')",
        [$user["id"], $valor, $transaction_id]
    );

    // Exemplo com Pix (adicione o arquivo pix.php ou substitua por outro gateway)
    if (file_exists(__DIR__ . "/pix.php")) {
        require_once __DIR__ . "/pix.php";
        $pix = create_pix_charge($from_id, $valor);
        send_message(
            $chat_id,
            "💠 <b>Pix gerado!</b>\n\n💰 Valor: R$ " . number_format($valor, 2, ",", ".") . "\n\n📋 Copie e cole:\n\n<code>{$pix['pix']}</code>\n\n⏳ Validade: 30 minutos"
        );
    } else {
        send_message(
            $chat_id,
            "💰 <b>Cobrança criada</b>\n\nValor: R$ " . number_format($valor, 2, ",", ".") . "\n\nAguardando pagamento..."
        );
    }
    clear_state($from_id);
    exit;
}

// RECEBIMENTO DE CUPOM
if ($state == "WAITING_COUPON") {
    $coupon = redeem_coupon($from_id, $text);
    if (!$coupon) {
        send_message($chat_id, "❌ Cupom inválido ou já utilizado.");
        exit;
    }
    clear_state($from_id);
    send_message(
        $chat_id,
        "✅ Cupom aplicado!\n\n🎁 Benefício: R$ " . number_format($coupon['value'], 2, ",", ".")
    );
    exit;
}

// RECEBIMENTO DE GIFT
if ($state == "WAITING_GIFT") {
    $gift = db_fetch("SELECT * FROM gift_codes WHERE code=? AND is_used=0", [$text]);
    if (!$gift) {
        send_message($chat_id, "❌ Código inválido.");
        exit;
    }
    add_balance($from_id, $gift["value"], "Gift resgatado: {$gift['code']}");
    db_exec("UPDATE gift_codes SET is_used=1, redeemed_at=CURRENT_TIMESTAMP WHERE id=?", [$gift["id"]]);
    clear_state($from_id);
    send_message(
        $chat_id,
        "✅ Gift resgatado!\n💰 Valor: R$ " . number_format($gift['value'], 2, ",", ".")
    );
    exit;
}

// AGUARDANDO PAGAMENTO
if ($state == "WAITING_PAYMENT") {
    $info = $data_state;
    if (isset($info["transaction_id"])) {
        $checkout = create_payment_checkout($info["transaction_id"]);
        if ($checkout) {
            send_message(
                $chat_id,
                "💳 <b>Pagamento gerado</b>\n\n📌 Código:\n<code>{$checkout['code']}</code>\n\n⏳ Expira em:\n{$checkout['expires']}\n\nApós o pagamento aguarde a confirmação."
            );
            clear_state($from_id);
        }
    }
    exit;
}


// =====================================================
// TRATAMENTO DE CALLBACKS
// =====================================================
if (isset($callback)) {
    // APROVAR REVENDEDOR
    if (strpos($data, "approve_reseller_") === 0) {
        $id = intval(str_replace("approve_reseller_", "", $data));
        db_exec("UPDATE resellers SET approved=1 WHERE telegram_id=?", [$id]);
        send_message($chat_id, "✅ Revendedor aprovado.");
        send_message($id, "🎉 Sua conta de revendedor foi aprovada!");
        exit;
    }

    // RECUSAR REVENDEDOR
    if (strpos($data, "reject_reseller_") === 0) {
        $id = intval(str_replace("reject_reseller_", "", $data));
        db_exec("DELETE FROM resellers WHERE telegram_id=?", [$id]);
        send_message($chat_id, "❌ Solicitação recusada.");
        send_message($id, "❌ Sua solicitação de revendedor foi recusada.");
        exit;
    }

    // BLOQUEAR USUÁRIO
    if (strpos($data, "block_user_") === 0) {
        $id = intval(str_replace("block_user_", "", $data));
        db_exec("UPDATE users SET is_blocked=1 WHERE id=?", [$id]);
        send_message($chat_id, "🚫 Usuário bloqueado.");
        exit;
    }

    // DESBLOQUEAR USUÁRIO
    if (strpos($data, "unblock_user_") === 0)
    // DESBLOQUEAR USUÁRIO
    if (strpos($data, "unblock_user_") === 0) {
        $id = intval(str_replace("unblock_user_", "", $data));
        db_exec("UPDATE users SET is_blocked=0 WHERE id=?", [$id]);
        send_message($chat_id, "✅ Usuário desbloqueado.");
        exit;
    }

    // ADICIONAR SALDO AO USUÁRIO
    if (strpos($data, "add_balance_") === 0) {
        $id = intval(str_replace("add_balance_", "", $data));
        set_state($from_id, "WAITING_ADMIN_BALANCE", ["user_id" => $id]);
        send_message($chat_id, "💰 Digite o valor para adicionar:");
        exit;
    }

    // COMPRA DE PLANO
    if (strpos($data, "buy_plan_") === 0) {
        $plan_id = intval(str_replace("buy_plan_", "", $data));
        $plan = get_plan($plan_id);
        
        if (!$plan) {
            send_message($chat_id, "❌ Plano não encontrado.");
            exit;
        }

        $valor = $plan["price_client"];
        if (get_balance($from_id) < $valor) {
            send_message(
                $chat_id,
                "❌ Saldo insuficiente.\n\n💰 Seu saldo: R$ " . number_format(get_balance($from_id), 2, ",", ".") . "\n\n💎 Adicione saldo para continuar."
            );
            exit;
        }

        db_begin();
        try {
            remove_balance($from_id, $valor, "Compra de plano: " . $plan["name"]);
            $expire = activate_subscription($user["id"], $plan_id);
            
            db_exec(
                "INSERT INTO sales (user_id, plan_id, amount, created_at) VALUES (?,?,?,datetime('now'))",
                [$user["id"], $plan_id, $valor]
            );

            // Aplica cashback e bônus de indicação
            give_cashback($from_id, $valor);
            give_referral_bonus($from_id, $valor);

            db_commit();
            send_plan_access($from_id, $plan_id, $plan["name"], $expire);
            send_message(
                $chat_id,
                "✅ Compra realizada com sucesso!\n\n📦 Plano: {$plan['name']}\n💰 Valor: R$ " . number_format($valor, 2, ",", ".")
            );
        } catch (Exception $e) {
            db_rollback();
            bot_log("purchase_error.log", $e->getMessage());
            send_message($chat_id, "❌ Erro ao processar compra.");
        }
        exit;
    }

    // VENDA DE PLANO POR REVENDEDOR
    if (strpos($data, "sell_plan_") === 0) {
        $plan_id = intval(str_replace("sell_plan_", "", $data));
        $s = get_state($from_id);
        
        if (!$s) {
            send_message($chat_id, "Sessão expirada.");
            exit;
        }

        $info = $s["data"];
        $plan = get_plan($plan_id);
        $res = db_fetch("SELECT * FROM resellers WHERE telegram_id=? AND approved=1", [$from_id]);

        if (!$plan || !$res) {
            send_message($chat_id, "❌ Venda inválida.");
            exit;
        }

        if ($res["balance"] < $plan["price_reseller"]) {
            send_message($chat_id, "❌ Saldo insuficiente.");
            exit;
        }

        db_begin();
        try {
            db_exec("UPDATE resellers SET balance=balance-? WHERE telegram_id=?", [$plan["price_reseller"], $from_id]);
            $expire = activate_subscription($info["client_id"], $plan_id);
            
            db_exec(
                "INSERT INTO reseller_sales (reseller_id, client_id, plan_id, reseller_price, client_price, profit) VALUES (?,?,?,?,?,?)",
                [
                    $from_id,
                    $info["client_id"],
                    $plan_id,
                    $plan["price_reseller"],
                    $plan["price_client"],
                    $plan["price_client"] - $plan["price_reseller"]
                ]
            );

            db_commit();
            send_plan_access($info["client_id"], $plan_id, $plan["name"], $expire);
            clear_state($from_id);
            send_message($chat_id, "✅ Venda concluída.");
        } catch (Exception $e) {
            db_rollback();
            send_message($chat_id, "❌ Erro na venda.");
        }
        exit;
    }

    // EDITAR NOME DO PLANO
    if (strpos($data, "edit_name_") === 0) {
        $plan_id = intval(str_replace("edit_name_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_NAME", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo nome do plano:");
        exit;
    }

    // EDITAR PREÇOS DO PLANO
    if (strpos($data, "edit_price_") === 0) {
        $plan_id = intval(str_replace("edit_price_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_PRICE_CLIENT", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo preço para clientes:");
        exit;
    }

    // EDITAR DURAÇÃO DO PLANO
    if (strpos($data, "edit_time_") === 0) {
        $plan_id = intval(str_replace("edit_time_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_DURATION_VALUE", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo valor da duração:");
        exit;
    }

    // ATIVAR/DESATIVAR PLANO
    if (strpos($data, "toggle_plan_") === 0) {
        $plan_id = intval(str_replace("toggle_plan_", "", $data));
        toggle_plan($plan_id);
        send_message($chat_id, "✅ Status do plano atualizado.");
        exit;
    }

    // EXCLUIR PLANO
    if (strpos($data, "delete_plan_") === 0) {
        $plan_id = intval(str_replace("delete_plan_", "", $data));
        delete_plan($plan_id);
        send_message($chat_id, "🗑 Plano excluído.");
        exit;
    }

    // VINCULAR GRUPO A PLANO
    if (strpos($data, "link_group_") === 0) {
        $group_id = str_replace("link_group_", "", $data);
        set_state($from_id, "WAITING_GROUP_PLAN", ["group_id" => $group_id]);
        
        $plans = db_fetchAll("SELECT * FROM plans WHERE status=1");
        $buttons = [];
        foreach ($plans as $p) {
            $buttons[][] = ["text" => $p["name"], "callback_data" => "attach_plan_" . $p["id"]];
        }

        send_message($chat_id, "Escolha o plano para vincular:", ["inline_keyboard" => $buttons]);
        exit;
    }

    // CONFIRMAR VINCULAÇÃO DE GRUPO A PLANO
    if (strpos($data, "attach_plan_") === 0) {
        $plan_id = intval(str_replace("attach_plan_", "", $data));
        $s = get_state($from_id);
        
        if (!$s) {
            send_message($chat_id, "Sessão expirada.");
            exit;
        }

        $info = $s["data"];
        db_exec("INSERT OR IGNORE INTO plan_groups (plan_id, group_id) VALUES (?,?)", [$plan_id, $info["group_id"]]);
        clear_state($from_id);
        send_message($chat_id, "✅ Grupo vinculado ao plano.");
        exit;
    }
}


// =====================================================
// TRATAMENTO DE EDIÇÃO DE PLANOS
// =====================================================
if ($state == "WAITING_PLAN_EDIT_NAME") {
    $plan_id = $data_state["plan_id"];
    db_exec("UPDATE plans SET name=? WHERE id=?", [$text, $plan_id]);
    clear_state($from_id);
    send_message($chat_id, "✅ Nome do plano atualizado.");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_PRICE_CLIENT") {
    $price = floatval(str_replace(",", ".", $text));
    $plan_id = $data_state["plan_id"];
    set_state($from_id, "WAITING_PLAN_EDIT_PRICE_RESELLER", ["plan_id" => $plan_id]);
    send_message($chat_id, "Digite o novo preço para revendedores:");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_PRICE_RESELLER") {
    $price = floatval(str_replace(",", ".", $text));
    $plan_id = $data_state["plan_id"];
    db_exec(
        "UPDATE plans SET price_client=?, price_reseller=? WHERE id=?",
        [$data_state["price_client"] ?? 0, $price, $plan_id]
    );
    clear_state($from_id);
    send_message($chat_id, "✅ Preços do plano atualizados.");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_DURATION_VALUE") {
    $value = intval($text);
    $plan_id = $data_state["plan_id"];
    set_state($from_id, "WAITING_PLAN_EDIT_DURATION_UNIT", ["plan_id" => $plan_id, "duration_value" => $value]);
    send_message($chat_id, "Digite a nova unidade da duração (ex: days, months):");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_DURATION_UNIT") {
    $unit = $text;
    $plan_id = $data_state["plan_id"];
    db_exec(
        "UPDATE plans SET duration_value=?, duration_unit=? WHERE id=?",
        [$data_state["duration_value"], $unit, $plan_id]
    );
    clear_state($from_id);
    send_message($chat_id, "✅ Duração do plano atualizada.");
    exit;
}


// =====================================================
// ROTINAS DE MANUTENÇÃO FINAL
// =====================================================

// Limpa estados expirados
cleanup_states();

// Verifica assinaturas vencidas
check_expired_subscriptions();

// Remove membros vencidos dos grupos
remove_expired_members();

// Envia avisos de vencimento
send_expiration_alerts();

// Envia notificações pendentes
send_pending_notifications($from_id);

// Registra acesso no log
bot_log("bot_access.log", [
    "telegram_id" => $from_id,
    "action" => isset($text) ? $text : "Callback: " . $data,
    "timestamp" => date("Y-m-d H:i:s")
]);

?>

    // DESBLOQUEAR USUÁRIO
    if (strpos($data, "unblock_user_") === 0) {
        $id = intval(str_replace("unblock_user_", "", $data));
        db_exec("UPDATE users SET is_blocked=0 WHERE id=?", [$id]);
        send_message($chat_id, "✅ Usuário desbloqueado.");
        exit;
    }

    // ADICIONAR SALDO AO USUÁRIO
    if (strpos($data, "add_balance_") === 0) {
        $id = intval(str_replace("add_balance_", "", $data));
        set_state($from_id, "WAITING_ADMIN_BALANCE", ["user_id" => $id]);
        send_message($chat_id, "💰 Digite o valor para adicionar:");
        exit;
    }

    // COMPRA DE PLANO
    if (strpos($data, "buy_plan_") === 0) {
        $plan_id = intval(str_replace("buy_plan_", "", $data));
        $plan = get_plan($plan_id);
        
        if (!$plan) {
            send_message($chat_id, "❌ Plano não encontrado.");
            exit;
        }

        $valor = $plan["price_client"];
        if (get_balance($from_id) < $valor) {
            send_message(
                $chat_id,
                "❌ Saldo insuficiente.\n\n💰 Seu saldo: R$ " . number_format(get_balance($from_id), 2, ",", ".") . "\n\n💎 Adicione saldo para continuar."
            );
            exit;
        }

        db_begin();
        try {
            remove_balance($from_id, $valor, "Compra de plano: " . $plan["name"]);
            $expire = activate_subscription($user["id"], $plan_id);
            
            db_exec(
                "INSERT INTO sales (user_id, plan_id, amount, created_at) VALUES (?,?,?,datetime('now'))",
                [$user["id"], $plan_id, $valor]
            );

            // Aplica cashback e bônus de indicação
            give_cashback($from_id, $valor);
            give_referral_bonus($from_id, $valor);

            db_commit();
            send_plan_access($from_id, $plan_id, $plan["name"], $expire);
            send_message(
                $chat_id,
                "✅ Compra realizada com sucesso!\n\n📦 Plano: {$plan['name']}\n💰 Valor: R$ " . number_format($valor, 2, ",", ".")
            );
        } catch (Exception $e) {
            db_rollback();
            bot_log("purchase_error.log", $e->getMessage());
            send_message($chat_id, "❌ Erro ao processar compra.");
        }
        exit;
    }

    // VENDA DE PLANO POR REVENDEDOR
    if (strpos($data, "sell_plan_") === 0) {
        $plan_id = intval(str_replace("sell_plan_", "", $data));
        $s = get_state($from_id);
        
        if (!$s) {
            send_message($chat_id, "Sessão expirada.");
            exit;
        }

        $info = $s["data"];
        $plan = get_plan($plan_id);
        $res = db_fetch("SELECT * FROM resellers WHERE telegram_id=? AND approved=1", [$from_id]);

        if (!$plan || !$res) {
            send_message($chat_id, "❌ Venda inválida.");
            exit;
        }

        if ($res["balance"] < $plan["price_reseller"]) {
            send_message($chat_id, "❌ Saldo insuficiente.");
            exit;
        }

        db_begin();
        try {
            db_exec("UPDATE resellers SET balance=balance-? WHERE telegram_id=?", [$plan["price_reseller"], $from_id]);
            $expire = activate_subscription($info["client_id"], $plan_id);
            
            db_exec(
                "INSERT INTO reseller_sales (reseller_id, client_id, plan_id, reseller_price, client_price, profit) VALUES (?,?,?,?,?,?)",
                [
                    $from_id,
                    $info["client_id"],
                    $plan_id,
                    $plan["price_reseller"],
                    $plan["price_client"],
                    $plan["price_client"] - $plan["price_reseller"]
                ]
            );

            db_commit();
            send_plan_access($info["client_id"], $plan_id, $plan["name"], $expire);
            clear_state($from_id);
            send_message($chat_id, "✅ Venda concluída.");
        } catch (Exception $e) {
            db_rollback();
            send_message($chat_id, "❌ Erro na venda.");
        }
        exit;
    }

    // EDITAR NOME DO PLANO
    if (strpos($data, "edit_name_") === 0) {
        $plan_id = intval(str_replace("edit_name_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_NAME", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo nome do plano:");
        exit;
    }

    // EDITAR PREÇOS DO PLANO
    if (strpos($data, "edit_price_") === 0) {
        $plan_id = intval(str_replace("edit_price_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_PRICE_CLIENT", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo preço para clientes:");
        exit;
    }

    // EDITAR DURAÇÃO DO PLANO
    if (strpos($data, "edit_time_") === 0) {
        $plan_id = intval(str_replace("edit_time_", "", $data));
        set_state($from_id, "WAITING_PLAN_EDIT_DURATION_VALUE", ["plan_id" => $plan_id]);
        send_message($chat_id, "Digite o novo valor da duração:");
        exit;
    }

    // ATIVAR/DESATIVAR PLANO
    if (strpos($data, "toggle_plan_") === 0) {
        $plan_id = intval(str_replace("toggle_plan_", "", $data));
        toggle_plan($plan_id);
        send_message($chat_id, "✅ Status do plano atualizado.");
        exit;
    }

    // EXCLUIR PLANO
    if (strpos($data, "delete_plan_") === 0) {
        $plan_id = intval(str_replace("delete_plan_", "", $data));
        delete_plan($plan_id);
        send_message($chat_id, "🗑 Plano excluído.");
        exit;
    }

    // VINCULAR GRUPO A PLANO
    if (strpos($data, "link_group_") === 0) {
        $group_id = str_replace("link_group_", "", $data);
        set_state($from_id, "WAITING_GROUP_PLAN", ["group_id" => $group_id]);
        
        $plans = db_fetchAll("SELECT * FROM plans WHERE status=1");
        $buttons = [];
        foreach ($plans as $p) {
            $buttons[][] = ["text" => $p["name"], "callback_data" => "attach_plan_" . $p["id"]];
        }

        send_message($chat_id, "Escolha o plano para vincular:", ["inline_keyboard" => $buttons]);
        exit;
    }

    // CONFIRMAR VINCULAÇÃO DE GRUPO A PLANO
    if (strpos($data, "attach_plan_") === 0) {
        $plan_id = intval(str_replace("attach_plan_", "", $data));
        $s = get_state($from_id);
        
        if (!$s) {
            send_message($chat_id, "Sessão expirada.");
            exit;
        }

        $info = $s["data"];
        db_exec("INSERT OR IGNORE INTO plan_groups (plan_id, group_id) VALUES (?,?)", [$plan_id, $info["group_id"]]);
        clear_state($from_id);
        send_message($chat_id, "✅ Grupo vinculado ao plano.");
        exit;
    }
}


// =====================================================
// TRATAMENTO DE EDIÇÃO DE PLANOS
// =====================================================
if ($state == "WAITING_PLAN_EDIT_NAME") {
    $plan_id = $data_state["plan_id"];
    db_exec("UPDATE plans SET name=? WHERE id=?", [$text, $plan_id]);
    clear_state($from_id);
    send_message($chat_id, "✅ Nome do plano atualizado.");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_PRICE_CLIENT") {
    $price = floatval(str_replace(",", ".", $text));
    $plan_id = $data_state["plan_id"];
    set_state($from_id, "WAITING_PLAN_EDIT_PRICE_RESELLER", ["plan_id" => $plan_id]);
    send_message($chat_id, "Digite o novo preço para revendedores:");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_PRICE_RESELLER") {
    $price = floatval(str_replace(",", ".", $text));
    $plan_id = $data_state["plan_id"];
    db_exec(
        "UPDATE plans SET price_client=?, price_reseller=? WHERE id=?",
        [$data_state["price_client"] ?? 0, $price, $plan_id]
    );
    clear_state($from_id);
    send_message($chat_id, "✅ Preços do plano atualizados.");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_DURATION_VALUE") {
    $value = intval($text);
    $plan_id = $data_state["plan_id"];
    set_state($from_id, "WAITING_PLAN_EDIT_DURATION_UNIT", ["plan_id" => $plan_id, "duration_value" => $value]);
    send_message($chat_id, "Digite a nova unidade da duração (ex: days, months):");
    exit;
}

if ($state == "WAITING_PLAN_EDIT_DURATION_UNIT") {
    $unit = $text;
    $plan_id = $data_state["plan_id"];
    db_exec(
        "UPDATE plans SET duration_value=?, duration_unit=? WHERE id=?",
        [$data_state["duration_value"], $unit, $plan_id]
    );
    clear_state($from_id);
    send_message($chat_id, "✅ Duração do plano atualizada.");
    exit;
}


// =====================================================
// ROTINAS DE MANUTENÇÃO FINAL
// =====================================================

// Limpa estados expirados
cleanup_states();

// Verifica assinaturas vencidas
check_expired_subscriptions();

// Remove membros vencidos dos grupos
remove_expired_members();

// Envia avisos de vencimento
send_expiration_alerts();

// Envia notificações pendentes
send_pending_notifications($from_id);

// Registra acesso no log
bot_log("bot_access.log", [
    "telegram_id" => $from_id,
    "action" => isset($text) ? $text : "Callback: " . $data,
    "timestamp" => date("Y-m-d H:i:s")
]);

?>


