/**
 * Canonical enum value lists shared by the database schema (pgEnum), the API
 * validation layer (zod) and the web apps. Single source of truth: change here.
 */

export const TENANT_STATUS = ['TRIAL', 'ACTIVE', 'SUSPENDED', 'CLOSED'] as const;
export const SUBSCRIPTION_STATUS = ['TRIAL', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'EXPIRED'] as const;
export const USER_STATUS = ['ACTIVE', 'INVITED', 'DISABLED'] as const;
export const ACTIVE_STATUS = ['ACTIVE', 'INACTIVE'] as const;
export const ACTOR_TYPE = ['USER', 'API_KEY', 'SYSTEM', 'PLATFORM_ADMIN'] as const;

export const ZONE_TYPE = [
  'STORAGE', 'PICK', 'RECEIVING_DOCK', 'SHIPPING_DOCK', 'STAGING', 'QC', 'QUARANTINE',
  'DAMAGED', 'RETURNS', 'PACKING', 'CROSS_DOCK', 'YARD',
] as const;
export const TEMPERATURE_CLASS = ['AMBIENT', 'AIR_CONDITIONED', 'CHILLED', 'FROZEN', 'DEEP_FROZEN', 'HAZMAT'] as const;
export const LOCATION_TYPE = ['PALLET_RACK', 'SHELF', 'FLOOR', 'BULK', 'BIN', 'DOCK', 'STAGE', 'PACK_STATION', 'VIRTUAL'] as const;
export const LOCATION_USAGE = ['RESERVE', 'PICK', 'DOCK', 'STAGING', 'QC', 'QUARANTINE', 'DAMAGED', 'RETURNS', 'PACKING', 'CROSS_DOCK'] as const;
export const LOCATION_STATUS = ['ACTIVE', 'BLOCKED', 'COUNTING', 'INACTIVE'] as const;
export const ROTATION_RULE = ['FIFO', 'FEFO', 'LIFO', 'FMFO'] as const;
export const STORAGE_CONDITION = ['AMBIENT', 'AIR_CONDITIONED', 'CHILLED', 'FROZEN', 'DEEP_FROZEN', 'HAZMAT'] as const;
export const PACK_LEVEL = ['EACH', 'INNER', 'CASE', 'PALLET'] as const;
export const PUTAWAY_STRATEGY = ['FIXED_LOCATION', 'SAME_SKU', 'EMPTY_LOCATION', 'ZONE_SEQUENCE', 'NEAREST_TO_DOCK'] as const;
export const REASON_CODE_TYPE = ['ADJUSTMENT', 'DAMAGE', 'HOLD', 'RETURN', 'CANCELLATION', 'COUNT_VARIANCE', 'SHORT_PICK', 'REJECTION', 'VAS'] as const;

export const ASN_TYPE = ['PURCHASE', 'RETURN', 'TRANSFER_IN', 'CROSS_DOCK'] as const;
export const ASN_STATUS = ['DRAFT', 'EXPECTED', 'SCHEDULED', 'ARRIVED', 'RECEIVING', 'RECEIVED', 'CLOSED', 'CANCELLED'] as const;
export const DOC_SOURCE = ['MANUAL', 'API', 'IMPORT', 'AI', 'SYSTEM'] as const;
export const LINE_STATUS = ['OPEN', 'PARTIAL', 'COMPLETE', 'CANCELLED'] as const;
export const DOCK_APPOINTMENT_STATUS = ['BOOKED', 'CONFIRMED', 'ARRIVED', 'IN_PROGRESS', 'COMPLETED', 'NO_SHOW', 'CANCELLED'] as const;
export const ITEM_CONDITION = ['GOOD', 'DAMAGED', 'REJECTED'] as const;
export const DISCREPANCY_TYPE = ['OVER', 'SHORT', 'DAMAGED', 'UNEXPECTED_SKU', 'LOT_MISMATCH', 'EXPIRY_MISMATCH', 'SHELF_LIFE_BELOW_MIN'] as const;
export const DISCREPANCY_STATUS = ['OPEN', 'REPORTED', 'ACKNOWLEDGED', 'RESOLVED'] as const;

