import airQualityLookup from './air-quality.ts'
export type AirQualityLookupParams = {
location?: string
latitude?: number
longitude?: number
label?: string
date?: string
hour?: number | null
hourlyLimit?: number
}
export type AirQualitySummary = {
location: string
date: string
usAqi: number | null
category: string
europeanAqi: number | null
pm25: number | null
pm10: number | null
peakHour: string | null
summary: string
}
function requirePlace(params: AirQualityLookupParams = {}) {
const input = typeof params === 'object' && params ? params : {}
const hasCoords =
input.latitude !== undefined &&
input.latitude !== null &&
input.longitude !== undefined &&
input.longitude !== null
const hasLocation = Boolean(String(input.location || '').trim())
if (!hasCoords && !hasLocation) {
throw new Error(
'Provide either a location string or latitude and longitude.',
)
}
return input
}
/** Full Open-Meteo air-quality lookup for a location or coordinates. */
export async function getAirQuality(params: AirQualityLookupParams = {}) {
return airQualityLookup(requirePlace(params))
}
/** Compact AQI summary for briefings and automations. */
export async function summarizeAirQuality(
params: AirQualityLookupParams = {},
) {
const result = await airQualityLookup(requirePlace(params))
return {
location: result.location.displayName,
date: result.date,
usAqi: result.daily.maxUsAqi,
category: result.daily.maxUsCategory,
europeanAqi: result.daily.maxEuropeanAqi,
pm25: result.daily.avgPm25,
pm10: result.daily.avgPm10,
peakHour: result.daily.peakHour?.time ?? null,
summary: result.summary,
} satisfies AirQualitySummary
}