import { StateMachine } from '@core/utils'
import { DashboardTableView, OrderResponse, ReservationResponse, TableResponse } from '@api-client/angular'

export namespace ReservationSAM {
	export type State = ReservationResponse.StateEnum | DashboardTableView.TableStateEnum

	export enum Action {
		ConfirmReservation = 'ConfirmReservation',
		RejectReservation = 'RejectReservation',
		UnConfirmReservation = 'UnConfirmReservation',
		Checkin = 'Checkin',
		Checkout = 'Checkout',
		CancelOrder = 'CancelOrder',
		ReOpenOrder = 'ReOpenOrder',
	}

	export type Context = {
		reservation?: ReservationResponse
		tables?: TableResponse[]
		order?: OrderResponse
	}

	export function getTableState(context: Context): DashboardTableView.TableStateEnum {
		return context.order
			? DashboardTableView.TableStateEnum.taken
			: context.reservation
				? // eslint-disable-next-line unicorn-x/no-nested-ternary
					context.reservation.state === ReservationResponse.StateEnum.approved
					? DashboardTableView.TableStateEnum.approved
					: DashboardTableView.TableStateEnum.unconfirmed
				: DashboardTableView.TableStateEnum.free
	}

	export const DefaultTransitions: StateMachine.Transition<Action, State>[] = [
		// Unconfirmed reservations
		{
			title: 'Confirm',
			from: ReservationResponse.StateEnum.unconfirmed,
			to: ReservationResponse.StateEnum.approved,
			actions: [Action.ConfirmReservation],
		},
		{
			title: 'Reject',
			from: ReservationResponse.StateEnum.unconfirmed,
			to: ReservationResponse.StateEnum.rejected,
			actions: [Action.RejectReservation],
		},
		// Approved reservations
		{
			title: 'Unconfirm',
			from: ReservationResponse.StateEnum.approved,
			to: ReservationResponse.StateEnum.unconfirmed,
			actions: [Action.UnConfirmReservation],
		},
		{
			title: 'Check In',
			from: ReservationResponse.StateEnum.approved,
			to: ReservationResponse.StateEnum.seated,
			actions: [Action.Checkin],
		},
		{
			title: 'Reject',
			from: ReservationResponse.StateEnum.approved,
			to: ReservationResponse.StateEnum.rejected,
			actions: [Action.RejectReservation],
		},
		// Rejected reservations
		{
			title: 'Unconfirm',
			from: ReservationResponse.StateEnum.rejected,
			to: ReservationResponse.StateEnum.unconfirmed,
			actions: [Action.UnConfirmReservation],
		},
		{
			title: 'Confirm',
			from: ReservationResponse.StateEnum.rejected,
			to: ReservationResponse.StateEnum.approved,
			actions: [Action.ConfirmReservation],
		},
		// Checkedin reservations
		{
			title: 'Cancel Order',
			from: ReservationResponse.StateEnum.seated,
			to: ReservationResponse.StateEnum.unconfirmed,
			actions: [Action.UnConfirmReservation, Action.CancelOrder],
		},
		{
			title: 'Check Out',
			from: ReservationResponse.StateEnum.seated,
			to: ReservationResponse.StateEnum.done,
			actions: [Action.Checkout],
		},
		// Checkedout reservations
		{
			title: 'Undo Checkout',
			from: ReservationResponse.StateEnum.done,
			to: ReservationResponse.StateEnum.seated,
			actions: [Action.ReOpenOrder],
		},
		// Free tables
		{
			title: 'Direct Checkin',
			from: DashboardTableView.TableStateEnum.free,
			to: DashboardTableView.TableStateEnum.taken,
			actions: [Action.Checkin],
		},
		// Checkedin tables
		{
			title: 'Check Out',
			from: DashboardTableView.TableStateEnum.taken,
			to: DashboardTableView.TableStateEnum.free,
			actions: [Action.Checkout],
		},
	]
}
