import type {
  GoogleMapsTimezoneParams,
  GoogleMapsTimezoneResponse,
} from '@/tools/google_maps/types'
import type { ToolConfig } from '@/tools/types'

export const googleMapsTimezoneTool: ToolConfig<
  GoogleMapsTimezoneParams,
  GoogleMapsTimezoneResponse
> = {
  id: 'google_maps_timezone',
  name: 'Google Maps Timezone',
  description: 'Get timezone information for a location',
  version: '1.0.0',

  params: {
    apiKey: {
      type: 'string',
      required: true,
      visibility: 'user-only',
      description: 'Google Maps API key',
    },
    lat: {
      type: 'number',
      required: true,
      visibility: 'user-or-llm',
      description: 'Latitude coordinate',
    },
    lng: {
      type: 'number',
      required: true,
      visibility: 'user-or-llm',
      description: 'Longitude coordinate',
    },
    timestamp: {
      type: 'number',
      required: false,
      visibility: 'user-or-llm',
      description: 'Unix timestamp to determine DST offset (defaults to current time)',
    },
    language: {
      type: 'string',
      required: false,
      visibility: 'user-or-llm',
      description: 'Language code for timezone name (e.g., en, es, fr)',
    },
  },

  hosting: {
    envKeyPrefix: 'GOOGLE_CLOUD_API_KEY',
    apiKeyParam: 'apiKey',
    byokProviderId: 'google_cloud',
    pricing: {
      type: 'per_request',
      cost: 0.005,
    },
    rateLimit: {
      mode: 'per_request',
      requestsPerMinute: 60,
    },
  },

  request: {
    url: (params) => {
      const url = new URL('https://maps.googleapis.com/maps/api/timezone/json')
      url.searchParams.set('location', `${params.lat},${params.lng}`)
      // Use provided timestamp or current time
      const timestamp = params.timestamp ?? Math.floor(Date.now() / 1000)
      url.searchParams.set('timestamp', timestamp.toString())
      url.searchParams.set('key', params.apiKey.trim())
      if (params.language) {
        url.searchParams.set('language', params.language.trim())
      }
      return url.toString()
    },
    method: 'GET',
    headers: () => ({
      'Content-Type': 'application/json',
    }),
  },

  transformResponse: async (response: Response) => {
    const data = await response.json()

    if (data.status !== 'OK') {
      throw new Error(
        `Timezone request failed: ${data.status} - ${data.errorMessage || 'Unknown error'}`
      )
    }

    // Calculate total offset
    const totalOffsetSeconds = data.rawOffset + data.dstOffset
    const totalOffsetHours = totalOffsetSeconds / 3600

    return {
      success: true,
      output: {
        timeZoneId: data.timeZoneId,
        timeZoneName: data.timeZoneName,
        rawOffset: data.rawOffset,
        dstOffset: data.dstOffset,
        totalOffsetSeconds,
        totalOffsetHours,
      },
    }
  },

  outputs: {
    timeZoneId: {
      type: 'string',
      description: 'IANA timezone ID (e.g., "America/New_York", "Europe/London")',
    },
    timeZoneName: {
      type: 'string',
      description: 'Localized timezone name (e.g., "Eastern Daylight Time")',
    },
    rawOffset: {
      type: 'number',
      description: 'UTC offset in seconds (without DST)',
    },
    dstOffset: {
      type: 'number',
      description: 'Daylight Saving Time offset in seconds (0 if not in DST)',
    },
    totalOffsetSeconds: {
      type: 'number',
      description: 'Total UTC offset in seconds (rawOffset + dstOffset)',
    },
    totalOffsetHours: {
      type: 'number',
      description: 'Total UTC offset in hours (e.g., -5 for EST, -4 for EDT)',
    },
  },
}
