import { http } from 'msw'
import { jsonResponse, noContent, sse } from '../helpers'
import { seedFlights } from '../../fixtures/seed_flights'
import { seedAircraft } from '../../fixtures/seed_aircraft'

// Default `/api/flights/*` handlers. Live-GPS SSE returns a deterministic
// 3-event stream so AC-08 timing assertions have something to drive even
// without per-test overrides.

export const flightsHandlers = [
  http.get('/api/flights', () => jsonResponse(seedFlights)),

  http.get('/api/flights/:id', ({ params }) => {
    const flight = seedFlights.find((f) => f.id === params.id)
    if (!flight) return new Response(null, { status: 404 })
    return jsonResponse(flight)
  }),

  http.post('/api/flights', async ({ request }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: 'flight-new', createdDate: new Date().toISOString(), ...body }, { status: 201 })
  }),

  http.put('/api/flights/:id', async ({ request, params }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: params.id, ...body })
  }),

  http.delete('/api/flights/:id', () => noContent()),

  http.get('/api/flights/:id/waypoints', ({ params }) =>
    jsonResponse([
      {
        id: 'wp-1',
        flightId: params.id,
        name: 'WP1',
        latitude: 50.45,
        longitude: 30.52,
        order: 1,
      },
    ]),
  ),

  http.post('/api/flights/:id/waypoints', async ({ request, params }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: 'wp-new', flightId: params.id, ...body }, { status: 201 })
  }),

  http.get('/api/flights/:id/live-gps', ({ params }) =>
    sse([
      { event: 'gps', data: { flightId: params.id, lat: 50.45, lon: 30.52, t: 0 }, id: '1' },
      { event: 'gps', data: { flightId: params.id, lat: 50.46, lon: 30.53, t: 1000 }, id: '2' },
      { event: 'gps', data: { flightId: params.id, lat: 50.47, lon: 30.54, t: 2000 }, id: '3' },
    ]),
  ),

  // Production uses the plural path `/api/flights/aircrafts`. Singular alias kept
  // for any future test that follows REST-singular conventions; production paths win.
  http.get('/api/flights/aircrafts', () => jsonResponse(seedAircraft)),
  http.get('/api/flights/aircraft', () => jsonResponse(seedAircraft)),

  http.patch('/api/flights/aircrafts/:id', async ({ request, params }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: params.id, ...body })
  }),

  // POST accepts both plural and singular paths. Production convention is
  // plural (REST collection); singular kept as a backward-compat alias.
  http.post('/api/flights/aircrafts', async ({ request }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: 'AC-NEW', ...body }, { status: 201 })
  }),
  http.post('/api/flights/aircraft', async ({ request }) => {
    const body = (await request.json()) as Record<string, unknown>
    return jsonResponse({ id: 'AC-NEW', ...body }, { status: 201 })
  }),
]
