-- AlterTable
ALTER TABLE `permission` MODIFY `key` ENUM('READ', 'WRITE', 'ADMIN', 'USERS_READ', 'USERS_WRITE', 'USERS_BAN', 'USERS_UNBAN', 'USERS_DISABLE', 'USERS_ENABLE', 'USERS_KYC_VERIFY', 'USERS_RESET_PASSWORD', 'WALLETS_READ', 'WALLETS_WRITE', 'WALLETS_FREEZE', 'WALLETS_UNFREEZE', 'WALLETS_ADJUST_BALANCE', 'ORDERS_READ', 'ORDERS_CANCEL', 'ORDERS_RESOLVE_DISPUTE', 'ORDERS_RELEASE_FUNDS', 'REPORTS_READ', 'REPORTS_EXPORT', 'ANALYTICS_READ', 'SUPPORT_READ', 'SUPPORT_WRITE', 'SUPPORT_ASSIGN', 'SUPPORT_CLOSE', 'ANNOUNCEMENTS_READ', 'ANNOUNCEMENTS_WRITE', 'ANNOUNCEMENTS_DELETE', 'ROLES_READ', 'ROLES_WRITE', 'PERMISSIONS_READ', 'PERMISSIONS_WRITE', 'LOGS_READ', 'LOGS_DELETE', 'LOGS_EXPORT', 'LOGS_ARCHIVE', 'SYSTEM_READ', 'SYSTEM_WRITE', 'REFERRAL_READ', 'REFERRAL_WRITE', 'COMMISSION_READ', 'COMMISSION_WRITE', 'RULES_READ', 'RULES_WRITE', 'WITHDRAWAL_RULES_READ', 'WITHDRAWAL_RULES_WRITE', 'DEPOSIT_RULES_READ', 'DEPOSIT_RULES_WRITE', 'TRADING_RULES_READ', 'TRADING_RULES_WRITE', 'SECURITY_ALERTS_READ', 'SECURITY_ALERTS_WRITE', 'SECURITY_ALERTS_RESOLVE', 'APPROVAL_REQUESTS_READ', 'APPROVAL_REQUESTS_APPROVE', 'APPROVAL_REQUESTS_REJECT', 'FEATURE_FLAGS_READ', 'FEATURE_FLAGS_WRITE', 'EMERGENCY_CONTROLS_READ', 'EMERGENCY_CONTROLS_WRITE', 'SYSTEM_HEALTH_READ') NOT NULL;

