import type {
  GoogleSheetsV2CopySheetParams,
  GoogleSheetsV2CopySheetResponse,
} from '@/tools/google_sheets/types'
import type { ToolConfig } from '@/tools/types'

export const copySheetV2Tool: ToolConfig<
  GoogleSheetsV2CopySheetParams,
  GoogleSheetsV2CopySheetResponse
> = {
  id: 'google_sheets_copy_sheet_v2',
  name: 'Copy Sheet V2',
  description: 'Copy a sheet from one spreadsheet to another',
  version: '2.0.0',

  oauth: {
    required: true,
    provider: 'google-sheets',
  },

  params: {
    accessToken: {
      type: 'string',
      required: true,
      visibility: 'hidden',
      description: 'The access token for the Google Sheets API',
    },
    sourceSpreadsheetId: {
      type: 'string',
      required: true,
      visibility: 'user-only',
      description: 'The ID of the source spreadsheet',
    },
    sheetId: {
      type: 'number',
      required: true,
      visibility: 'user-or-llm',
      description:
        'The ID of the sheet to copy (numeric ID, not the sheet name). Use Get Spreadsheet to find sheet IDs.',
    },
    destinationSpreadsheetId: {
      type: 'string',
      required: true,
      visibility: 'user-or-llm',
      description: 'The ID of the destination spreadsheet where the sheet will be copied',
    },
  },

  request: {
    url: (params) => {
      const sourceSpreadsheetId = params.sourceSpreadsheetId?.trim()
      if (!sourceSpreadsheetId) {
        throw new Error('Source spreadsheet ID is required')
      }

      const sheetId = params.sheetId
      if (sheetId === undefined || sheetId === null) {
        throw new Error('Sheet ID is required')
      }

      return `https://sheets.googleapis.com/v4/spreadsheets/${sourceSpreadsheetId}/sheets/${sheetId}:copyTo`
    },
    method: 'POST',
    headers: (params) => {
      if (!params.accessToken) {
        throw new Error('Access token is required')
      }

      return {
        Authorization: `Bearer ${params.accessToken}`,
        'Content-Type': 'application/json',
      }
    },
    body: (params) => {
      const destinationSpreadsheetId = params.destinationSpreadsheetId?.trim()
      if (!destinationSpreadsheetId) {
        throw new Error('Destination spreadsheet ID is required')
      }

      return {
        destinationSpreadsheetId,
      }
    },
  },

  transformResponse: async (response: Response, params?: GoogleSheetsV2CopySheetParams) => {
    const data = await response.json()

    return {
      success: true,
      output: {
        sheetId: data.sheetId ?? 0,
        title: data.title ?? '',
        index: data.index ?? 0,
        sheetType: data.sheetType ?? 'GRID',
        destinationSpreadsheetId: params?.destinationSpreadsheetId ?? '',
        destinationSpreadsheetUrl: `https://docs.google.com/spreadsheets/d/${params?.destinationSpreadsheetId ?? ''}`,
      },
    }
  },

  outputs: {
    sheetId: {
      type: 'number',
      description: 'The ID of the newly created sheet in the destination',
    },
    title: { type: 'string', description: 'The title of the copied sheet' },
    index: { type: 'number', description: 'The index (position) of the copied sheet' },
    sheetType: { type: 'string', description: 'The type of the sheet (GRID, CHART, etc.)' },
    destinationSpreadsheetId: {
      type: 'string',
      description: 'The ID of the destination spreadsheet',
    },
    destinationSpreadsheetUrl: {
      type: 'string',
      description: 'URL to the destination spreadsheet',
    },
  },
}
