use easy_nostr::EasyNostr;
use nostr_sdk::prelude::{Keys, ToBech32};
use serde::Serialize; // Import für die Schlüssel-Generierung

// Diese Struktur ist für den Transport zum Frontend (JSON)
#[derive(Serialize)]
pub struct LocalPost {
    pub content: String,
    pub author: String,
    pub created_at: u64,
}

#[tauri::command]
pub async fn fetch_nostr_posts(hashtags: Vec<String>) -> Result<Vec<LocalPost>, String> {
    println!("Fetching Nostr posts for hashtags: {:?}", hashtags);
    // 1. Temporären Einweg-Schlüssel generieren
    let random_keys = Keys::generate();
    let temp_nsec = random_keys
        .secret_key()
        .to_bech32()
        .map_err(|e| format!("Fehler beim Generieren des Keys: {}", e))?;

    // 2. Verbindung mit dem temporären Key aufbauen
    let easy = EasyNostr::new(&temp_nsec)
        .await
        .map_err(|e| e.to_string())?;

    // 3. Relays hinzufügen
    easy.add_relays(vec![
        "wss://relay.damus.io",
        "wss://nos.lol",
        "wss://relay.snort.social",
    ])
    .await
    .map_err(|e| e.to_string())?;

    // 4. Posts von der Library holen - Entweder per Hashtag oder Random
    let raw_posts = if hashtags.is_empty() {
        easy.get_random_posts().await.map_err(|e| e.to_string())?
    } else {
        easy.get_posts_by_hashtags(hashtags)
            .await
            .map_err(|e| e.to_string())?
    };

    // 5. Mappen: Library-Typ -> Unser serialisierbarer Typ
    let mapped_posts = raw_posts
        .into_iter()
        .map(|p| LocalPost {
            content: p.content,
            author: p.author.to_string(),
            created_at: p.created_at.as_secs(),
        })
        .collect();

    Ok(mapped_posts)
}
