use std::fs;

use closure_app::core::sync::{SyncOutcome, sync_dirs};
use tempfile::TempDir;

#[test]
fn test_sync_updates_destination_from_source() {
    let src = TempDir::new().unwrap();
    let dst = TempDir::new().unwrap();

    fs::write(src.path().join("a.txt"), "src-a").unwrap();

    let outcome = sync_dirs(src.path(), dst.path()).unwrap();

    assert_eq!(outcome, SyncOutcome::UpdatedFromSource);
    assert_eq!(
        fs::read_to_string(dst.path().join("a.txt")).unwrap(),
        "src-a"
    );
}

#[test]
fn test_sync_updates_source_from_destination() {
    let src = TempDir::new().unwrap();
    let dst = TempDir::new().unwrap();

    fs::write(dst.path().join("b.txt"), "dst-b").unwrap();

    let outcome = sync_dirs(src.path(), dst.path()).unwrap();

    assert_eq!(outcome, SyncOutcome::UpdatedFromDestination);
    assert_eq!(
        fs::read_to_string(src.path().join("b.txt")).unwrap(),
        "dst-b"
    );
}

#[test]
fn test_sync_detects_conflict_after_baseline() {
    let src = TempDir::new().unwrap();
    let dst = TempDir::new().unwrap();

    fs::write(src.path().join("same.txt"), "base").unwrap();
    sync_dirs(src.path(), dst.path()).unwrap();

    fs::write(src.path().join("same.txt"), "left").unwrap();
    fs::write(dst.path().join("same.txt"), "right").unwrap();

    let err = sync_dirs(src.path(), dst.path()).unwrap_err();
    assert!(err.to_string().contains("sync conflict"));
}
