import { IntegrationDefinition, z } from '@botpress/sdk'
import { scheduleEventInputSchema, scheduleEventOutputSchema } from 'definitions/actions'
import { inviteeEventOutputSchema } from 'definitions/events'

export default new IntegrationDefinition({
  name: 'calendly',
  title: 'Calendly',
  version: '0.0.6',
  readme: 'hub.md',
  icon: 'icon.svg',
  description: 'Schedule meetings and manage events using the Calendly scheduling platform.',
  configuration: {
    identifier: {
      linkTemplateScript: 'linkTemplate.vrl',
    },
    schema: z.object({}),
  },
  configurations: {
    manual: {
      title: 'Manual Configuration',
      description: 'Configure by manually supplying a Calendly Personal Access Token',
      schema: z.object({
        accessToken: z
          .string()
          .secret()
          .min(1)
          .describe('Your Calendly Personal Access Token')
          .title('Personal Access Token'),
      }),
    },
  },
  actions: {
    scheduleEvent: {
      title: 'Schedule Calendly Event',
      description: 'Generates a link for scheduling an event in Calendly',
      input: { schema: scheduleEventInputSchema },
      output: { schema: scheduleEventOutputSchema },
    },
  },
  events: {
    eventScheduled: {
      title: 'Event Scheduled',
      description: 'An event that triggers when an invitee fills out and submits a scheduling form',
      schema: inviteeEventOutputSchema,
    },
    eventCanceled: {
      title: 'Event Canceled',
      description: 'An event that triggers when an invitee cancels a scheduled event',
      schema: inviteeEventOutputSchema,
    },
    eventNoShowCreated: {
      title: 'Event No Show Created',
      description: 'An event that triggers when an invitee is marked as a no-show',
      schema: inviteeEventOutputSchema,
    },
    eventNoShowDeleted: {
      title: 'Event No Show Deleted',
      description: 'An event that triggers when an invitee is unmarked as a no-show',
      schema: inviteeEventOutputSchema,
    },
  },
  secrets: {
    OAUTH_CLIENT_ID: {
      description: "The unique identifier that's used to initiate the OAuth flow",
    },
    OAUTH_CLIENT_SECRET: {
      description: "A secret that's used to establish and refresh the OAuth authentication",
    },
    OAUTH_WEBHOOK_SIGNING_KEY: {
      description: "The signing key used to validate Calendly's OAuth webhook request payloads",
    },
  },
  states: {
    configuration: {
      type: 'integration',
      schema: z.object({
        oauth: z
          .object({
            refreshToken: z.string().describe('The refresh token for the integration').title('Refresh Token'),
            accessToken: z.string().describe('The access token for the integration').title('Access Token'),
            expiresAt: z
              .number()
              .min(0)
              .describe('The expiry time of the access token represented as a Unix timestamp (milliseconds)')
              .title('Expires At'),
          })
          .describe('The parameters used for accessing the Calendly API and refreshing the access token')
          .title('OAuth Parameters')
          .nullable(),
      }),
    },
    webhooks: {
      type: 'integration',
      schema: z.object({
        signingKey: z
          .string()
          .secret()
          .describe('The signing key used for webhook event signatures')
          .title('Webhook Signing Key'),
      }),
    },
  },
  __advanced: {
    useLegacyZuiTransformer: true,
  },
  attributes: {
    category: 'Business Operations',
    repo: 'botpress',
  },
})
