import type {
  GoogleTranslateDetectParams,
  GoogleTranslateDetectResponse,
} from '@/tools/google_translate/types'
import type { ToolConfig } from '@/tools/types'

export const googleTranslateDetectTool: ToolConfig<
  GoogleTranslateDetectParams,
  GoogleTranslateDetectResponse
> = {
  id: 'google_translate_detect',
  name: 'Google Translate Detect Language',
  description: 'Detect the language of text using the Google Cloud Translation API.',
  version: '1.0.0',

  params: {
    apiKey: {
      type: 'string',
      required: true,
      visibility: 'user-only',
      description: 'Google Cloud API key with Cloud Translation API enabled',
    },
    text: {
      type: 'string',
      required: true,
      visibility: 'user-or-llm',
      description: 'The text to detect the language of',
    },
  },

  hosting: {
    envKeyPrefix: 'GOOGLE_CLOUD_API_KEY',
    apiKeyParam: 'apiKey',
    byokProviderId: 'google_cloud',
    pricing: {
      type: 'custom',
      getCost: (params) => {
        const text = params.text as string
        if (!text) {
          throw new Error('Missing text parameter, cannot determine detection cost')
        }
        // $20 per 1M characters — from https://cloud.google.com/translate/pricing
        const charCount = text.length
        const cost = charCount * 0.00002
        return { cost, metadata: { characters: charCount } }
      },
    },
    rateLimit: {
      mode: 'per_request',
      requestsPerMinute: 60,
    },
  },

  request: {
    url: (params) => {
      const url = new URL('https://translation.googleapis.com/language/translate/v2/detect')
      url.searchParams.set('key', params.apiKey)
      return url.toString()
    },
    method: 'POST',
    headers: () => ({
      'Content-Type': 'application/json',
    }),
    body: (params) => ({
      q: params.text,
    }),
  },

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

    if (data.error) {
      return {
        success: false,
        output: {
          language: '',
          confidence: null,
        },
        error: data.error.message ?? 'Google Translate API error',
      }
    }

    const detection = data.data?.detections?.[0]?.[0]

    return {
      success: true,
      output: {
        language: detection?.language ?? '',
        confidence: detection?.confidence ?? null,
      },
    }
  },

  outputs: {
    language: {
      type: 'string',
      description: 'The detected language code (e.g., "en", "es", "fr")',
    },
    confidence: {
      type: 'number',
      description: 'Confidence score of the detection',
      optional: true,
    },
  },
}
