import * as sdk from '@botpress/sdk'
import proactiveConversation from 'bp_modules/proactive-conversation'
import proactiveUser from 'bp_modules/proactive-user'

const emailProps = {
  cc: sdk.z
    .array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
    .optional()
    .describe('The CC recipients of the initial email')
    .title('CC Recipients'),
  bcc: sdk.z
    .array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
    .optional()
    .describe('The BCC recipients of the initial email')
    .title('BCC Recipients'),
  subject: sdk.z.string().optional().describe('The subject of the email').title('Email Subject'),
}

export default new sdk.IntegrationDefinition({
  name: 'postmark',
  title: 'Postmark',
  description: 'Send and receive emails through Postmark',
  version: '0.1.1',
  readme: 'hub.md',
  icon: 'icon.svg',
  configuration: {
    schema: sdk.z.object({
      serverToken: sdk.z.string().secret().min(1).title('Server Token').describe('Your Postmark Server API Token'),
      fromEmail: sdk.z.string().email().min(1).title('From Email').describe('Default sender email address'),
      webhookSecret: sdk.z
        .string()
        .secret()
        .optional()
        .title('Webhook Secret')
        .describe(
          'Optional secret to verify inbound webhooks. Append ?secret=YOUR_SECRET to your Postmark webhook URL.'
        ),
    }),
  },
  actions: {
    sendEmail: {
      title: 'Send Email',
      description: 'Send an email through Postmark',
      input: {
        schema: sdk.z
          .object({
            conversationInformation: sdk.z
              .object({
                rootEmailId: sdk.z
                  .string()
                  .optional()
                  .describe('The ID of the root email in the thread')
                  .title('Root Email ID'),
                lastEmailId: sdk.z
                  .string()
                  .optional()
                  .describe('The ID of the last email in the thread')
                  .title('Last Email ID'),
              })
              .optional()
              .describe('Information about the conversation thread, used to group emails into threads')
              .title('Conversation Information'),
            userEmailAddress: sdk.z.string().describe('The recipient email address').title('Recipient Email Address'),
            userName: sdk.z.string().optional().describe('The recipient name').title('Recipient Name'),
            cc: sdk.z
              .array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
              .optional()
              .describe('The CC recipients of the initial email')
              .title('CC Recipients'),
            bcc: sdk.z
              .array(sdk.z.object({ email: sdk.z.string().email(), name: sdk.z.string().optional() }))
              .optional()
              .describe('The BCC recipients of the initial email')
              .title('BCC Recipients'),
            subject: sdk.z
              .string()
              .optional()
              .describe('The subject of the initial email')
              .title('Initial Email Subject'),
            text: sdk.z
              .string()
              .min(1)
              .describe('The body of the initial email that opens the thread')
              .title('Initial Email Body'),
          })
          .title('Conversation')
          .describe('The conversation object fields'),
      },
      output: {
        schema: sdk.z.object({
          conversationId: sdk.z
            .string()
            .describe('The ID of the conversation associated with the email')
            .title('Conversation ID'),
        }),
      },
    },
  },
  user: {
    tags: {
      emailAddress: {
        title: 'Email Address',
        description: 'Email address of the user',
      },
    },
  },
  channels: {
    mail: {
      title: 'Mail',
      description: 'Send and receive emails through Postmark',
      conversation: {
        tags: {
          threadRootMessageId: {
            title: 'Thread Root Message ID',
            description: 'The Message-ID of the first email in the thread, used to group replies into one conversation',
          },
          postmarkEmailAddress: {
            title: 'Postmark Email Address',
            description: 'The email address used in Postmark',
          },
          userEmailAddress: {
            title: 'User Email Address',
            description: 'The email address of the user',
          },
        },
      },
      message: {
        tags: {
          id: {
            title: 'Message ID',
            description: 'The ID of the email message',
          },
          emailMessageId: {
            title: 'Email Message-ID',
            description:
              'RFC 5322 Message-ID of the email. Absent on attachment sub-messages so they are excluded from thread reconstruction.',
          },
          subject: {
            title: 'Subject',
            description: 'The subject of the email',
          },
          cc: {
            title: 'CC',
            description: 'The CC recipients of the email',
          },
          bcc: {
            title: 'BCC',
            description: 'The BCC recipients of the email',
          },
          spamScore: {
            title: 'Spam Score',
            description: 'The spam score of the email as calculated by Postmark',
          },
        },
      },
      messages: {
        text: { schema: sdk.messages.defaults.text.schema.extend(emailProps) },
        image: { schema: sdk.messages.defaults.image.schema.extend(emailProps) },
        audio: { schema: sdk.messages.defaults.audio.schema.extend(emailProps) },
        video: { schema: sdk.messages.defaults.video.schema.extend(emailProps) },
        file: { schema: sdk.messages.defaults.file.schema.extend(emailProps) },
        location: { schema: sdk.messages.defaults.location.schema.extend(emailProps) },
        carousel: { schema: sdk.messages.defaults.carousel.schema.extend(emailProps) },
        card: { schema: sdk.messages.defaults.card.schema.extend(emailProps) },
        dropdown: { schema: sdk.messages.defaults.dropdown.schema.extend(emailProps) },
        choice: { schema: sdk.messages.defaults.choice.schema.extend(emailProps) },
        bloc: { schema: sdk.messages.defaults.bloc.schema.extend(emailProps) },
      },
    },
  },
  entities: {
    conversation: {
      title: 'Conversation',
      description: 'A postmark replyThread',
      schema: sdk.z.object({
        conversationInformation: sdk.z
          .object({
            rootEmailId: sdk.z
              .string()
              .optional()
              .describe('The ID of the root email in the thread')
              .title('Root Email ID'),
            lastEmailId: sdk.z
              .string()
              .optional()
              .describe('The ID of the last email in the thread')
              .title('Last Email ID'),
          })
          .describe('Information about the conversation thread, used to group emails into threads')
          .title('Conversation Information'),
      }),
    },
    user: {
      title: 'User',
      description: 'A user in the Postmark channel',
      schema: sdk.z.object({}),
    },
  },
  attributes: {
    category: 'Communication & Channels',
    repo: 'botpress',
  },
})
  .extend(proactiveConversation, ({ entities }) => ({
    entities: { conversation: entities.conversation },
    actions: {
      getOrCreateConversation: {
        name: 'getOrCreateReplyThreadConversation',
        title: 'Get or Create Reply Thread Conversation',
        description: 'Get or create a conversation for a reply thread',
      },
    },
  }))
  .extend(proactiveUser, ({ entities }) => ({
    entities: { user: entities.user },
    actions: {
      getOrCreateUser: {
        name: 'getOrCreateUser',
        title: 'Get or Create User',
        description: 'Get or create a user in the Postmark channel',
      },
    },
  }))
