import { describe, expect, it } from "vitest";

import {
  getResistedGalleryDragDistance,
  resolveGallerySwipeDirection,
} from "../private-album-gallery-motion";

describe("private album Gallery motion", () => {
  it("switches after crossing the viewport distance threshold", () => {
    expect(
      resolveGallerySwipeDirection({
        distance: -72,
        durationMs: 500,
        viewportWidth: 390,
        hasPrevious: true,
        hasNext: true,
      }),
    ).toBe(1);
    expect(
      resolveGallerySwipeDirection({
        distance: 72,
        durationMs: 500,
        viewportWidth: 390,
        hasPrevious: true,
        hasNext: true,
      }),
    ).toBe(-1);
  });

  it("switches on a short fast swipe but not a slow short drag", () => {
    const baseInput = {
      distance: -30,
      viewportWidth: 390,
      hasPrevious: true,
      hasNext: true,
    };

    expect(
      resolveGallerySwipeDirection({ ...baseInput, durationMs: 50 }),
    ).toBe(1);
    expect(
      resolveGallerySwipeDirection({ ...baseInput, durationMs: 500 }),
    ).toBe(0);
  });

  it("does not move beyond the first or last image", () => {
    expect(
      resolveGallerySwipeDirection({
        distance: 100,
        durationMs: 100,
        viewportWidth: 390,
        hasPrevious: false,
        hasNext: true,
      }),
    ).toBe(0);
    expect(
      resolveGallerySwipeDirection({
        distance: -100,
        durationMs: 100,
        viewportWidth: 390,
        hasPrevious: true,
        hasNext: false,
      }),
    ).toBe(0);
  });

  it("applies resistance only while pulling past an edge", () => {
    expect(getResistedGalleryDragDistance(100, false, true)).toBeCloseTo(28);
    expect(getResistedGalleryDragDistance(-100, true, false)).toBeCloseTo(-28);
    expect(getResistedGalleryDragDistance(-100, false, true)).toBe(-100);
  });
});
