import { describe, it, expect } from 'vitest'
import { resampleSegment } from './splineUtils'
import type { Point } from '@/extensions/core/maskeditor/types'

describe('Shift+Click Drawing Logic', () => {
  it('should generate equidistant points across connected segments', () => {
    const spacing = 4
    let remainder = spacing // Simulate start point already painted
    const outputPoints: Point[] = []

    // Define points: A -> B -> C
    // A(0,0) -> B(10,0) -> C(20,0)
    // Total length 20. Spacing 4.
    // Expected points at x = 4, 8, 12, 16, 20
    const pA = { x: 0, y: 0 }
    const pB = { x: 10, y: 0 }
    const pC = { x: 20, y: 0 }

    // Segment 1: A -> B
    const result1 = resampleSegment([pA, pB], spacing, remainder)
    outputPoints.push(...result1.points)
    remainder = result1.remainder

    // Verify intermediate state
    // Length 10. Spacing 4. Start offset 4.
    // Points at 4, 8. Next at 12.
    // Remainder = 12 - 10 = 2.
    expect(result1.points.length).toBe(2)
    expect(result1.points[0].x).toBeCloseTo(4)
    expect(result1.points[1].x).toBeCloseTo(8)
    expect(remainder).toBeCloseTo(2)

    // Segment 2: B -> C
    const result2 = resampleSegment([pB, pC], spacing, remainder)
    outputPoints.push(...result2.points)

    // Verify final state
    // Start offset 2. Points at 2, 6, 10 (relative to B).
    // Absolute x: 12, 16, 20.
    expect(result2.points.length).toBe(3)
    expect(result2.points[0].x).toBeCloseTo(12)
    expect(result2.points[1].x).toBeCloseTo(16)
    expect(result2.points[2].x).toBeCloseTo(20)

    // Verify all distances
    // Note: The first point is at distance `spacing` from start (0,0)
    // Subsequent points are `spacing` apart.
    let prevX = 0
    for (const p of outputPoints) {
      const dist = p.x - prevX
      expect(dist).toBeCloseTo(spacing)
      prevX = p.x
    }
  })

  it('should handle segments shorter than spacing', () => {
    const spacing = 10
    let remainder = spacing // Simulate start point already painted

    // A(0,0) -> B(5,0) -> C(15,0)
    const pA = { x: 0, y: 0 }
    const pB = { x: 5, y: 0 }
    const pC = { x: 15, y: 0 }

    // Segment 1: A -> B (Length 5)
    // Spacing 10. No points should be generated.
    // Remainder should be 5 (next point needs 5 more units).
    const result1 = resampleSegment([pA, pB], spacing, remainder)
    expect(result1.points.length).toBe(0)
    expect(result1.remainder).toBeCloseTo(5)
    remainder = result1.remainder

    // Segment 2: B -> C (Length 10)
    // Start offset 5. First point at 5 (relative to B).
    // Absolute x = 10.
    // Next point at 15 (relative to B). Segment ends at 10.
    // Remainder = 15 - 10 = 5.
    const result2 = resampleSegment([pB, pC], spacing, remainder)
    expect(result2.points.length).toBe(1)
    expect(result2.points[0].x).toBeCloseTo(10)
    expect(result2.remainder).toBeCloseTo(5)
  })
})