export const LPN_TYPE = ['PALLET', 'CASE', 'TOTE', 'CAGE', 'CONTAINER'] as const;
export const LPN_STATUS = ['ACTIVE', 'EMPTY', 'SHIPPED', 'CONSUMED'] as const;
export const INVENTORY_STATUS = ['AVAILABLE', 'QUARANTINE', 'DAMAGED', 'HOLD', 'EXPIRED', 'QC_PENDING', 'IN_TRANSIT', 'RESERVED'] as const;
export const MOVEMENT_TYPE = [
  'RECEIPT', 'RECEIPT_REVERSAL', 'PUTAWAY', 'MOVE', 'REPLENISH', 'PICK', 'UNPICK', 'PACK', 'SHIP',
  'ADJUST_IN', 'ADJUST_OUT', 'STATUS_CHANGE', 'COUNT_ADJUST', 'RETURN_RECEIPT', 'TRANSFER_OUT', 'TRANSFER_IN', 'CONSUME',
] as const;
export const SERIAL_STATUS = ['IN_STOCK', 'ALLOCATED', 'PICKED', 'SHIPPED', 'RETURNED', 'SCRAPPED', 'MISSING'] as const;
export const HOLD_SCOPE = ['BALANCE', 'LPN', 'LOT', 'SKU', 'LOCATION'] as const;
export const APPROVAL_STATUS = ['DRAFT', 'PENDING_APPROVAL', 'APPROVED', 'REJECTED', 'POSTED', 'CANCELLED'] as const;
export const COUNT_TYPE = ['CYCLE', 'FULL', 'SPOT', 'ABC'] as const;
export const COUNT_STATUS = ['PLANNED', 'RELEASED', 'IN_PROGRESS', 'REVIEW', 'COMPLETED', 'CANCELLED'] as const;
export const COUNT_LINE_STATUS = ['PENDING', 'COUNTED', 'RECOUNT', 'APPROVED', 'VARIANCE_POSTED', 'SKIPPED'] as const;

