import {
	Property,
	TriggerStrategy,
	createTrigger,
} from '@activepieces/pieces-framework';
import {
	Polling,
	DedupeStrategy,
	pollingHelper,
} from '@activepieces/pieces-common';
import { JiraDataCenterAuth, jiraDataCenterAuth } from '../../auth';
import { searchIssuesByJql } from '../common';
import dayjs from 'dayjs';

const polling: Polling<
	JiraDataCenterAuth,
	{ jql?: string }
> = {
	strategy: DedupeStrategy.TIMEBASED,
	items: async ({ auth, lastFetchEpochMS, propsValue }) => {
		const { jql } = propsValue;
		const searchQuery = `${jql ? jql + ' AND ' : ''}updated > '${dayjs(
			lastFetchEpochMS,
		).format('YYYY-MM-DD HH:mm')}'`;
		const issues = await searchIssuesByJql({
			auth,
			jql: searchQuery,
			maxResults: 50,
		});
		return issues.map((issue) => ({
			epochMilliSeconds: Date.parse(issue.fields.updated),
			data: issue,
		}));
	},
};

export const updatedIssue = createTrigger({
	name: 'updated_issue',
	displayName: 'Updated Issue',
	description: 'Triggers when an issue is updated',
	aiMetadata: {
		description:
			'Fires when an existing issue is updated in Jira Data Center/Server (polls by last-updated time, so any field change counts). An optional JQL filter narrows which issues are watched; each matching issue emits an event when its updated timestamp advances.',
	},
	auth: jiraDataCenterAuth,
	type: TriggerStrategy.POLLING,
	props: {
		jql: Property.LongText({
			displayName: 'JQL',
			description: 'Use to filter issues watched',
			required: false,
		}),
	},
	sampleData: {},
	async onEnable(context) {
		await pollingHelper.onEnable(polling, context);
	},
	async onDisable(context) {
		await pollingHelper.onDisable(polling, context);
	},
	async run(context) {
		return await pollingHelper.poll(polling, context);
	},
	async test(context) {
		return await pollingHelper.test(polling, context);
	},
});
