//! Демонстрация получения списка участников группового чата.
//!
//! Запуск:
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! export CHAT_ID=-1234567890
//! cargo run --example get_chat_members_demo
//! ```
//!
//! Необязательные переменные:
//! - MEMBERS_COUNT — количество участников на странице (1-100, по умолчанию 20)
//! - USER_IDS — список ID пользователей через запятую для выборочного получения
//!
//! Пример с USER_IDS:
//! export USER_IDS="111,222,333"
//! cargo run --example get-chat-members-demo

use maxbot::MaxClient;
use std::env;
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let token = env::var("MAXBOT_TOKEN").expect("Missing MAXBOT_TOKEN");
    let chat_id: i64 = env::var("CHAT_ID")
        .expect("Missing CHAT_ID")
        .parse()?;

    if let Ok(proxy_url) = env::var("MAXBOT_PROXY") {
        maxbot::set_global_base_url(proxy_url);
    }

    let client = MaxClient::new(token);

    // Проверка, нужно ли получить конкретных участников по user_ids
    if let Ok(user_ids_str) = env::var("USER_IDS") {
        let user_ids: Vec<i64> = user_ids_str
            .split(',')
            .filter_map(|s| s.trim().parse().ok())
            .collect();
        if !user_ids.is_empty() {
            println!("🔍 Получение участников по списку ID: {:?}", user_ids);
            match client.get_chat_members_by_ids(chat_id, user_ids).await {
                Ok(members) => {
                    if members.is_empty() {
                        println!("   Ни один из указанных пользователей не является участником чата.");
                    } else {
                        println!("   Найдено участников: {}\n", members.len());
                        for member in members {
                            print_member(&member);
                        }
                    }
                }
                Err(e) => eprintln!("❌ Ошибка при получении участников: {}", e),
            }
            return Ok(());
        }
    }

    // Иначе — постраничный вывод всех участников
    let count: u32 = env::var("MEMBERS_COUNT")
        .ok()
        .and_then(|s| s.parse().ok())
        .unwrap_or(20);
    println!("📋 Получение списка участников чата {} ({} на странице)...", chat_id, count);

    let mut marker = None;
    let mut page = 1;
    let mut total_members = 0;

    loop {
        println!("\n--- Страница {} ---", page);
        match client.get_chat_members(chat_id, marker, Some(count)).await {
            Ok((members, next_marker)) => {
                if members.is_empty() {
                    println!("Нет участников на этой странице.");
                    break;
                }
                println!("Участников на странице: {}\n", members.len());
                for member in &members {
                    print_member(member);
                }
                total_members += members.len();

                if let Some(next) = next_marker {
                    marker = Some(next);
                    page += 1;
                    // Небольшая пауза, чтобы не превысить rate limit
                    tokio::time::sleep(Duration::from_millis(500)).await;
                } else {
                    println!("\n✅ Достигнут конец списка.");
                    break;
                }
            }
            Err(e) => {
                eprintln!("❌ Ошибка при получении страницы {}: {}", page, e);
                break;
            }
        }
    }

    println!("\n📊 Всего получено участников: {}", total_members);
    Ok(())
}

/// Форматированный вывод информации об участнике чата.
fn print_member(member: &maxbot::ChatMember) {
    println!(
        "  {} {} (ID: {}){}",
        member.user.first_name,
        member.user.last_name.as_deref().unwrap_or(""),
        member.user.user_id,
        if member.user.is_bot { " [бот]" } else { "" }
    );
    if let Some(username) = &member.user.username {
        println!("    Username: @{}", username);
    }
    println!("    Владелец: {}", member.is_owner);
    println!("    Администратор: {}", member.is_admin);
    if !member.permissions.is_empty() {
        println!("    Права: {}", member.permissions.join(", "));
    }
    if let Some(alias) = &member.alias {
        println!("    Псевдоним: {}", alias);
    }
    println!("    Присоединился: {}", member.join_time_formatted());
    println!("    Последний доступ: {}", member.last_access_time_formatted());
    if let Some(avatar) = &member.avatar_url {
        println!("    Аватар: {}", avatar);
    }
    println!();
}
