import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'

const querySchema = z.object({
  lat: z.string().transform((v) => parseFloat(v)).pipe(z.number().min(-90).max(90)),
  lng: z.string().transform((v) => parseFloat(v)).pipe(z.number().min(-180).max(180)),
})

export interface ForecastHour {
  time: string
  windspeed: number
  windgusts: number
  precipitation_probability: number
  cloudcover: number
  temperature: number
  weathercode: number
}

export interface ForecastData {
  hourly: ForecastHour[]
}

export async function GET(req: NextRequest) {
  const { searchParams } = req.nextUrl
  const parsed = querySchema.safeParse({ lat: searchParams.get('lat'), lng: searchParams.get('lng') })
  if (!parsed.success) return NextResponse.json({ error: 'lat and lng required' }, { status: 400 })

  const { lat, lng } = parsed.data
  const url = new URL('https://api.open-meteo.com/v1/forecast')
  url.searchParams.set('latitude', lat.toFixed(4))
  url.searchParams.set('longitude', lng.toFixed(4))
  url.searchParams.set('hourly', [
    'temperature_2m',
    'windspeed_10m',
    'windgusts_10m',
    'precipitation_probability',
    'cloudcover',
    'weathercode',
  ].join(','))
  url.searchParams.set('forecast_days', '7')
  url.searchParams.set('wind_speed_unit', 'kmh')
  url.searchParams.set('timezone', 'Europe/Lisbon')

  try {
    const res = await fetch(url.toString(), { next: { revalidate: 3600 } })
    if (!res.ok) throw new Error(`Open-Meteo ${res.status}`)
    const json = await res.json()
    const h = json.hourly

    const hourly: ForecastHour[] = (h.time as string[]).map((t: string, i: number) => ({
      time: t,
      windspeed: Math.round(h.windspeed_10m[i] ?? 0),
      windgusts: Math.round(h.windgusts_10m[i] ?? 0),
      precipitation_probability: Math.round(h.precipitation_probability[i] ?? 0),
      cloudcover: Math.round(h.cloudcover[i] ?? 0),
      temperature: Math.round(h.temperature_2m[i] ?? 0),
      weathercode: h.weathercode[i] ?? 0,
    }))

    return NextResponse.json({ hourly }, {
      headers: { 'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate=7200' },
    })
  } catch (err) {
    console.error('Forecast error:', err)
    return NextResponse.json({ error: 'Forecast unavailable' }, { status: 502 })
  }
}
