import { fetchJsonWithRetry, type RetryOptions } from './open-meteo-client.ts' import { resolveWeatherLocation } from './weather-geocode.ts' export type ElevationLookupParams = { location?: string latitude?: number longitude?: number label?: string live?: RetryOptions } const FEET_PER_METER = 3.28084 /** Ground elevation lookup for a location or coordinates via the Open-Meteo Elevation API. */ export async function elevationLookup(params: ElevationLookupParams = {}) { const input = typeof params === 'object' && params ? params : {} const resolvedLocation = await resolveWeatherLocation(input) const url = 'https://api.open-meteo.com/v1/elevation?latitude=' + encodeURIComponent(String(resolvedLocation.latitude)) + '&longitude=' + encodeURIComponent(String(resolvedLocation.longitude)) const live = await fetchJsonWithRetry(url, input.live || {}) const elevations = live.data?.elevation const meters = Array.isArray(elevations) ? Number(elevations[0]) : NaN if (!Number.isFinite(meters)) { throw new Error( 'Unexpected elevation response shape for ' + resolvedLocation.displayName, ) } const feet = Math.round(meters * FEET_PER_METER) return { location: { displayName: resolvedLocation.displayName, latitude: resolvedLocation.latitude, longitude: resolvedLocation.longitude, source: resolvedLocation.source, }, meters, feet, source: 'open-meteo', attempts: live.attempts, summary: resolvedLocation.displayName + ' elevation: ' + Math.round(meters) + ' m (' + feet + ' ft)', } } export default elevationLookup