import { config } from '../config.js'; import { requestJson } from '../http.js'; /** * Google Address Validation API. Returns the raw response body. */ export async function validateAddress(street, city, state, postalCode, country) { const body = { address: { regionCode: country, locality: city, addressLines: [street], administrativeArea: state, postalCode, }, }; const url = `https://addressvalidation.googleapis.com/v1:validateAddress?key=${encodeURIComponent(config.google.apiKey)}`; return requestJson('POST', url, body); } /** * Google Time Zone API for a given lat/lon at "now". */ export async function getTimeZone(latitude, longitude) { const timestamp = Math.floor(Date.now() / 1000); const url = `https://maps.googleapis.com/maps/api/timezone/json?location=${latitude}%2C${longitude}` + `×tamp=${timestamp}&key=${encodeURIComponent(config.google.apiKey)}`; return requestJson('POST', url); } /** * Reduce a Google addressComponents array to a flat "num street, city, state zip" string. */ export function formatE911Address(addressData) { const parts = {}; for (const component of addressData.result.address.addressComponents ?? []) { parts[component.componentType] = component.componentName?.text ?? ''; } return `${parts.street_number ?? ''} ${parts.route ?? ''}, ${parts.locality ?? ''}, ${ parts.administrative_area_level_1 ?? '' } ${parts.postal_code ?? ''}`.trim(); } export function formatSuite(addressData) { for (const component of addressData.result.address.addressComponents ?? []) { if (component.componentType === 'subpremise') { return component.componentName?.text ?? ''; } } return ''; }