-- =====================================================================
-- Migration: Matching Engine
-- Date: 2026-08-24
-- Description: Adds Match model, updates OrderStatus enum, adds
--              remainingQuantity to Order, and creates all indexes
--              for the production-grade matching engine.
-- =====================================================================

-- Add new enum values to OrderStatus (MySQL requires MODIFY COLUMN)
ALTER TABLE `Order` MODIFY COLUMN `status` ENUM(
  'PENDING', 'OPEN', 'MATCHED', 'PARTIALLY_MATCHED', 'PARTIALLY_FILLED',
  'PAYMENT_PENDING', 'PAYMENT_SUBMITTED', 'PAYMENT_CONFIRMED', 'MINIMUM_PENDING',
  'READY_FOR_SETTLEMENT', 'AWAITING_PAYMENT', 'COMPLETED', 'CANCELLED', 'EXPIRED',
  'DISPUTED', 'REJECTED'
) NOT NULL DEFAULT 'PENDING';

-- Add remainingQuantity column to Order
ALTER TABLE `Order` ADD COLUMN `remainingQuantity` DECIMAL(30, 10) NOT NULL DEFAULT 0 AFTER `filledAmount`;

-- Update existing orders: set remainingQuantity = quantity - filledAmount
UPDATE `Order` SET `remainingQuantity` = `quantity` - `filledAmount`;

-- Create indexes for matching engine queries
CREATE INDEX `idx_order_side_status_createdAt` ON `Order` (`side`, `status`, `createdAt`);
CREATE INDEX `idx_order_side_status_price_createdAt` ON `Order` (`side`, `status`, `price`, `createdAt`);

-- =====================================================================
-- Match Table
-- =====================================================================
CREATE TABLE `Match` (
  `id` VARCHAR(191) NOT NULL,
  `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  `updatedAt` DATETIME(3) NOT NULL,
  `buyOrderId` VARCHAR(191) NOT NULL,
  `sellOrderId` VARCHAR(191) NOT NULL,
  `buyerId` VARCHAR(191) NOT NULL,
  `sellerId` VARCHAR(191) NOT NULL,
  `matchedAmount` DECIMAL(30, 10) NOT NULL,
  `status` ENUM('MATCHED', 'PAYMENT_PENDING', 'PAYMENT_SUBMITTED', 'PAYMENT_CONFIRMED', 'MINIMUM_PENDING', 'READY_FOR_SETTLEMENT', 'SETTLED', 'CANCELLED', 'DISPUTED', 'REJECTED') NOT NULL DEFAULT 'MATCHED',
  `paymentStatus` ENUM('PENDING', 'SUBMITTED', 'CONFIRMED', 'DISPUTED', 'EXPIRED') NOT NULL DEFAULT 'PENDING',
  `buyerConfirmed` BOOLEAN NOT NULL DEFAULT FALSE,
  `sellerConfirmed` BOOLEAN NOT NULL DEFAULT FALSE,
  `minimumMet` BOOLEAN NOT NULL DEFAULT FALSE,
  `settledAt` DATETIME(3) NULL,
  `metadata` JSON NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_match_buyOrderId` (`buyOrderId`),
  INDEX `idx_match_sellOrderId` (`sellOrderId`),
  INDEX `idx_match_buyerId` (`buyerId`),
  INDEX `idx_match_sellerId` (`sellerId`),
  INDEX `idx_match_status` (`status`),
  INDEX `idx_match_createdAt` (`createdAt`),
  INDEX `idx_match_buyOrderId_status` (`buyOrderId`, `status`),
  INDEX `idx_match_sellOrderId_status` (`sellOrderId`, `status`),
  INDEX `idx_match_minimumMet` (`minimumMet`),
  CONSTRAINT `fk_match_buyOrder` FOREIGN KEY (`buyOrderId`) REFERENCES `Order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_match_sellOrder` FOREIGN KEY (`sellOrderId`) REFERENCES `Order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
