import { Property, createAction } from '@activepieces/pieces-framework';
import { harvestAuth } from '../..';
import {
  getAccessTokenOrThrow,
  HttpMethod,
} from '@activepieces/pieces-common';
import { callHarvestApi, filterDynamicFields } from '../common';
import { propsValidation } from '@activepieces/pieces-common';
import * as z from 'zod/mini'

export const getUsers = createAction({
  name: 'get_users',
  auth: harvestAuth,
  displayName: 'Get Users',
  description: 'Fetches Users',
  audience: 'both',
  aiMetadata: { description: 'Lists users (team members) in a Harvest account; with no filters it returns every user, or narrow by active/inactive state or updated-since timestamp. Use to resolve a person to their user ID or enumerate the team. Read-only and idempotent.', idempotent: true },
  props: {
    is_active: Property.ShortText({
    description: 'Pass `true` to only return active users and `false` to return inactive users.',
    displayName: 'Is Active',
    required: false,
  }),
  updated_since: Property.ShortText({
    description: 'Only return users that have been updated since the given date and time.',
    displayName: 'Updated since',
    required: false,
  }),
  page: Property.ShortText({
    description: 'DEPRECATED: The page number to use in pagination.',
    displayName: 'Page',
    required: false,
  }),
  per_page: Property.ShortText({
    description: 'The number of records to return per page. (1-2000)',
    displayName: 'Records per page',
    required: false,
  }),
},
async run(context) {
  // Validate the input properties using Zod
  await propsValidation.validateZod(context.propsValue, {
    per_page: z.pipe(z.optional(z.string()), z.transform((val) => (val === undefined || val === '' ? undefined : parseInt(val, 10)))).check(z.refine((val) => val === undefined || (Number.isInteger(val) && val >= 1 && val <= 2000), 'Per Page must be a number between 1 and 2000.')),
  });

  const params = filterDynamicFields(context.propsValue);

  const response = await callHarvestApi(
      HttpMethod.GET,
      `users`,
      getAccessTokenOrThrow(context.auth),
      params
    );

    return response.body;  },
});
