import { describe, test, expect } from 'bun:test'

import { computeAccurateBounds } from '@open-pencil/core'

describe('computeAccurateBounds', () => {
  test('empty network', () => {
    expect(computeAccurateBounds({ vertices: [], segments: [], regions: [] })).toEqual({
      x: 0,
      y: 0,
      width: 0,
      height: 0
    })
  })

  test('single vertex', () => {
    const bounds = computeAccurateBounds({
      vertices: [{ x: 50, y: 30, handleMirroring: 'NONE' }],
      segments: [],
      regions: []
    })
    expect(bounds.x).toBe(50)
    expect(bounds.y).toBe(30)
    expect(bounds.width).toBe(0)
    expect(bounds.height).toBe(0)
  })

  test('two vertices', () => {
    const bounds = computeAccurateBounds({
      vertices: [
        { x: 0, y: 0, handleMirroring: 'NONE' },
        { x: 100, y: 50, handleMirroring: 'NONE' }
      ],
      segments: [{ start: 0, end: 1, tangentStart: { x: 0, y: 0 }, tangentEnd: { x: 0, y: 0 } }],
      regions: []
    })
    expect(bounds).toEqual({ x: 0, y: 0, width: 100, height: 50 })
  })

  test('bezier curve extrema extend bounds', () => {
    const bounds = computeAccurateBounds({
      vertices: [
        { x: 0, y: 0, handleMirroring: 'NONE' },
        { x: 100, y: 0, handleMirroring: 'NONE' }
      ],
      segments: [{ start: 0, end: 1, tangentStart: { x: 0, y: -50 }, tangentEnd: { x: 0, y: 50 } }],
      regions: []
    })
    // Curve extrema at t=(3±√3)/6, not at control points
    expect(bounds.y).toBeCloseTo(-14.4338, 3)
    expect(bounds.height).toBeCloseTo(28.8675, 3)
  })
})
