import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
import { hubspotAuth } from '../auth';
import { createAction, Property } from '@activepieces/pieces-framework';
import { pageType } from '../common/props';

export const createPageAction = createAction({
	auth: hubspotAuth,
	name: 'create-page',
	displayName: 'Create Page',
	description: 'Creates a new landing/site page.',
	audience: 'both',
	aiMetadata: { description: 'Create a new HubSpot CMS landing page or site page (choose via Page Type) from a template, then optionally publish it when State is set to publish rather than leaving it as a draft. Each call creates a distinct page, so it is not idempotent.', idempotent: false },
	props: {
		pageType: pageType,
		pageTitle: Property.ShortText({
			displayName: 'Page Title',
			required: true,
		}),
		internalPageName: Property.ShortText({
			displayName: 'Internal Page Name',
			required: true,
		}),
		templatePath: Property.ShortText({
			displayName: 'Template Path',
			description:
				'The path should not include a slash (/) at the start.For example,"@hubspot/elevate/templates/blank.hubl.html".',
			required: true,
		}),
		slug: Property.ShortText({
			displayName: 'Slug',
			required: true,
		}),
		language: Property.ShortText({
			displayName: 'Language',
			required: false,
			defaultValue: 'en-us',
		}),
		metaDescription: Property.LongText({
			displayName: 'Meta Description',
			required: false,
		}),
		state: Property.StaticDropdown({
			displayName: 'State',
			required: false,
			defaultValue: 'DRAFT',
			options: {
				disabled: false,
				options: [
					{
						label: 'Draft',
						value: 'DRAFT',
					},
					{
						label: 'Publish',
						value: 'PUBLISHED_OR_SCHEDULED',
					},
				],
			},
		}),
		headHtml: Property.LongText({
			displayName: 'Additional Head HTML',
			required: false,
		}),
		footerHtml: Property.LongText({
			displayName: 'Additional Footer HTML',
			required: false,
		}),
	},
	async run(context) {
		const url = `https://api.hubapi.com/cms/v3/pages/${
			context.propsValue.pageType === 'site_page' ? 'site-pages' : 'landing-pages'
		}`;
		const {
			pageTitle,
			internalPageName,
			metaDescription,
			templatePath,
			language,
			state,
			headHtml,
			footerHtml,
			slug,
		} = context.propsValue;

		const createdPage = await httpClient.sendRequest<{ id: string }>({
			method: HttpMethod.POST,
			url,
			authentication: {
				type: AuthenticationType.BEARER_TOKEN,
				token: context.auth.access_token,
			},
			body: {
				htmlTitle: pageTitle,
				name: internalPageName,
				metaDescription,
				templatePath,
				slug,
				language,
				headHtml,
				footerHtml,
			},
		});

		if (state === 'PUBLISHED_OR_SCHEDULED') {
			await httpClient.sendRequest({
				method: HttpMethod.POST,
				url: `https://api.hubapi.com/content/api/v2/pages/${createdPage.body.id}/publish-action`,
				authentication: {
					type: AuthenticationType.BEARER_TOKEN,
					token: context.auth.access_token,
				},
				body: { action: 'schedule-publish' },
			});
		}

		const pageDetails = await httpClient.sendRequest({
			method: HttpMethod.GET,
			url: `${url}/${createdPage.body.id}`,
			authentication: { type: AuthenticationType.BEARER_TOKEN, token: context.auth.access_token },
		});

		return pageDetails.body;
	},
});
