//! Демонстрация редактирования информации о группе.
//!
//! # Запуск
//! ```bash
//! export MAXBOT_TOKEN="ваш_токен"
//! export CHAT_ID=-1234567890
//! cargo run --example update-chat-demo
//! ```

use maxbot::{MaxClient, SendMessageParamsBuilder, UpdateChatInfo};
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 = env::var("CHAT_ID")
        .expect("Missing CHAT_ID")
        .parse::<i64>()?;

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

    let client = MaxClient::new(token);

    // 1. Получаем текущую информацию о чате
    let chat_before = client.get_chat(chat_id).await?;
    let original_title = chat_before.title.clone();
    println!("📋 Чат до изменений:");
    println!("  Название: {}", original_title.as_deref().unwrap_or("без названия"));
    println!("  Иконка: {:?}", chat_before.icon.as_ref().map(|i| &i.url));
    println!("  Закреплённое сообщение: {:?}", chat_before.pinned_message.is_some());

    // 2. Отправляем тестовое сообщение, которое позже закрепим
    let builder = SendMessageParamsBuilder::new()
        .text("Это сообщение будет закреплено 📌")
        .chat_id(chat_id);
    let mids = client.send_message_builder(builder).await?;
    let pin_mid = mids.first().expect("Не получен MID сообщения");
    println!("📨 Отправлено сообщение для закрепления, MID = {}", pin_mid);

    // Небольшая пауза, чтобы сообщение точно обработалось
    tokio::time::sleep(Duration::from_secs(1)).await;

    // 3. Формируем параметры изменения чата
    let update_info = UpdateChatInfo {
        title: Some("Новое название чата (демо)".to_string()),
        // Иконка по URL – публичная картинка с https
        icon_url: Some("https://cdn-icons-png.flaticon.com/256/185/185718.png".to_string()),
        // Закрепляем сообщение
        pin: Some(pin_mid.clone()),
        // Уведомления отключаем (не будем беспокоить участников)
        notify: Some(false),
        ..Default::default()
    };

    // 4. Выполняем запрос PATCH
    println!("🔄 Применяем изменения...");
    let chat_after = client.update_chat(chat_id, update_info).await?;
    println!("✅ Чат обновлён успешно!");

    // 5. Проверяем результат
    println!("\n📋 Чат после изменений:");
    println!("  Название: {}", chat_after.title.as_deref().unwrap_or("без названия"));
    println!("  Иконка: {:?}", chat_after.icon.as_ref().map(|i| &i.url));
    println!("  Закреплённое сообщение: {}", chat_after.pinned_message.is_some());

    // 4. Возвращаем чат в исходное состояние
    tokio::time::sleep(Duration::from_secs(10)).await;
    println!("\n🔄 Возвращаем исходное название и открепляем сообщение...");

    // Открепляем сообщение отдельным методом
    client.unpin_message(chat_id).await?;
    println!("  Сообщение откреплено.");

    // Возвращаем исходное название (иконку не трогаем для простоты)
    if let Some(orig_title) = original_title {
        let revert_info = UpdateChatInfo {
            title: Some(orig_title),
            notify: Some(false),
            ..Default::default()
        };
        client.update_chat(chat_id, revert_info).await?;
        println!("  Название возвращено.");
    }

    let chat_final = client.get_chat(chat_id).await?;
    println!("\n📋 Финальное состояние чата:");
    println!("  Название: {}", chat_final.title.as_deref().unwrap_or("без названия"));
    println!("  Закреплённое сообщение: {}", chat_final.pinned_message.is_some());

    Ok(())
}
