import {
  BODY_CONTENT_TYPE_OPTIONS,
  ENCODING_OPTIONS,
} from "../../common/constants.mjs";
import { parseObject } from "../../common/utils.mjs";
import app from "../../elastic_email.app.mjs";
export default {
  key: "elastic_email-send-email",
  name: "Send Email",
  description: "Sends an email to one or more recipients. [See the documentation](https://elasticemail.com/developers/api-documentation/rest-api#operation/emailsPost)",
  version: "0.0.2",
  annotations: {
    destructiveHint: false,
    openWorldHint: true,
    readOnlyHint: false,
  },
  type: "action",
  props: {
    app,
    recipients: {
      type: "string[]",
      label: "Recipients",
      description: "List of recipients",
    },
    from: {
      type: "string",
      label: "From",
      description: "Your e-mail with an optional name (e.g.: email@domain.com)",
    },
    bodyContentType: {
      type: "string",
      label: "Body Content Type",
      description: "Type of body part",
      options: BODY_CONTENT_TYPE_OPTIONS,
      optional: true,
    },
    bodyContent: {
      type: "string",
      label: "Body Content",
      description: "Actual content of the body part",
      optional: true,
    },
    merge: {
      type: "object",
      label: "Merge",
      description: "A key-value collection of custom merge fields, shared between recipients. Should be used in e-mail body like so: {firstname}, {lastname} etc.",
      optional: true,
    },
    replyTo: {
      type: "string",
      label: "Reply To",
      description: "To what address should the recipients reply to (e.g. email@domain.com)",
      optional: true,
    },
    subject: {
      type: "string",
      label: "Subject",
      description: "Default subject of email.",
      optional: true,
    },
    templateName: {
      propDefinition: [
        app,
        "templateName",
      ],
      optional: true,
    },
    timeOffset: {
      type: "integer",
      label: "Time Offset",
      description: "By how long should an e-mail be delayed (in minutes). Maximum is 35 days.",
      optional: true,
    },
    poolName: {
      type: "string",
      label: "Pool Name",
      description: "Name of your custom IP Pool to be used in the sending process",
      optional: true,
    },
    channelName: {
      type: "string",
      label: "Channel Name",
      description: "Name of selected channel.",
      optional: true,
    },
    encoding: {
      type: "string",
      label: "Encoding",
      description: "Encoding type for the email headers",
      options: ENCODING_OPTIONS,
      optional: true,
    },
    trackOpens: {
      type: "boolean",
      label: "Track Opens",
      description: "Should the opens be tracked? If no value has been provided, Account's default setting will be used.",
      optional: true,
    },
    trackClicks: {
      type: "boolean",
      label: "Track Clicks",
      description: "Should the clicks be tracked? If no value has been provided, Account's default setting will be used.",
      optional: true,
    },
  },
  async run({ $ }) {
    const response = await this.app.sendBulkEmails({
      $,
      data: {
        Recipients: parseObject(this.recipients)?.map((item) => ({
          Email: item,
        })),
        Content: {
          From: this.from,
          Body: [
            {
              ContentType: this.bodyContentType,
              Body: this.bodyContent,
            },
          ],
          Merge: parseObject(this.merge),
          ReplyTo: this.replyTo,
          Subject: this.subject,
          TemplateName: this.templateName,
        },
        Options: {
          TimeOffset: this.timeOffset,
          PoolName: this.poolName,
          ChannelName: this.channelName,
          Encoding: this.encoding,
          TrackOpens: this.trackOpens,
          TrackClicks: this.trackClicks,
        },
      },
    });
    $.export("$summary", `Emails sent successfully to ${this.recipients.join(", ")}`);
    return response;
  },
};