import { POLYLINIE_CONFIG } from '../shapes/shape-config'

export interface Vec2 {
  x: number
  y: number
}

/**
 * Snapped einen Kandidatenpunkt auf das Winkelraster relativ zur vorherigen Segment-Richtung.
 *
 * - Wenn prevPrev null ist (erste 2 Segmente): freie Platzierung, kein Snapping.
 * - Ab dem 3. Punkt: Snap auf [-90, -45, -22.5, 0, +22.5, +45, +90]° relativ zum vorherigen Segment.
 */
export function snapToAngleGrid(
  prev: Vec2,
  prevPrev: Vec2 | null,
  candidate: Vec2,
  snapAngles: number[] = POLYLINIE_CONFIG.snapAngles,
): Vec2 {
  if (!prevPrev) return candidate

  // Richtung des vorherigen Segments
  const prevDir = Math.atan2(prev.y - prevPrev.y, prev.x - prevPrev.x)

  // Richtung zum Kandidaten
  const candDir = Math.atan2(candidate.y - prev.y, candidate.x - prev.x)

  // Relativer Winkel in Grad
  let relDeg = ((candDir - prevDir) * 180) / Math.PI
  // Normalisieren auf [-180, 180]
  relDeg = ((relDeg + 180) % 360 + 360) % 360 - 180

  // Nächsten Snap-Winkel finden
  let bestSnap = snapAngles[0]
  let bestDiff = Infinity
  for (const snap of snapAngles) {
    const diff = Math.abs(relDeg - snap)
    if (diff < bestDiff) {
      bestDiff = diff
      bestSnap = snap
    }
  }

  // Absolute Richtung nach Snap
  const snappedAbsAngle = prevDir + (bestSnap * Math.PI) / 180

  // Distanz vom prev zum Kandidaten beibehalten
  const dist = Math.sqrt(
    (candidate.x - prev.x) ** 2 + (candidate.y - prev.y) ** 2
  )

  return {
    x: prev.x + Math.cos(snappedAbsAngle) * dist,
    y: prev.y + Math.sin(snappedAbsAngle) * dist,
  }
}
