import { CfnResource, Stack } from "aws-cdk-lib";
import { Kengine as Config } from "../config";
import { Query } from "./query";
import { AlertProps, DeploymentAlertParameters } from "../types/alert";

export class Alert<TKey extends string> extends CfnResource {

	constructor(id: string, props: AlertProps<TKey>) {
		const defaultFrequency = "1h";
		const defaultWindow = "1h";

		let Parameters: DeploymentAlertParameters | undefined = undefined;

		if ("ref" in props.parameters.query) {
			Parameters = {
				...props.parameters,
				threshold: props.parameters.threshold || { operation: "=", value: 0 },
				query: props.parameters.query.ref,
				frequency: props.parameters.frequency || defaultFrequency,
				window: props.parameters.window || defaultWindow,
			};
		}

		if ("filters" in props.parameters.query) {
			const query = new Query(`${id}-query`, {
				parameters: {
					...props.parameters.query,
					calculations: props.parameters.query.calculations || [
						{ operation: "COUNT" },
					],
				},
			});

			Parameters = {
				...props.parameters,
				threshold: props.parameters.threshold || { operation: "=", value: 0 },
				query: query.ref,
				frequency: props.parameters.frequency || defaultFrequency,
				window: props.parameters.window || defaultWindow,
			};
		}

		if (!Parameters) throw new Error("Invalid alert parameters. Declare at least one of filters or ref in the query.")

		super(Config.getConstruct(), id, {
			type: "Custom::KengineAlert",
			properties: {
				id,
				ServiceToken: Config.getServiceToken(),
				KengineApiKey: Config.getApiKey(),
				enabled: props.enabled,
				Description: props.description,
				Parameters,
				Channels: props.channels || Config.getDefaultChannel() && [Config.getDefaultChannel()],
				Origin: "cdk",
			},
		});
	}
}
