//! Populates the installed app's database using the app's own code paths, so
//! the UI can be verified against real data without driving the file dialog.
//! Run with: cargo test --test seed_real_db -- --ignored --nocapture

use flighttube_lib::{db::Db, feed, models::FeedFilter, thumbs};
use std::path::PathBuf;

fn app_data() -> PathBuf {
    PathBuf::from(std::env::var("HOME").unwrap())
        .join("Library/Application Support/com.vincent.flighttube")
}

#[tokio::test]
#[ignore]
async fn seed() {
    let dir = app_data();
    let mut db = Db::open(&dir.join("flighttube.db")).expect("open real db");

    let channels = db.channel_ids().unwrap();
    println!("channels in db: {}", channels.len());
    assert!(!channels.is_empty(), "seed channels first");

    let http = reqwest::Client::builder()
        .user_agent("FlightTube/0.1 (+desktop)")
        .timeout(std::time::Duration::from_secs(20))
        .build()
        .unwrap();

    let mut total = 0;
    for cid in &channels {
        if let Ok(v) = feed::fetch_channel(&http, cid).await {
            total += v.len();
            db.upsert_videos(&v).unwrap();
        }
    }
    println!("videos upserted: {total}");

    // Cache thumbnails so the feed renders with no network.
    let pending = db.videos_missing_thumbs(400).unwrap();
    println!("thumbnails to cache: {}", pending.len());
    let tdir = thumbs::cache_dir(&dir);
    let mut ok = 0;
    for (id, url) in pending {
        if let Ok(p) = thumbs::cache_one(&http, &id, &url, &tdir).await {
            db.set_thumb_path(&id, &p.to_string_lossy()).unwrap();
            ok += 1;
        }
    }
    println!("thumbnails cached: {ok}");

    let feed_rows = db.list_feed(&FeedFilter::default()).unwrap();
    println!("feed rows now: {}", feed_rows.len());
    for i in feed_rows.iter().take(3) {
        println!("  [{}] {}", i.channel_title, i.title);
    }
}
