import type { ToolConfig } from '@/tools/types'
import type { ZoomListMeetingsParams, ZoomListMeetingsResponse } from '@/tools/zoom/types'

export const zoomListMeetingsTool: ToolConfig<ZoomListMeetingsParams, ZoomListMeetingsResponse> = {
  id: 'zoom_list_meetings',
  name: 'Zoom List Meetings',
  description: 'List all meetings for a Zoom user',
  version: '1.0.0',

  oauth: {
    required: true,
    provider: 'zoom',
    requiredScopes: ['meeting:read:list_meetings'],
  },

  params: {
    userId: {
      type: 'string',
      required: true,
      visibility: 'user-only',
      description: 'The user ID or email address. Use "me" for the authenticated user.',
    },
    type: {
      type: 'string',
      required: false,
      visibility: 'user-or-llm',
      description:
        'Meeting type filter: scheduled, live, upcoming, upcoming_meetings, or previous_meetings',
    },
    pageSize: {
      type: 'number',
      required: false,
      visibility: 'user-or-llm',
      description: 'Number of records per page (max 300)',
    },
    nextPageToken: {
      type: 'string',
      required: false,
      visibility: 'user-or-llm',
      description: 'Token for pagination to get next page of results',
    },
  },

  request: {
    url: (params) => {
      const baseUrl = `https://api.zoom.us/v2/users/${encodeURIComponent(params.userId)}/meetings`
      const queryParams = new URLSearchParams()

      if (params.type) {
        queryParams.append('type', params.type)
      }
      if (params.pageSize) {
        queryParams.append('page_size', String(params.pageSize))
      }
      if (params.nextPageToken) {
        queryParams.append('next_page_token', params.nextPageToken)
      }

      const queryString = queryParams.toString()
      return queryString ? `${baseUrl}?${queryString}` : baseUrl
    },
    method: 'GET',
    headers: (params) => {
      if (!params.accessToken) {
        throw new Error('Missing access token for Zoom API request')
      }
      return {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${params.accessToken}`,
      }
    },
  },

  transformResponse: async (response) => {
    if (!response.ok) {
      const errorData = await response.json().catch(() => ({}))
      return {
        success: false,
        error: errorData.message || `Zoom API error: ${response.status} ${response.statusText}`,
        output: {
          meetings: [],
          pageInfo: {
            pageCount: 0,
            pageNumber: 0,
            pageSize: 0,
            totalRecords: 0,
          },
        },
      }
    }

    const data = await response.json()

    return {
      success: true,
      output: {
        meetings: (data.meetings || []).map((meeting: any) => ({
          id: meeting.id,
          uuid: meeting.uuid,
          host_id: meeting.host_id,
          topic: meeting.topic,
          type: meeting.type,
          start_time: meeting.start_time,
          duration: meeting.duration,
          timezone: meeting.timezone,
          agenda: meeting.agenda,
          created_at: meeting.created_at,
          join_url: meeting.join_url,
        })),
        pageInfo: {
          pageCount: data.page_count || 0,
          pageNumber: data.page_number || 0,
          pageSize: data.page_size || 0,
          totalRecords: data.total_records || 0,
          nextPageToken: data.next_page_token,
        },
      },
    }
  },

  outputs: {
    meetings: {
      type: 'array',
      description: 'List of meetings',
    },
    pageInfo: {
      type: 'object',
      description: 'Pagination information',
      properties: {
        pageCount: { type: 'number', description: 'Total number of pages' },
        pageNumber: { type: 'number', description: 'Current page number' },
        pageSize: { type: 'number', description: 'Number of records per page' },
        totalRecords: { type: 'number', description: 'Total number of records' },
        nextPageToken: { type: 'string', description: 'Token for next page' },
      },
    },
  },
}
