import { isAfterResource, isExpectResource, isForEachResource, isMatchResource } from '@/automations/maps/utilities'
import { AutomationTriggerEventPosture, DEFAULT_EVENT_TRIGGER_THRESHOLD } from '@/automations/types/automationTriggerEvent'
import { isAutomationTriggerEvent } from '@/automations/types/triggers'
import { DeploymentStatus } from '@/models/DeploymentStatus'
import { createTuple } from '@/utilities/tuples'

export const { values: deploymentStatusEvent, isValue: isDeploymentStatusEvent } = createTuple(['prefect.deployment.ready', 'prefect.deployment.not-ready', 'prefect.deployment.disabled'])
export type DeploymentStatusEvent = typeof deploymentStatusEvent[number]

export type DeploymentStatusTrigger = {
  deployments: string[],
  posture: AutomationTriggerEventPosture,
  status: DeploymentStatus,
  time: number,
}

/**
 * This is used to determine if an AutomationTrigger can be mapped into a DeploymentStatusTrigger
 */
export function isDeploymentStatusTrigger(trigger: unknown): boolean {
  return isAutomationTriggerEvent(trigger) &&
         isMatchResource(trigger, prefectResourceIds => prefectResourceIds.every(value => value.startsWith('prefect.deployment'))) &&
         isForEachResource(trigger, 'prefect.resource.id') &&
         isAfterResource(trigger, triggerAfters => triggerAfters.every(after => isDeploymentStatusEvent(after))) &&
         isExpectResource(trigger, triggerExcepts => triggerExcepts.every(except => isDeploymentStatusEvent(except))) &&
         trigger.threshold === DEFAULT_EVENT_TRIGGER_THRESHOLD
}