use pixstrip_core::operations::watermark::calculate_position;
use pixstrip_core::operations::WatermarkPosition;
use pixstrip_core::types::Dimensions;

#[test]
fn position_top_left() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopLeft,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 10);
    assert_eq!(y, 10);
}

#[test]
fn position_center() {
    let (x, y) = calculate_position(
        WatermarkPosition::Center,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 860);  // (1920 - 200) / 2
    assert_eq!(y, 515);  // (1080 - 50) / 2
}

#[test]
fn position_bottom_right() {
    let (x, y) = calculate_position(
        WatermarkPosition::BottomRight,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 1710); // 1920 - 200 - 10
    assert_eq!(y, 1020); // 1080 - 50 - 10
}

#[test]
fn position_top_center() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopCenter,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 860); // (1920 - 200) / 2
    assert_eq!(y, 10);
}

#[test]
fn position_bottom_center() {
    let (x, y) = calculate_position(
        WatermarkPosition::BottomCenter,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 860);
    assert_eq!(y, 1020);
}

#[test]
fn position_middle_left() {
    let (x, y) = calculate_position(
        WatermarkPosition::MiddleLeft,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 10);
    assert_eq!(y, 515);
}

#[test]
fn position_middle_right() {
    let (x, y) = calculate_position(
        WatermarkPosition::MiddleRight,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 1710);
    assert_eq!(y, 515);
}

#[test]
fn position_top_right() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopRight,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 1710);
    assert_eq!(y, 10);
}

#[test]
fn position_bottom_left() {
    let (x, y) = calculate_position(
        WatermarkPosition::BottomLeft,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 10);
    assert_eq!(y, 1020);
}

// --- Margin variation tests ---

#[test]
fn margin_zero_top_left() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopLeft,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        0,
    );
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}

#[test]
fn margin_zero_bottom_right() {
    let (x, y) = calculate_position(
        WatermarkPosition::BottomRight,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        0,
    );
    assert_eq!(x, 1720); // 1920 - 200
    assert_eq!(y, 1030); // 1080 - 50
}

#[test]
fn large_margin_top_left() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopLeft,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        100,
    );
    assert_eq!(x, 100);
    assert_eq!(y, 100);
}

#[test]
fn large_margin_bottom_right() {
    let (x, y) = calculate_position(
        WatermarkPosition::BottomRight,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        100,
    );
    assert_eq!(x, 1620); // 1920 - 200 - 100
    assert_eq!(y, 930);  // 1080 - 50 - 100
}

#[test]
fn margin_does_not_affect_center() {
    let (x1, y1) = calculate_position(
        WatermarkPosition::Center,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        0,
    );
    let (x2, y2) = calculate_position(
        WatermarkPosition::Center,
        Dimensions { width: 1920, height: 1080 },
        Dimensions { width: 200, height: 50 },
        100,
    );
    assert_eq!(x1, x2);
    assert_eq!(y1, y2);
}

// --- Edge case tests ---

#[test]
fn watermark_larger_than_image() {
    // Watermark is bigger than the image - should not panic, saturating_sub clamps to 0
    let (x, y) = calculate_position(
        WatermarkPosition::BottomRight,
        Dimensions { width: 100, height: 100 },
        Dimensions { width: 200, height: 200 },
        10,
    );
    // (100 - 200 - 10) saturates to 0
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}

#[test]
fn watermark_exact_image_size() {
    let (x, y) = calculate_position(
        WatermarkPosition::Center,
        Dimensions { width: 200, height: 100 },
        Dimensions { width: 200, height: 100 },
        0,
    );
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}

#[test]
fn zero_size_image() {
    let (x, y) = calculate_position(
        WatermarkPosition::Center,
        Dimensions { width: 0, height: 0 },
        Dimensions { width: 200, height: 50 },
        10,
    );
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}

#[test]
fn margin_exceeds_available_space() {
    // Margin is huge relative to image size
    let (x, y) = calculate_position(
        WatermarkPosition::BottomRight,
        Dimensions { width: 100, height: 100 },
        Dimensions { width: 50, height: 50 },
        200,
    );
    // saturating_sub: 100 - 50 - 200 = 0
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}

#[test]
fn one_pixel_image() {
    let (x, y) = calculate_position(
        WatermarkPosition::TopLeft,
        Dimensions { width: 1, height: 1 },
        Dimensions { width: 1, height: 1 },
        0,
    );
    assert_eq!(x, 0);
    assert_eq!(y, 0);
}
