//! Демонстрация назначения администраторов в групповом чате.
//!
//! Запуск:
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! export CHAT_ID=-1234567890
//! # Необязательно: список user_id через запятую
//! export USER_IDS="111,222"
//! cargo run --example add_chat_admin_demo
//! ```
//!
//! Если переменная USER_IDS не задана, пример запросит ввод одного user_id в интерактивном режиме.

use maxbot::{ChatAdminRequest, MaxClient};
use std::env;
use std::io::{self, Write};

#[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);

    // 1. Получаем текущий список администраторов
    println!("🔍 Текущие администраторы чата {}:", chat_id);
    match client.get_chat_admins(chat_id).await {
        Ok(admins) => {
            if admins.is_empty() {
                println!("   (нет администраторов или нет прав на просмотр)");
            } else {
                for admin in &admins {
                    println!(
                        "   - {} {} (ID: {}){}",
                        admin.user.first_name,
                        admin.user.last_name.as_deref().unwrap_or(""),
                        admin.user.user_id,
                        if admin.is_owner { " [владелец]" } else { "" }
                    );
                    if let Some(alias) = &admin.alias {
                        println!("     Псевдоним: {}", alias);
                    }
                }
            }
        }
        Err(e) => eprintln!("❌ Не удалось получить список администраторов: {}", e),
    }

    // 2. Определяем, каких пользователей добавлять
    let user_ids: Vec<i64> = if let Ok(ids_str) = env::var("USER_IDS") {
        ids_str
            .split(',')
            .filter_map(|s| s.trim().parse().ok())
            .collect()
    } else {
        print!("Введите user_id пользователя для назначения администратором: ");
        io::stdout().flush()?;
        let mut input = String::new();
        io::stdin().read_line(&mut input)?;
        if let Ok(id) = input.trim().parse() {
            vec![id]
        } else {
            println!("❌ Некорректный ввод, завершаем.");
            return Ok(());
        }
    };

    if user_ids.is_empty() {
        println!("❌ Нет user_id для добавления.");
        return Ok(());
    }

    // 3. Добавляем первого пользователя как администратора (демо с alias)
    let first_id = user_ids[0];
    println!("\n📌 Добавляем пользователя {} как администратора с псевдонимом 'Демо-админ'...", first_id);
    let permissions = vec![
        "read_all_messages".to_string(),
        "write".to_string(),
        "pin_message".to_string(),
    ];
    match client
        .add_chat_admin(chat_id, first_id, permissions.clone(), Some("Демо-админ".to_string()))
        .await
    {
        Ok(()) => println!("✅ Пользователь {} назначен администратором.", first_id),
        Err(e) => eprintln!("❌ Ошибка при назначении: {}", e),
    }

    // 4. Если есть ещё пользователи, добавляем их массово
    if user_ids.len() > 1 {
        println!("\n📌 Добавляем остальных пользователей массовым запросом...");
        let mut admins_to_add = Vec::new();
        for &uid in &user_ids[1..] {
            admins_to_add.push(ChatAdminRequest {
                user_id: uid,
                permissions: vec!["read_all_messages".to_string(), "write".to_string()],
                alias: None,
            });
        }
        match client.add_chat_admins(chat_id, admins_to_add).await {
            Ok(()) => println!("✅ Все указанные пользователи добавлены как администраторы."),
            Err(e) => eprintln!("❌ Ошибка при массовом добавлении: {}", e),
        }
    }

    // 5. Повторно выводим список администраторов для проверки
    println!("\n🔍 Обновлённый список администраторов:");
    match client.get_chat_admins(chat_id).await {
        Ok(admins) => {
            for admin in admins {
                println!(
                    "   - {} {} (ID: {}){}",
                    admin.user.first_name,
                    admin.user.last_name.as_deref().unwrap_or(""),
                    admin.user.user_id,
                    if admin.is_owner { " [владелец]" } else { "" }
                );
                if let Some(alias) = &admin.alias {
                    println!("     Псевдоним: {}", alias);
                }
                if !admin.permissions.is_empty() {
                    println!("     Права: {:?}", admin.permissions);
                }
            }
        }
        Err(e) => eprintln!("❌ Не удалось получить обновлённый список: {}", e),
    }

    Ok(())
}
