import { posthogHelper } from '@botpress/common'
import { z, IntegrationDefinition, messages } from '@botpress/sdk'
import proactiveConversation from 'bp_modules/proactive-conversation'
import proactiveUser from 'bp_modules/proactive-user'
import { dmChannelMessages } from './definitions/channel'

export const INTEGRATION_NAME = 'instagram'
export const INTEGRATION_VERSION = '4.1.9'

const commonConfigSchema = z.object({
  replyToComments: z
    .boolean()
    .default(false)
    .title('Reply to Comments')
    .describe('If enabled, the bot will reply to comments on posts.'),
})

export default new IntegrationDefinition({
  name: INTEGRATION_NAME,
  version: INTEGRATION_VERSION,
  title: 'Instagram',
  description: 'Automate interactions, manage comments, and send/receive messages all in real-time.',
  icon: 'icon.svg',
  readme: 'hub.md',
  configuration: {
    identifier: {
      linkTemplateScript: 'linkTemplate.vrl',
    },
    schema: commonConfigSchema,
  },
  configurations: {
    manual: {
      title: 'Manual Configuration',
      description: 'Configure by manually supplying the Meta app details',
      schema: z
        .object({
          clientSecret: z
            .string()
            .secret()
            .title('Client Secret')
            .describe('Instagram App secret from API setup View used for webhook signature check'),
          verifyToken: z
            .string()
            .secret()
            .title('Verify Token')
            .describe('Token used for verifying the Callback URL at API setup View'),
          accessToken: z
            .string()
            .secret()
            .title('Access token')
            .describe('Access Token for the Instagram Account from the API setup View'),
          instagramId: z.string().title('Instagram account ID').describe('Instagram Account Id from API setup View'),
        })
        .merge(commonConfigSchema),
    },
    sandbox: {
      title: 'Sandbox Configuration',
      description: 'Sandbox configuration, for testing purposes only',
      schema: z.object({}),
      identifier: {
        linkTemplateScript: 'sandboxLinkTemplate.vrl',
      },
    },
  },
  states: {
    oauth: {
      type: 'integration',
      schema: z.object({
        accessToken: z
          .string()
          .title('Access token')
          .describe('Access token used to authenticate requests to the Instagram API'),
        instagramId: z
          .string()
          .title('Instagram account ID')
          .describe('The Instagram account ID associated with the access token'),
        expirationTime: z
          .number()
          .title('Expiration time')
          .describe('The time when the access token expires, expressed as a Unix timestamp (epoch) in milliseconds'),
      }),
    },
  },
  identifier: {
    extractScript: 'extract.vrl',
    fallbackHandlerScript: 'fallbackHandler.vrl',
  },
  channels: {
    channel: {
      title: 'Direct Message',
      description: 'Direct message conversation between an Instagram user and the bot',
      messages: dmChannelMessages,
      message: {
        tags: {
          id: {
            title: 'Message ID',
            description: 'The Instagram message ID',
          },
          senderId: {
            title: 'Sender ID',
            description: 'The Instagram user ID of the message sender',
          },
          recipientId: {
            title: 'Recipient ID',
            description: 'The Instagram user ID of the message recipient',
          },
          commentId: {
            title: 'Comment ID',
            description: 'The Instagram comment ID under which the direct message conversation was started',
          },
        },
      },
      conversation: {
        tags: {
          id: {
            title: 'Conversation ID',
            description: 'The Instagram user ID of the user in the conversation',
          },
          commentId: {
            title: 'Comment ID',
            description: 'The Instagram comment ID under which the direct message conversation was started',
          },
          lastCommentId: {
            title: 'Last Comment ID',
            description: 'The Instagram comment ID of the last comment from which a direct message was sent',
          },
        },
      },
    },
    commentReplies: {
      title: 'Comment Replies',
      description: 'Replies to comments on an Instagram post',
      messages: {
        text: messages.defaults.text,
      },
      message: {
        tags: {
          id: {
            title: 'Comment ID',
            description: 'The unique ID of the comment',
          },
          postId: {
            title: 'Post ID',
            description: 'The Instagram post ID where the comment was posted',
          },
        },
      },
      conversation: {
        tags: {
          id: {
            title: 'Comment ID',
            description: 'The Instagram comment ID under which the reply was posted',
          },
          postId: {
            title: 'Post ID',
            description: 'The Instagram post ID where the comment was posted',
          },
          userId: {
            title: 'User ID',
            description: 'The Instagram user ID of the user who sent the comment',
          },
        },
      },
    },
  },
  actions: {},
  events: {},
  secrets: {
    ...posthogHelper.COMMON_SECRET_NAMES,
    CLIENT_ID: {
      description: 'The client ID of the OAuth Meta app.',
    },
    CLIENT_SECRET: {
      description: 'The client secret of the OAuth Meta app.',
    },
    VERIFY_TOKEN: {
      description: 'The verify token of the OAuth Meta app.',
    },
    SANDBOX_CLIENT_SECRET: {
      description: 'The client secret of the Sandbox Meta app',
    },
    SANDBOX_VERIFY_TOKEN: {
      description: 'The verify token for the Sandbox Meta App Webhooks subscription',
    },
    SANDBOX_ACCESS_TOKEN: {
      description: 'Access token for the Sandbox Meta App',
    },
    SANDBOX_INSTAGRAM_ID: {
      description: 'Instagram ID for the Sandbox Instagram profile',
    },
  },
  user: {
    tags: {
      id: {
        title: 'User ID',
        description: 'The Instagram user ID',
      },
    },
  },
  entities: {
    user: {
      title: 'User',
      description: 'An Instagram user',
      schema: z
        .object({
          id: z.string().title('ID').describe('The Instagram user ID'),
        })
        .title('User')
        .describe('The user object fields'),
    },
    dm: {
      title: 'Direct Message',
      description: 'An Instagram direct message conversation',
      schema: z
        .object({
          id: z.string().title('User ID').describe('The Instagram user ID of the user in the conversation'),
          commentId: z
            .string()
            .optional()
            .title('Comment ID')
            .describe('The Instagram comment ID under which the direct message conversation was started'),
        })
        .title('Conversation')
        .describe('The conversation object fields'),
    },
  },
  attributes: {
    category: 'Communication & Channels',
    guideSlug: 'instagram',
    repo: 'botpress',
  },
})
  .extend(proactiveUser, ({ entities }) => ({
    entities: {
      user: entities.user,
    },
  }))
  .extend(proactiveConversation, ({ entities }) => ({
    entities: {
      conversation: entities.dm,
    },
    actions: {
      getOrCreateConversation: { name: 'getOrCreateConversationDm' },
    },
  }))
