import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { kommoAuth } from '../auth';
import { makeRequest } from '../common';
import { contactDropdown, userDropdown } from '../common/props';

interface KommoCustomFieldValue {
  field_id?: number;
  field_code?: string;
  values: Array<{ value: string | number; enum_id?: number }>;
}

export const updateContactAction = createAction({
  auth: kommoAuth,
  name: 'update_contact',
  displayName: 'Update Contact',
  description: 'Updates an existing contact.',
  audience: 'both',
  aiMetadata: { description: 'Updates an existing Kommo CRM contact identified by contact ID, changing only the supplied fields (name, email/phone, responsible user) and adding or removing tags. Use to amend a known contact; resolve the contact ID first via Find Contact if unknown. Idempotent — repeating the same update yields the same contact state, though tag add/delete depends on the current tag set.', idempotent: true },
  props: {
    contactId: contactDropdown,
    name: Property.ShortText({
      displayName: 'Full Name',
      required: false,
    }),
    first_name: Property.ShortText({
      displayName: 'First Name',
      required: false,
    }),
    last_name: Property.ShortText({
      displayName: 'Last Name',
      required: false,
    }),
    email: Property.ShortText({
      displayName: 'Email',
      required: false,
    }),
    phone: Property.ShortText({
      displayName: 'Phone',
      required: false,
    }),
    responsible_user_id: userDropdown(),
    tags_to_add: Property.Array({
      displayName: 'Tags to Add',
      description: 'List of tag names or IDs to add.',
      required: false,
    }),
    tags_to_delete: Property.Array({
      displayName: 'Tags to Delete',
      description: 'List of tag names or IDs to remove.',
      required: false,
    })
  },
  async run(context) {
    const {
      contactId,
      name,
      first_name,
      last_name,
      email,
      phone,
      responsible_user_id,
    } = context.propsValue;

    const tagsToAdd = context.propsValue.tags_to_add ?? [];
    const tagsToDelete = context.propsValue.tags_to_delete ?? [];

    const { subdomain, apiToken } = context.auth.props;

    const customFields: KommoCustomFieldValue[] = [];

    if (email) {
      customFields.push({
        field_code: 'EMAIL',
        values: [{ value: email }],
      });
    }

    if (phone) {
      customFields.push({
        field_code: 'PHONE',
        values: [{ value: phone }],
      });
    }

    const updatePayload: Record<string, any> = {
      ...(customFields.length > 0 ? { custom_fields_values: customFields } : {}),
    };

    if (name) updatePayload['name'] = name;
    if (first_name) updatePayload['first_name'] = first_name;
    if (last_name) updatePayload['last_name'] = last_name;
    if (responsible_user_id) updatePayload['responsible_user_id'] = responsible_user_id;

    if (tagsToAdd.length > 0) {
      updatePayload['tags_to_add'] = tagsToAdd.map((tag) => ({ name: tag }))
    }

    if (tagsToDelete.length > 0) {
      updatePayload['tags_to_delete'] = tagsToDelete.map((tag) => ({ name: tag }))
    }

    const result = await makeRequest(
      { subdomain, apiToken },
      HttpMethod.PATCH,
      `/contacts/${contactId}`,
      updatePayload
    );

    return result;
  },
});
