use sunocore::models::aligned_lyrics::AlignedLyricsV3;
use sunocore::models::downbeats::DownbeatsState;
use sunocore::models::instruments::Instruments;
use sunocore::models::key::Key;
use sunocore::models::midi::Midi;
use sunocore::models::waveform::WaveformAggregates;

#[test]
fn deserialize_key_example() {
    let data = include_str!("data/key_example.json");
    let key: Key = serde_json::from_str(data).expect("valid Key json");

    assert_eq!(key.state, DownbeatsState::Complete);
    assert_eq!(key.key.unwrap(), "Bb_minor");
}

#[test]
fn deserialize_instruments_example() {
    let data = include_str!("data/instruments_example.json");
    let instruments: Instruments = serde_json::from_str(data).expect("valid Instruments json");

    assert_eq!(instruments.state, DownbeatsState::Complete);
    let inst_list = instruments.instruments.unwrap();
    assert_eq!(inst_list.len(), 4);
    assert!(inst_list.contains(&"piano".to_string()));
    assert!(inst_list.contains(&"drums".to_string()));
}

#[test]
fn deserialize_midi_example() {
    let data = include_str!("data/midi_example.json");
    let midi: Midi = serde_json::from_str(data).expect("valid Midi json");

    assert_eq!(midi.state, DownbeatsState::Complete);
    let instruments = midi.instruments.unwrap();
    assert_eq!(instruments.len(), 2);
    assert_eq!(instruments[0].name, "piano");
    assert_eq!(instruments[0].notes.len(), 2);
    assert_eq!(instruments[0].notes[0].pitch, 60);
    assert_eq!(instruments[0].notes[0].start, 0.0);
    assert_eq!(instruments[0].notes[0].velocity, 0.8);
}

#[test]
fn deserialize_aligned_lyrics_example() {
    let data = include_str!("data/aligned_lyrics_example.json");
    let lyrics: AlignedLyricsV3 = serde_json::from_str(data).expect("valid AlignedLyricsV3 json");

    assert_eq!(lyrics.state, DownbeatsState::Complete);
    let alignment = lyrics.alignment.unwrap();
    assert_eq!(alignment.len(), 2);
    assert_eq!(alignment[0].word, "Hello");
    assert!(alignment[0].success);
    assert_eq!(alignment[0].start_s, 0.5);
    assert_eq!(alignment[0].p_align, 0.95);
}

#[test]
fn deserialize_waveform_aggregates_example() {
    let data = include_str!("data/waveform_aggregates_example.json");
    let waveforms: WaveformAggregates =
        serde_json::from_str(data).expect("valid WaveformAggregates json");

    assert_eq!(waveforms.waveform_aggregates.len(), 2);
    assert_eq!(waveforms.waveform_aggregates[0].mip_map_level, 11);
    assert_eq!(waveforms.waveform_aggregates[0].data.len(), 2);
    assert_eq!(waveforms.waveform_aggregates[0].data[0][0], -46);
}
