import { ConfigurationError } from "@pipedream/platform";
import common from "../../common.mjs";
import constants from "../../common/constants.mjs";
import utils from "../../common/utils.mjs";
const { discord } = common.props;
export default {
  key: "discord_bot-send-message",
  name: "Send message",
  description: "Send message to a user or a channel. [See the docs here](https://discord.com/developers/docs/resources/user#create-dm) and [here](https://discord.com/developers/docs/resources/channel#create-message)",
  version: "1.0.1",
  annotations: {
    destructiveHint: false,
    openWorldHint: true,
    readOnlyHint: false,
  },
  type: "action",
  props: {
    discord,
    ...common.props,
    message: {
      propDefinition: [
        discord,
        "message",
      ],
    },
    embeds: {
      propDefinition: [
        discord,
        "embeds",
      ],
    },
    threadID: {
      propDefinition: [
        discord,
        "threadID",
      ],
    },
    username: {
      propDefinition: [
        discord,
        "username",
      ],
    },
    avatarURL: {
      propDefinition: [
        discord,
        "avatarURL",
      ],
    },
    includeSentViaPipedream: {
      type: "boolean",
      optional: true,
      default: true,
      label: "Include link to workflow",
      description: "Defaults to `true`, includes a link to this workflow at the end of your Discord message.",
    },
    userId: {
      propDefinition: [
        discord,
        "userId",
        (c) => ({
          guildId: c.guildId,
        }),
      ],
      description: "Select either a user or a channel",
      optional: true,
    },
    channelId: {
      propDefinition: [
        discord,
        "channelId",
        ({ guildId }) => ({
          guildId,
          notAllowedChannels: constants.NOT_ALLOWED_CHANNELS,
        }),
      ],
      description: "Select either a channel or an user",
      optional: true,
    },
  },
  methods: {
    ...common.methods,
    getUserInputProps(omit = [
      "discord",
    ]) {
      return Object.keys(this)
        .filter((key) => typeof this[key] !== "function" && !omit.includes(key))
        .reduce((props, key) => {
          props[key] = this[key];
          return props;
        }, {});
    },
    appendPipedreamText(message) {
      let content = message;
      if (typeof content !== "string") {
        content = JSON.stringify(content);
      }
      content += `\n\n${this.getSentViaPipedreamText()}`;
      return content;
    },
    getSentViaPipedreamText() {
      const workflowId = process.env.PIPEDREAM_WORKFLOW_ID;
      
      
      const linkText = `pipedream.com/@/${workflowId}?o=a&a=discord_webhook`;
      const link = `https://${linkText}`;
      return `Sent via [${linkText}](<${link}>)`;
    },
  },
  async run({ $ }) {
    if ((this.userId && this.channelId) || (!this.userId && !this.channelId)) {
      throw new ConfigurationError("You must select either a user or a channel.");
    }
    let channelId = this.channelId;
    if (this.userId) {
      const createDMChannelResponse = await this.discord.createDm({
        $,
        recipientId: this.userId,
      });
      channelId = createDMChannelResponse.id;
    }
    if (channelId) {
      const createMessageResponse = await this.discord.createMessage({
        $,
        channelId,
        data: {
          embeds: utils.parseObject(this.embeds),
          avatarURL: this.avatarURL,
          threadID: this.threadID,
          username: this.username,
          content: this.includeSentViaPipedream
            ? this.appendPipedreamText(this.message)
            : this.message,
        },
      });
      $.export("$summary", "Message has been sent successfully");
      return createMessageResponse;
    } else {
      $.export("$summary", "Could not create or retrieve DM channel!");
      throw new Error("Create DM Channel call was not successful!");
    }
  },
};