import {
  createAction,
  Property,
} from '@activepieces/pieces-framework';
import {
  HttpRequest,
  HttpMethod,
  AuthenticationType,
  httpClient,
  QueryParams,
} from '@activepieces/pieces-common';
import { googleContactsCommon } from '../common';
import { googleContactsAuth } from '../auth';

export const googleContactsUpdateContactAction = createAction({
  auth: googleContactsAuth,
  name: 'update_contact',
  description: 'Update a contact in Google Contacts account.',
  audience: 'both',
  aiMetadata: { description: 'Updates fields (name, email, phone, company, job title) on an existing Google Contacts person identified by its resourceName (people/{id}). Use when an agent needs to modify a known contact; requires both the resourceName and the current etag, and a field mask listing which fields to update — the call is rejected if the contact changed since the etag was fetched. Repeating the same update with the same etag/values is safe and yields the same result.', idempotent: true },
  displayName: 'Update Contact',
  props: {
    resourceName: Property.ShortText({
      displayName: 'Resource Name',
      description:
        'The resource name for the person, assigned by the server. An ASCII string in the form of people/{person_id}.',
      required: true,
    }),
    etag: Property.ShortText({
      displayName: 'Etag',
      description:
        "The `etag` ensures contact updates only apply if the contact hasn't changed since last retrieved.",
      required: true,
    }),
    updatePersonFields: Property.StaticMultiSelectDropdown({
      displayName: 'Update Field Mask',
      description:
        'A field mask to restrict which fields on the person are updated.',
      required: true,
      options: {
        options: [
          { label: 'Names', value: 'names' },
          { label: 'Email', value: 'emailAddresses' },
          { label: 'Phone Number', value: 'phoneNumbers' },
          { label: 'Job Title / Company', value: 'organizations' },
        ],
      },
      defaultValue: ['names', 'emailAddresses'],
    }),
    firstName: Property.ShortText({
      displayName: 'First Name',
      description: 'The first name of the contact',
      required: false,
    }),
    middleName: Property.ShortText({
      displayName: 'Middle Name',
      description: 'The middle name of the contact',
      required: false,
    }),
    lastName: Property.ShortText({
      displayName: 'Last Name',
      description: 'The last name of the contact',
      required: false,
    }),
    jobTitle: Property.ShortText({
      displayName: 'Job Title',
      description: 'The job title of the contact',
      required: false,
    }),
    company: Property.ShortText({
      displayName: 'Company',
      description: 'The company of the contact',
      required: false,
    }),
    email: Property.ShortText({
      displayName: 'Email',
      description: 'The email address of the contact',
      required: false,
    }),
    phoneNumber: Property.ShortText({
      displayName: 'Phone Number',
      description: 'The phone number of the contact',
      required: false,
    }),
  },
  async run(context) {
    const resourceName = context.propsValue['resourceName'].substring(6);
    const requestBody: Record<string, unknown> = {
      etag: context.propsValue['etag'],
    };
    const qs: QueryParams = {
      updatePersonFields: context.propsValue['updatePersonFields'].join(','),
    };
    if (
      context.propsValue['firstName'] ||
      context.propsValue['middleName'] ||
      context.propsValue['lastName']
    ) {
      requestBody['names'] = [
        {
          givenName: context.propsValue['firstName'] || undefined,
          middleName: context.propsValue['middleName'] || undefined,
          familyName: context.propsValue['lastName'] || undefined,
        },
      ];
    }
    if (context.propsValue['email']) {
      requestBody['emailAddresses'] = [{ value: context.propsValue['email'] }];
    }
    if (context.propsValue['phoneNumber']) {
      requestBody['phoneNumbers'] = [
        { value: context.propsValue['phoneNumber'] },
      ];
    }
    if (context.propsValue['company'] || context.propsValue['jobTitle']) {
      requestBody['organizations'] = [
        {
          name: context.propsValue['company'] || undefined,
          title: context.propsValue['jobTitle'] || undefined,
        },
      ];
    }
    const request: HttpRequest<Record<string, unknown>> = {
      method: HttpMethod.PATCH,
      url: `${googleContactsCommon.baseUrl}${resourceName}:updateContact`,
      body: requestBody,
      authentication: {
        type: AuthenticationType.BEARER_TOKEN,
        token: context.auth.access_token,
      },
      queryParams: qs,
    };
    return (await httpClient.sendRequest(request)).body;
  },
});
