import { parseObject } from "../../common/utils.mjs";
import nutshell from "../../nutshell.app.mjs";
export default {
  key: "nutshell-create-contact",
  name: "Create Contact",
  description: "Creates a new contact. [See the documentation](https://developers.nutshell.com/detail/class_core.html#a4b40d4fe9c7b8ddfd7231aca65cd1556)",
  version: "0.0.2",
  annotations: {
    destructiveHint: false,
    openWorldHint: true,
    readOnlyHint: false,
  },
  type: "action",
  props: {
    nutshell,
    name: {
      type: "string",
      label: "Name",
      description: "The name to the contact.",
      optional: true,
    },
    phone: {
      propDefinition: [
        nutshell,
        "phone",
      ],
      description: "The phone numbers of the contact.",
    },
    email: {
      propDefinition: [
        nutshell,
        "email",
      ],
      description: "The email address of the contact.",
    },
    address: {
      propDefinition: [
        nutshell,
        "address",
      ],
      optional: true,
    },
    accountId: {
      propDefinition: [
        nutshell,
        "accountId",
      ],
      type: "string[]",
      description: "The account's Id to the Contact.",
      optional: true,
    },
    leadId: {
      propDefinition: [
        nutshell,
        "leadId",
        ({ accountId }) => ({
          accountId,
        }),
      ],
      optional: true,
    },
    territoryId: {
      propDefinition: [
        nutshell,
        "territoryId",
      ],
      description: "The territory of the contact.",
      optional: true,
    },
    audienceId: {
      propDefinition: [
        nutshell,
        "audienceId",
      ],
      optional: true,
    },
    description: {
      propDefinition: [
        nutshell,
        "description",
      ],
      description: "A description to identify the new contact.",
      reloadProps: true,
    },
  },
  async additionalProps() {
    const { result: { Contacts: fields } } = await this.getCustomFields();
    const props = {};
    let i = 0;
    for (const field of fields) {
      i++;
      props[`customField_${i}`] = {
        type: "string",
        label: field.name,
        description: `Custom field ${i}.`,
        optional: true,
      };
    }
    return props;
  },
  methods: {
    async getCustomFields() {
      return await this.nutshell.post({
        method: "findCustomFields",
      });
    },
    async parseCustomFields(props) {
      const customFields = {};
      const { result: { Contacts } } = await this.getCustomFields();
      let i = 0;
      for (const field of Contacts) {
        i++;
        if (props[`customField_${i}`]) {
          customFields[field.name] = props[`customField_${i}`];
        }
      }
      return customFields;
    },
  },
  async run({ $ }) {
    const customFields = await this.parseCustomFields(this);
    const response = await this.nutshell.post({
      $,
      method: "newContact",
      data: {
        params: {
          contact: {
            name: this.name,
            description: this.description,
            phone: this.phone && parseObject(this.phone),
            email: this.email && parseObject(this.email),
            address: this.address && parseObject(this.address),
            leads: this.leadId && this.leadId.map((lead) => ({
              id: lead,
            })),
            accounts: this.accountId && this.accountId.map((account) => ({
              id: account,
            })),
            territoryId: this.territoryId,
            audienceId: this.audienceId && this.audienceId.map((audience) => ({
              id: audience,
            })),
            customFields,
          },
        },
      },
    });
    $.export("$summary", `New contact created with Id: ${response.result?.id}`);
    return response;
  },
};