export const TASK_TYPE = ['RECEIVE', 'PUTAWAY', 'PICK', 'REPLENISH', 'MOVE', 'COUNT', 'PACK', 'LOAD', 'QC'] as const;
export const TASK_STATUS = ['PENDING', 'ASSIGNED', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED', 'SKIPPED', 'EXCEPTION'] as const;

export const ORDER_TYPE = ['SALES', 'TRANSFER_OUT', 'RETURN_TO_VENDOR', 'SAMPLE', 'DISPOSAL'] as const;
export const ORDER_STATUS = [
  'DRAFT', 'OPEN', 'ON_HOLD', 'PARTIALLY_ALLOCATED', 'ALLOCATED', 'RELEASED', 'PICKING', 'PICKED',
  'PACKED', 'STAGED', 'LOADED', 'SHIPPED', 'CANCELLED', 'SHORT_CLOSED',
] as const;
export const ALLOCATION_STATUS = ['ALLOCATED', 'PICKED', 'CANCELLED'] as const;
export const WAVE_STATUS = ['PLANNED', 'ALLOCATING', 'ALLOCATED', 'RELEASED', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'] as const;
export const WAVE_STRATEGY = ['BY_ORDER', 'BY_ZONE', 'BATCH'] as const;
export const SHIPMENT_STATUS = ['PACKING', 'PACKED', 'STAGED', 'LOADED', 'SHIPPED', 'CANCELLED'] as const;
export const LOAD_STATUS = ['PLANNED', 'LOADING', 'LOADED', 'DISPATCHED', 'DELIVERED', 'CANCELLED'] as const;
export const RETURN_STATUS = ['REQUESTED', 'AUTHORISED', 'RECEIVING', 'RECEIVED', 'DISPOSITIONED', 'CLOSED', 'REJECTED'] as const;
export const RETURN_DISPOSITION = ['RESTOCK', 'QUARANTINE', 'SCRAP', 'RETURN_TO_VENDOR', 'REPAIR'] as const;

export const BILLING_CYCLE = ['WEEKLY', 'MONTHLY'] as const;
export const STORAGE_METHOD = [
  'WEEKLY_CBM_OPENING_PLUS_IN', 'WEEKLY_CBM_PEAK', 'DAILY_CBM', 'DAILY_PALLET', 'WEEKLY_PALLET_PEAK', 'MONTHLY_FLAT',
] as const;
export const CONTRACT_STATUS = ['DRAFT', 'ACTIVE', 'EXPIRED', 'TERMINATED'] as const;
export const TARIFF_GROUP = ['HANDLING_IN', 'HANDLING_OUT', 'STORAGE', 'VAS', 'FREIGHT', 'ADMIN', 'OTHER'] as const;
export const CHARGE_UNIT = [
  'PER_CBM', 'PER_PALLET', 'PER_CASE', 'PER_PIECE', 'PER_KG', 'PER_ORDER', 'PER_LINE', 'PER_SHIPMENT',
  'PER_CONTAINER_20', 'PER_CONTAINER_40', 'PER_TRUCK', 'PER_HOUR', 'PER_DOCUMENT',
  'PER_CBM_WEEK', 'PER_CBM_DAY', 'PER_PALLET_WEEK', 'PER_PALLET_DAY', 'FLAT_MONTHLY', 'FLAT',
] as const;
export const CHARGE_TRIGGER = ['ASN_CLOSED', 'ORDER_SHIPPED', 'STORAGE_PERIOD', 'TASK_COMPLETED', 'MANUAL'] as const;
export const CHARGE_STATUS = ['PENDING', 'INVOICED', 'WAIVED', 'DISPUTED'] as const;
export const INVOICE_STATUS = ['DRAFT', 'ISSUED', 'SENT', 'PAID', 'PARTIALLY_PAID', 'CANCELLED', 'DISPUTED'] as const;

export const CONNECTOR_TYPE = ['REST_WEBHOOK', 'SAP_IDOC', 'SFTP_CSV', 'EMAIL_INTAKE'] as const;
export const MESSAGE_DIRECTION = ['INBOUND', 'OUTBOUND'] as const;
export const MESSAGE_STATUS = ['RECEIVED', 'PROCESSING', 'PROCESSED', 'FAILED', 'DEAD'] as const;

export const AI_PROPOSAL_TYPE = [
  'ASN_FROM_DOCUMENT', 'ORDER_FROM_DOCUMENT', 'RECEIVING_ANOMALY', 'INVENTORY_ANOMALY', 'BILLING_ANOMALY',
  'SLOTTING_RECOMMENDATION', 'WORKLOAD_FORECAST', 'DISCREPANCY_EMAIL', 'NL_QUERY',
] as const;
export const AI_PROPOSAL_STATUS = ['PROPOSED', 'ACCEPTED', 'REJECTED', 'APPLIED', 'EXPIRED'] as const;

export type TenantStatus = (typeof TENANT_STATUS)[number];
export type SubscriptionStatus = (typeof SUBSCRIPTION_STATUS)[number];
export type UserStatus = (typeof USER_STATUS)[number];
export type ActiveStatus = (typeof ACTIVE_STATUS)[number];
export type ActorType = (typeof ACTOR_TYPE)[number];
export type ZoneType = (typeof ZONE_TYPE)[number];
export type TemperatureClass = (typeof TEMPERATURE_CLASS)[number];
export type LocationType = (typeof LOCATION_TYPE)[number];
export type LocationUsage = (typeof LOCATION_USAGE)[number];
export type LocationStatus = (typeof LOCATION_STATUS)[number];
export type RotationRule = (typeof ROTATION_RULE)[number];
export type StorageCondition = (typeof STORAGE_CONDITION)[number];
export type PackLevel = (typeof PACK_LEVEL)[number];
export type PutawayStrategy = (typeof PUTAWAY_STRATEGY)[number];
export type ReasonCodeType = (typeof REASON_CODE_TYPE)[number];
export type AsnType = (typeof ASN_TYPE)[number];
export type AsnStatus = (typeof ASN_STATUS)[number];
export type DocSource = (typeof DOC_SOURCE)[number];
export type LineStatus = (typeof LINE_STATUS)[number];
export type DockAppointmentStatus = (typeof DOCK_APPOINTMENT_STATUS)[number];
export type ItemCondition = (typeof ITEM_CONDITION)[number];
export type DiscrepancyType = (typeof DISCREPANCY_TYPE)[number];
export type DiscrepancyStatus = (typeof DISCREPANCY_STATUS)[number];
export type LpnType = (typeof LPN_TYPE)[number];
export type LpnStatus = (typeof LPN_STATUS)[number];
export type InventoryStatus = (typeof INVENTORY_STATUS)[number];
export type MovementType = (typeof MOVEMENT_TYPE)[number];
export type SerialStatus = (typeof SERIAL_STATUS)[number];
export type HoldScope = (typeof HOLD_SCOPE)[number];
export type ApprovalStatus = (typeof APPROVAL_STATUS)[number];
export type CountType = (typeof COUNT_TYPE)[number];
export type CountStatus = (typeof COUNT_STATUS)[number];
export type CountLineStatus = (typeof COUNT_LINE_STATUS)[number];
export type TaskType = (typeof TASK_TYPE)[number];
export type TaskStatus = (typeof TASK_STATUS)[number];
export type OrderType = (typeof ORDER_TYPE)[number];
export type OrderStatus = (typeof ORDER_STATUS)[number];
export type AllocationStatus = (typeof ALLOCATION_STATUS)[number];
export type WaveStatus = (typeof WAVE_STATUS)[number];
export type WaveStrategy = (typeof WAVE_STRATEGY)[number];
export type ShipmentStatus = (typeof SHIPMENT_STATUS)[number];
export type LoadStatus = (typeof LOAD_STATUS)[number];
export type ReturnStatus = (typeof RETURN_STATUS)[number];
export type ReturnDisposition = (typeof RETURN_DISPOSITION)[number];
export type BillingCycle = (typeof BILLING_CYCLE)[number];
export type StorageMethod = (typeof STORAGE_METHOD)[number];
export type ContractStatus = (typeof CONTRACT_STATUS)[number];
export type TariffGroup = (typeof TARIFF_GROUP)[number];
export type ChargeUnit = (typeof CHARGE_UNIT)[number];
export type ChargeTrigger = (typeof CHARGE_TRIGGER)[number];
export type ChargeStatus = (typeof CHARGE_STATUS)[number];
export type InvoiceStatus = (typeof INVOICE_STATUS)[number];
export type ConnectorType = (typeof CONNECTOR_TYPE)[number];
export type MessageDirection = (typeof MESSAGE_DIRECTION)[number];
export type MessageStatus = (typeof MESSAGE_STATUS)[number];
export type AiProposalType = (typeof AI_PROPOSAL_TYPE)[number];
export type AiProposalStatus = (typeof AI_PROPOSAL_STATUS)[number];
