import type {
CurrentWeather,
HourlyWeather,
DailyWeather,
WeatherAlert,
} from '../types/weather.js';
export function formatTemperature(temp: number, units = 'metric'): string {
const unit = units === 'imperial' ? '°F' : units === 'metric' ? '°C' : 'K';
return `${Math.round(temp)}${unit}`;
}
export function formatDateTime(timestamp: number): string {
return new Date(timestamp * 1000).toLocaleString();
}
export function formatCurrentWeather(
weather: CurrentWeather,
units = 'metric'
): string {
const temp = formatTemperature(weather.temp, units);
const feelsLike = formatTemperature(weather.feels_like, units);
const condition = weather.weather[0];
return [
`🌡️ Temperature: ${temp} (feels like ${feelsLike})`,
`☁️ Condition: ${condition.description}`,
`💧 Humidity: ${weather.humidity}%`,
`💨 Wind: ${weather.wind_speed} ${units === 'imperial' ? 'mph' : 'm/s'}`,
`👁️ Visibility: ${weather.visibility / 1000} km`,
`🌅 Sunrise: ${formatDateTime(weather.sunrise)}`,
`🌇 Sunset: ${formatDateTime(weather.sunset)}`,
].join('\n');
}
export function formatHourlyWeather(
hourly: HourlyWeather[],
units = 'metric'
): string {
return hourly
.map((hour) => {
const time = new Date(hour.dt * 1000).toLocaleTimeString([], {
hour: '2-digit',
minute: '2-digit',
});
const temp = formatTemperature(hour.temp, units);
const condition = hour.weather[0].description;
const rain = hour.pop > 0 ? ` (${Math.round(hour.pop * 100)}% rain)` : '';
return `${time}: ${temp} - ${condition}${rain}`;
})
.join('\n');
}
export function formatDailyWeather(
daily: DailyWeather[],
units = 'metric'
): string {
return daily
.map((day) => {
const date = new Date(day.dt * 1000).toLocaleDateString();
const high = formatTemperature(day.temp.max, units);
const low = formatTemperature(day.temp.min, units);
const condition = day.weather[0].description;
const rain = day.pop > 0 ? ` (${Math.round(day.pop * 100)}% rain)` : '';
return `${date}: ${high}/${low} - ${condition}${rain}`;
})
.join('\n');
}
export function formatWeatherAlerts(alerts: WeatherAlert[]): string {
if (alerts.length === 0) {
return 'No active weather alerts';
}
return alerts
.map((alert) => {
const start = formatDateTime(alert.start);
const end = formatDateTime(alert.end);
return [
`🚨 **${alert.event}**`,
`📅 ${start} - ${end}`,
`📍 Issued by: ${alert.sender_name}`,
`📝 ${alert.description}`,
`🏷️ Tags: ${alert.tags.join(', ')}`,
].join('\n');
})
.join('\n\n');
}