use source_ss::define::*;
use source_ss::mng;
use source_ss::relay::SourceRelayBuilder;

#[tokio::test]
async fn test_get_relays() {
    let (event_tx, _) = tokio::sync::mpsc::unbounded_channel();

    let config = SSConfig::default();
    let mng = mng::run(event_tx, &config).unwrap();
    let ctrl = mng.ctrl();

    // Initially should be empty
    let relays = ctrl.get_relays(()).await.unwrap();
    assert!(relays.is_empty(), "relays should be empty initially");

    // Add a relay source
    let relay = SourceRelayBuilder::default()
        .source_id("source_1")
        .relay_id("relay_1")
        .scheme(SSScheme::Es)
        .relay_ip("127.0.0.1")
        .build()
        .unwrap();
    ctrl.add_relay_source(relay).await.unwrap();

    // Now should have one relay
    let relays = ctrl.get_relays(()).await.unwrap();
    assert_eq!(relays.len(), 1);
    assert!(relays.contains_key("relay_1"));

    // Add another relay source
    let relay = SourceRelayBuilder::default()
        .source_id("source_2")
        .relay_id("relay_2")
        .scheme(SSScheme::Es)
        .relay_ip("127.0.0.1")
        .build()
        .unwrap();
    ctrl.add_relay_source(relay).await.unwrap();

    let relays = ctrl.get_relays(()).await.unwrap();
    assert_eq!(relays.len(), 2);
    assert!(relays.contains_key("relay_1"));
    assert!(relays.contains_key("relay_2"));

    // Subscribe with consum=true, relay should be removed
    let sub_args = SubscribeArgsBuilder::default()
        .relay_id("relay_1")
        .consum(true)
        .build()
        .unwrap();
    let _subject = ctrl.subscribe(sub_args).await.unwrap();

    // After consum, relay_1 should be gone
    let relays = ctrl.get_relays(()).await.unwrap();
    assert_eq!(relays.len(), 1);
    assert!(!relays.contains_key("relay_1"));
    assert!(relays.contains_key("relay_2"));

    // Consume the remaining relay
    let sub_args = SubscribeArgsBuilder::default()
        .relay_id("relay_2")
        .consum(true)
        .build()
        .unwrap();
    let _subject = ctrl.subscribe(sub_args).await.unwrap();

    // All relays consumed, should be empty
    let relays = ctrl.get_relays(()).await.unwrap();
    assert!(relays.is_empty(), "relays should be empty after all consumed");
}