-- CreateTable
CREATE TABLE `ReferralRequirementRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `requiredReferralCount` INTEGER NOT NULL DEFAULT 7,
    `requiredDays` INTEGER NOT NULL DEFAULT 7,
    `gracePeriodDays` INTEGER NOT NULL DEFAULT 3,
    `restrictedWithdrawals` BOOLEAN NOT NULL DEFAULT true,
    `restrictedTransfers` BOOLEAN NOT NULL DEFAULT true,
    `restrictedPurchases` BOOLEAN NOT NULL DEFAULT false,
    `restrictedOrders` BOOLEAN NOT NULL DEFAULT false,
    `applicableUserType` VARCHAR(191) NULL,
    `startAt` DATETIME(3) NULL,
    `endAt` DATETIME(3) NULL,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `ReferralRequirementRule_status_idx`(`status`),
    INDEX `ReferralRequirementRule_isActive_idx`(`isActive`),
    INDEX `ReferralRequirementRule_startAt_endAt_idx`(`startAt`, `endAt`),
    INDEX `ReferralRequirementRule_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `UserReferralStatus` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `ruleId` VARCHAR(191) NOT NULL,
    `status` ENUM('NOT_STARTED', 'IN_PROGRESS', 'QUALIFIED', 'DEADLINE_REACHED', 'RESTRICTED', 'COMPLETED', 'EXEMPT') NOT NULL DEFAULT 'NOT_STARTED',
    `referralCount` INTEGER NOT NULL DEFAULT 0,
    `qualifiedAt` DATETIME(3) NULL,
    `deadlineAt` DATETIME(3) NULL,
    `restrictedAt` DATETIME(3) NULL,
    `completedAt` DATETIME(3) NULL,

    INDEX `UserReferralStatus_userId_idx`(`userId`),
    INDEX `UserReferralStatus_ruleId_idx`(`ruleId`),
    UNIQUE INDEX `UserReferralStatus_userId_ruleId_key`(`userId`, `ruleId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PurchaseRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `baseAmount` DECIMAL(30, 10) NOT NULL,
    `incrementAmount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `minAmount` DECIMAL(30, 10) NULL,
    `maxAmount` DECIMAL(30, 10) NULL,
    `applicableUserIds` JSON NULL,
    `applicableAssets` JSON NULL,
    `applicableOrderTypes` JSON NULL,
    `startAt` DATETIME(3) NULL,
    `endAt` DATETIME(3) NULL,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `PurchaseRule_status_idx`(`status`),
    INDEX `PurchaseRule_isActive_idx`(`isActive`),
    INDEX `PurchaseRule_startAt_endAt_idx`(`startAt`, `endAt`),
    INDEX `PurchaseRule_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PurchaseSequence` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `ruleId` VARCHAR(191) NOT NULL,
    `purchaseSequence` INTEGER NOT NULL DEFAULT 1,
    `previousPurchaseAmount` DECIMAL(30, 10) NOT NULL,
    `requiredNextAmount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `completedAt` DATETIME(3) NULL,

    INDEX `PurchaseSequence_userId_idx`(`userId`),
    INDEX `PurchaseSequence_ruleId_idx`(`ruleId`),
    UNIQUE INDEX `PurchaseSequence_userId_ruleId_key`(`userId`, `ruleId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `WithdrawalRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `minAmount` DECIMAL(30, 10) NOT NULL,
    `maxAmount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `dailyLimit` DECIMAL(30, 10) NULL,
    `weeklyLimit` DECIMAL(30, 10) NULL,
    `monthlyLimit` DECIMAL(30, 10) NULL,
    `minAccountAgeDays` INTEGER NULL,
    `requiredKycStatus` VARCHAR(191) NULL,
    `restrictedReferralStatus` BOOLEAN NOT NULL DEFAULT false,
    `restrictedReferralRuleId` VARCHAR(191) NULL,
    `walletFreezeOnViolation` BOOLEAN NOT NULL DEFAULT false,
    `manualReviewThreshold` DECIMAL(30, 10) NULL,
    `applicableUserIds` JSON NULL,
    `applicableCountries` JSON NULL,
    `startAt` DATETIME(3) NULL,
    `endAt` DATETIME(3) NULL,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `WithdrawalRule_status_idx`(`status`),
    INDEX `WithdrawalRule_isActive_idx`(`isActive`),
    INDEX `WithdrawalRule_startAt_endAt_idx`(`startAt`, `endAt`),
    INDEX `WithdrawalRule_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `DepositRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `minAmount` DECIMAL(30, 10) NOT NULL,
    `maxAmount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `dailyLimit` DECIMAL(30, 10) NULL,
    `monthlyLimit` DECIMAL(30, 10) NULL,
    `allowedCurrencies` JSON NULL,
    `allowedMethods` JSON NULL,
    `requiresKyc` BOOLEAN NOT NULL DEFAULT false,
    `requiresVerification` BOOLEAN NOT NULL DEFAULT false,
    `applicableUserIds` JSON NULL,
    `applicableCountries` JSON NULL,
    `startAt` DATETIME(3) NULL,
    `endAt` DATETIME(3) NULL,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `DepositRule_status_idx`(`status`),
    INDEX `DepositRule_isActive_idx`(`isActive`),
    INDEX `DepositRule_startAt_endAt_idx`(`startAt`, `endAt`),
    INDEX `DepositRule_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `TradingRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `minOrderAmount` DECIMAL(30, 10) NOT NULL,
    `maxOrderAmount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `maxDailyOrders` INTEGER NULL,
    `maxDailyVolume` DECIMAL(30, 10) NULL,
    `minPrice` DECIMAL(30, 10) NULL,
    `maxPrice` DECIMAL(30, 10) NULL,
    `allowedAssets` JSON NULL,
    `buyEnabled` BOOLEAN NOT NULL DEFAULT true,
    `sellEnabled` BOOLEAN NOT NULL DEFAULT true,
    `orderMatchingEnabled` BOOLEAN NOT NULL DEFAULT true,
    `applicableUserIds` JSON NULL,
    `applicableOrderTypes` JSON NULL,
    `startAt` DATETIME(3) NULL,
    `endAt` DATETIME(3) NULL,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `TradingRule_status_idx`(`status`),
    INDEX `TradingRule_isActive_idx`(`isActive`),
    INDEX `TradingRule_startAt_endAt_idx`(`startAt`, `endAt`),
    INDEX `TradingRule_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SecurityAlert` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `alertId` VARCHAR(64) NOT NULL,
    `alertType` ENUM('BALANCE_ANOMALY', 'UNUSUAL_DEPOSIT', 'UNEXPECTED_MANUAL_ADJUSTMENT', 'LARGE_TRANSACTION', 'RAPID_TRANSACTIONS', 'MULTIPLE_ACCOUNTS', 'UNUSUAL_REFERRAL_ACTIVITY', 'WITHDRAWAL_AFTER_DEPOSIT', 'INACTIVITY_SURGE', 'REPEATED_FAILED_TRANSACTIONS', 'ADMIN_ACTION_LIMIT', 'SYSTEM_ANOMALY') NOT NULL,
    `severity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'MEDIUM',
    `status` ENUM('OPEN', 'INVESTIGATING', 'RESOLVED', 'FALSE_POSITIVE', 'ESCALATED') NOT NULL DEFAULT 'OPEN',
    `userId` VARCHAR(191) NULL,
    `walletId` VARCHAR(191) NULL,
    `orderId` VARCHAR(191) NULL,
    `transactionId` VARCHAR(191) NULL,
    `tradeId` VARCHAR(191) NULL,
    `title` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NOT NULL,
    `details` JSON NULL,
    `riskScore` INTEGER NULL,
    `assignedToId` VARCHAR(191) NULL,
    `assignedToUserId` VARCHAR(191) NULL,
    `resolvedAt` DATETIME(3) NULL,
    `resolvedById` VARCHAR(191) NULL,
    `escalatedAt` DATETIME(3) NULL,
    `escalatedById` VARCHAR(191) NULL,
    `notes` JSON NULL,

    UNIQUE INDEX `SecurityAlert_alertId_key`(`alertId`),
    INDEX `SecurityAlert_alertId_idx`(`alertId`),
    INDEX `SecurityAlert_alertType_idx`(`alertType`),
    INDEX `SecurityAlert_severity_idx`(`severity`),
    INDEX `SecurityAlert_status_idx`(`status`),
    INDEX `SecurityAlert_userId_idx`(`userId`),
    INDEX `SecurityAlert_walletId_idx`(`walletId`),
    INDEX `SecurityAlert_createdAt_idx`(`createdAt`),
    INDEX `SecurityAlert_status_severity_createdAt_idx`(`status`, `severity`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ApprovalRequest` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `requestType` ENUM('LARGE_BALANCE_ADJUSTMENT', 'WITHDRAWAL_OVERRIDE', 'WALLET_UNFREEZE_CRITICAL', 'COMMISSION_RULE_CHANGE', 'SYSTEM_SHUTDOWN', 'ADMIN_PERMISSION_CHANGE', 'SECURITY_OVERRIDE', 'LARGE_WITHDRAWAL') NOT NULL,
    `status` ENUM('PENDING', 'APPROVED', 'REJECTED', 'EXPIRED') NOT NULL DEFAULT 'PENDING',
    `requestedById` VARCHAR(191) NOT NULL,
    `approvedById` VARCHAR(191) NULL,
    `targetId` VARCHAR(191) NULL,
    `targetType` VARCHAR(191) NULL,
    `amount` DECIMAL(30, 10) NULL,
    `currency` VARCHAR(191) NULL,
    `reason` VARCHAR(191) NOT NULL,
    `details` JSON NULL,
    `expiresAt` DATETIME(3) NULL,
    `approvedAt` DATETIME(3) NULL,
    `rejectedAt` DATETIME(3) NULL,
    `rejectionReason` VARCHAR(191) NULL,

    INDEX `ApprovalRequest_requestType_idx`(`requestType`),
    INDEX `ApprovalRequest_status_idx`(`status`),
    INDEX `ApprovalRequest_requestedById_idx`(`requestedById`),
    INDEX `ApprovalRequest_approvedById_idx`(`approvedById`),
    INDEX `ApprovalRequest_createdAt_idx`(`createdAt`),
    INDEX `ApprovalRequest_status_createdAt_idx`(`status`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `ReferralRequirementRule` ADD CONSTRAINT `ReferralRequirementRule_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ReferralRequirementRule` ADD CONSTRAINT `ReferralRequirementRule_updatedById_fkey` FOREIGN KEY (`updatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `UserReferralStatus` ADD CONSTRAINT `UserReferralStatus_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `UserReferralStatus` ADD CONSTRAINT `UserReferralStatus_ruleId_fkey` FOREIGN KEY (`ruleId`) REFERENCES `ReferralRequirementRule`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `PurchaseRule` ADD CONSTRAINT `PurchaseRule_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `PurchaseRule` ADD CONSTRAINT `PurchaseRule_updatedById_fkey` FOREIGN KEY (`updatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `PurchaseSequence` ADD CONSTRAINT `PurchaseSequence_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `PurchaseSequence` ADD CONSTRAINT `PurchaseSequence_ruleId_fkey` FOREIGN KEY (`ruleId`) REFERENCES `PurchaseRule`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WithdrawalRule` ADD CONSTRAINT `WithdrawalRule_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WithdrawalRule` ADD CONSTRAINT `WithdrawalRule_updatedById_fkey` FOREIGN KEY (`updatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `DepositRule` ADD CONSTRAINT `DepositRule_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `DepositRule` ADD CONSTRAINT `DepositRule_updatedById_fkey` FOREIGN KEY (`updatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `TradingRule` ADD CONSTRAINT `TradingRule_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `TradingRule` ADD CONSTRAINT `TradingRule_updatedById_fkey` FOREIGN KEY (`updatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SecurityAlert` ADD CONSTRAINT `SecurityAlert_assignedToUserId_fkey` FOREIGN KEY (`assignedToUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SecurityAlert` ADD CONSTRAINT `SecurityAlert_resolvedById_fkey` FOREIGN KEY (`resolvedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ApprovalRequest` ADD CONSTRAINT `ApprovalRequest_requestedById_fkey` FOREIGN KEY (`requestedById`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ApprovalRequest` ADD CONSTRAINT `ApprovalRequest_approvedById_fkey` FOREIGN KEY (`approvedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

