import type { SlackGetUserParams, SlackGetUserResponse } from '@/tools/slack/types'
import { USER_OUTPUT_PROPERTIES } from '@/tools/slack/types'
import type { ToolConfig } from '@/tools/types'

export const slackGetUserTool: ToolConfig<SlackGetUserParams, SlackGetUserResponse> = {
  id: 'slack_get_user',
  name: 'Slack Get User Info',
  description: 'Get detailed information about a specific Slack user by their user ID.',
  version: '1.0.0',

  oauth: {
    required: true,
    provider: 'slack',
  },

  params: {
    authMethod: {
      type: 'string',
      required: false,
      visibility: 'user-only',
      description: 'Authentication method: oauth or bot_token',
    },
    botToken: {
      type: 'string',
      required: false,
      visibility: 'user-only',
      description: 'Bot token for Custom Bot',
    },
    accessToken: {
      type: 'string',
      required: false,
      visibility: 'hidden',
      description: 'OAuth access token or bot token for Slack API',
    },
    userId: {
      type: 'string',
      required: true,
      visibility: 'user-or-llm',
      description: 'User ID to look up (e.g., U1234567890)',
    },
  },

  request: {
    url: (params: SlackGetUserParams) => {
      const url = new URL('https://slack.com/api/users.info')
      url.searchParams.append('user', params.userId.trim())
      return url.toString()
    },
    method: 'GET',
    headers: (params: SlackGetUserParams) => ({
      'Content-Type': 'application/json',
      Authorization: `Bearer ${params.accessToken || params.botToken}`,
    }),
  },

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

    if (!data.ok) {
      if (data.error === 'user_not_found') {
        throw new Error('User not found. Please check the user ID and try again.')
      }
      if (data.error === 'missing_scope') {
        throw new Error(
          'Missing required permissions. Please reconnect your Slack account with the necessary scopes (users:read).'
        )
      }
      if (data.error === 'invalid_auth') {
        throw new Error('Invalid authentication. Please check your Slack credentials.')
      }
      throw new Error(data.error || 'Failed to get user info from Slack')
    }

    const user = data.user
    const profile = user.profile || {}

    return {
      success: true,
      output: {
        user: {
          id: user.id,
          team_id: user.team_id ?? null,
          name: user.name,
          real_name: user.real_name || profile.real_name || '',
          display_name: profile.display_name ?? '',
          first_name: profile.first_name ?? '',
          last_name: profile.last_name ?? '',
          title: profile.title ?? '',
          email: profile.email ?? '',
          phone: profile.phone ?? '',
          skype: profile.skype ?? '',
          is_bot: user.is_bot ?? false,
          is_admin: user.is_admin ?? false,
          is_owner: user.is_owner ?? false,
          is_primary_owner: user.is_primary_owner ?? false,
          is_restricted: user.is_restricted ?? false,
          is_ultra_restricted: user.is_ultra_restricted ?? false,
          is_app_user: user.is_app_user ?? false,
          deleted: user.deleted ?? false,
          color: user.color ?? null,
          timezone: user.tz ?? null,
          timezone_label: user.tz_label ?? null,
          timezone_offset: user.tz_offset ?? null,
          avatar_24: profile.image_24 ?? null,
          avatar_48: profile.image_48 ?? null,
          avatar_72: profile.image_72 ?? null,
          avatar_192: profile.image_192 ?? null,
          avatar_512: profile.image_512 ?? null,
          status_text: profile.status_text ?? '',
          status_emoji: profile.status_emoji ?? '',
          status_expiration: profile.status_expiration ?? null,
          updated: user.updated ?? null,
          has_2fa: user.has_2fa ?? false,
        },
      },
    }
  },

  outputs: {
    user: {
      type: 'object',
      description: 'Detailed user information',
      properties: USER_OUTPUT_PROPERTIES,
    },
  },
}
