import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import { ReachinboxAuth } from '../..';
import { reachinboxCommon } from '../common';

// Define the shape of the account object
interface EmailAccount {
  id: number;
  email: string;
  warmupEnabled: boolean;
  isDisconnected: boolean;
}

export const enableWarmup = createAction({
  auth: ReachinboxAuth,
  name: 'enableWarmup',
  displayName: 'Enable Warmup',
  description:
    'Enable warmup for specific email accounts where it is currently disabled.',
  audience: 'both',
  aiMetadata: {
    description:
      'Turns on inbox warmup for a connected ReachInbox email account, identified by its account id. Use to start gradually building sending reputation for a mailbox. Idempotent: re-running for an account already warming up leaves it enabled.',
    idempotent: true,
  },
  props: {
    accountId: Property.Dropdown({
  auth: ReachinboxAuth,
      displayName: 'Select Email Accounts to Enable Warmup',
      description: 'Choose email accounts that have warmup disabled.',
      required: true,
      refreshers: ['auth'],
      options: async ({ auth }) => {
        try {
          // Fetch email accounts
          const response = await httpClient.sendRequest({
            method: HttpMethod.GET,
            url: `${reachinboxCommon.baseUrl}account/all`,
            headers: {
              Authorization: `Bearer ${auth}`,
            },
          });

          const accounts: EmailAccount[] =
            response.body?.data?.emailsConnected || [];

          // Filter accounts where warmup is not enabled and isDisconnected is false
          const accountsToEnableWarmup = accounts.filter(
            (account: EmailAccount) =>
              !account.warmupEnabled && !account.isDisconnected
          );

          // Map the filtered accounts to dropdown options
          const options = accountsToEnableWarmup.map(
            (account: EmailAccount) => ({
              label: `${account.email} (ID: ${account.id})`,
              value: account.id.toString(),
            })
          );

          return {
            options,
            disabled: options.length === 0,
          };
        } catch (error) {
          console.error('Error fetching email accounts:', error);
          return { options: [], disabled: true };
        }
      },
    }),
  },
  async run(context) {
    const { accountId } = context.propsValue;

    // Prepare the body for enabling warmup
    const body = {
      ids: [accountId],
    };

    try {
      const response = await httpClient.sendRequest({
        method: HttpMethod.POST,
        url: `${reachinboxCommon.baseUrl}account/warmup/enable`,
        headers: {
          Authorization: `Bearer ${context.auth.secret_text}`,
          'Content-Type': 'application/json',
        },
        body,
      });

      return {
        success: true,
        message: `Warmup enabled for account ID: ${accountId}`,
      };
    } catch (error) {
      console.error('Error enabling warmup:', error);
      throw new Error(`Failed to enable warmup for account ID: ${accountId}`);
    }
  },
});
