-- CreateTable
CREATE TABLE `User` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `passwordHash` VARCHAR(191) NOT NULL,
    `firstName` VARCHAR(191) NULL,
    `lastName` VARCHAR(191) NULL,
    `phone` VARCHAR(191) NULL,
    `isEmailVerified` BOOLEAN NOT NULL DEFAULT false,
    `isPhoneVerified` BOOLEAN NOT NULL DEFAULT false,
    `isKycVerified` BOOLEAN NOT NULL DEFAULT false,
    `isTwoFactorEnabled` BOOLEAN NOT NULL DEFAULT false,
    `twoFactorSecret` VARCHAR(191) NULL,
    `twoFactorBackupCodes` VARCHAR(191) NULL,
    `authProvider` ENUM('LOCAL', 'GOOGLE', 'GITHUB') NOT NULL DEFAULT 'LOCAL',
    `lastLoginAt` DATETIME(3) NULL,
    `lastLoginIp` VARCHAR(191) NULL,
    `profilePictureUrl` VARCHAR(191) NULL,
    `isBanned` BOOLEAN NOT NULL DEFAULT false,
    `bannedAt` DATETIME(3) NULL,
    `isDisabled` BOOLEAN NOT NULL DEFAULT false,
    `disabledAt` DATETIME(3) NULL,
    `roleId` VARCHAR(191) NULL,
    `referrerId` VARCHAR(191) NULL,

    UNIQUE INDEX `User_email_key`(`email`),
    INDEX `User_roleId_idx`(`roleId`),
    INDEX `User_email_idx`(`email`),
    INDEX `User_isBanned_idx`(`isBanned`),
    INDEX `User_isDisabled_idx`(`isDisabled`),
    INDEX `User_isKycVerified_idx`(`isKycVerified`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Role` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` ENUM('USER', 'ADMIN', 'SUPER_ADMIN', 'SUPPORT_AGENT', 'MODERATOR', 'ANALYST') NOT NULL,
    `description` VARCHAR(191) NULL,
    `isSystem` BOOLEAN NOT NULL DEFAULT false,

    UNIQUE INDEX `Role_name_key`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Permission` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `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') NOT NULL,
    `name` VARCHAR(191) NULL,
    `description` VARCHAR(191) NULL,
    `module` VARCHAR(191) NULL,

    UNIQUE INDEX `Permission_key_key`(`key`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `RolePermission` (
    `roleId` VARCHAR(191) NOT NULL,
    `permissionId` VARCHAR(191) NOT NULL,

    PRIMARY KEY (`roleId`, `permissionId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Session` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `status` ENUM('ACTIVE', 'REVOKED') NOT NULL DEFAULT 'ACTIVE',
    `refreshToken` VARCHAR(191) NOT NULL,
    `deviceId` VARCHAR(191) NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `lastActivity` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `expiresAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Session_refreshToken_key`(`refreshToken`),
    INDEX `Session_userId_idx`(`userId`),
    INDEX `Session_status_idx`(`status`),
    INDEX `Session_refreshToken_idx`(`refreshToken`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `RefreshToken` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `token` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `deviceId` VARCHAR(191) NULL,
    `isRevoked` BOOLEAN NOT NULL DEFAULT false,
    `expiresAt` DATETIME(3) NOT NULL,
    `revokedAt` DATETIME(3) NULL,

    UNIQUE INDEX `RefreshToken_token_key`(`token`),
    INDEX `RefreshToken_token_idx`(`token`),
    INDEX `RefreshToken_userId_idx`(`userId`),
    INDEX `RefreshToken_expiresAt_idx`(`expiresAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `EmailVerificationToken` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `token` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `expiresAt` DATETIME(3) NOT NULL,
    `usedAt` DATETIME(3) NULL,
    `isUsed` BOOLEAN NOT NULL DEFAULT false,
    `isRevoked` BOOLEAN NOT NULL DEFAULT false,

    UNIQUE INDEX `EmailVerificationToken_token_key`(`token`),
    INDEX `EmailVerificationToken_token_idx`(`token`),
    INDEX `EmailVerificationToken_userId_idx`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PasswordResetToken` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `token` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `expiresAt` DATETIME(3) NOT NULL,
    `usedAt` DATETIME(3) NULL,
    `isUsed` BOOLEAN NOT NULL DEFAULT false,
    `isRevoked` BOOLEAN NOT NULL DEFAULT false,

    UNIQUE INDEX `PasswordResetToken_token_key`(`token`),
    INDEX `PasswordResetToken_token_idx`(`token`),
    INDEX `PasswordResetToken_userId_idx`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `OTP` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `code` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `identifier` VARCHAR(191) NOT NULL DEFAULT '',
    `type` VARCHAR(191) NOT NULL DEFAULT 'GENERAL',
    `isUsed` BOOLEAN NOT NULL DEFAULT false,
    `usedAt` DATETIME(3) NULL,
    `attempts` INTEGER NOT NULL DEFAULT 0,
    `maxAttempts` INTEGER NOT NULL DEFAULT 5,
    `expiresAt` DATETIME(3) NOT NULL,
    `metadata` JSON NULL,

    INDEX `OTP_userId_type_idx`(`userId`, `type`),
    INDEX `OTP_code_type_idx`(`code`, `type`),
    INDEX `OTP_expiresAt_idx`(`expiresAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `LoginHistory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `userId` VARCHAR(191) NOT NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `deviceId` VARCHAR(191) NULL,
    `loginMethod` ENUM('PASSWORD', 'OTP', 'TWO_FA', 'SOCIAL') NOT NULL DEFAULT 'PASSWORD',
    `isSuccess` BOOLEAN NOT NULL DEFAULT true,
    `failureReason` VARCHAR(191) NULL,
    `location` JSON NULL,
    `metadata` JSON NULL,

    INDEX `LoginHistory_userId_idx`(`userId`),
    INDEX `LoginHistory_createdAt_idx`(`createdAt`),
    INDEX `LoginHistory_userId_createdAt_idx`(`userId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Device` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `deviceName` VARCHAR(191) NULL,
    `deviceType` VARCHAR(191) NULL,
    `operatingSystem` VARCHAR(191) NULL,
    `browser` VARCHAR(191) NULL,
    `ipAddress` VARCHAR(191) NULL,
    `fingerprint` VARCHAR(191) NULL,
    `isTrusted` BOOLEAN NOT NULL DEFAULT false,
    `lastUsedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `isActive` BOOLEAN NOT NULL DEFAULT true,

    INDEX `Device_userId_idx`(`userId`),
    INDEX `Device_fingerprint_idx`(`fingerprint`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `userId` VARCHAR(191) NULL,
    `email` VARCHAR(191) NULL,
    `role` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `resource` VARCHAR(191) NULL,
    `resourceId` VARCHAR(191) NULL,
    `entity` VARCHAR(191) NULL,
    `entityId` VARCHAR(191) NULL,
    `oldValue` JSON NULL,
    `newValue` JSON NULL,
    `result` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,

    INDEX `AuditLog_userId_idx`(`userId`),
    INDEX `AuditLog_role_idx`(`role`),
    INDEX `AuditLog_action_idx`(`action`),
    INDEX `AuditLog_result_idx`(`result`),
    INDEX `AuditLog_createdAt_idx`(`createdAt`),
    INDEX `AuditLog_resource_resourceId_idx`(`resource`, `resourceId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SecurityLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `eventType` ENUM('LOGIN_SUCCESS', 'LOGIN_FAILED', 'LOGIN_BLOCKED', 'LOGOUT', 'REGISTER', 'PASSWORD_CHANGE', 'PASSWORD_RESET', 'TOKEN_REFRESH', 'TOKEN_REUSE_DETECTED', 'RATE_LIMIT_EXCEEDED', 'CSRF_VIOLATION', 'XSS_BLOCKED', 'SQL_INJECTION_BLOCKED', 'INVALID_INPUT', 'FORBIDDEN_ACCESS', 'BRUTE_FORCE_DETECTED', 'ACCOUNT_LOCKED', 'ADMIN_ACTION', 'WALLET_ACTION', 'TRADE_ACTION', 'ORDER_ACTION', 'REFERRAL_ACTION', 'COMMISSION_ACTION', 'KYC_ACTION', 'SETTINGS_CHANGE', 'SYSTEM_EVENT') NOT NULL,
    `severity` ENUM('INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'INFO',
    `userId` VARCHAR(191) NULL,
    `email` VARCHAR(191) NULL,
    `role` VARCHAR(191) NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `path` VARCHAR(191) NULL,
    `method` VARCHAR(191) NULL,
    `isBlocked` BOOLEAN NOT NULL DEFAULT false,
    `details` JSON NULL,

    INDEX `SecurityLog_eventType_idx`(`eventType`),
    INDEX `SecurityLog_severity_idx`(`severity`),
    INDEX `SecurityLog_userId_idx`(`userId`),
    INDEX `SecurityLog_ipAddress_idx`(`ipAddress`),
    INDEX `SecurityLog_isBlocked_idx`(`isBlocked`),
    INDEX `SecurityLog_createdAt_idx`(`createdAt`),
    INDEX `SecurityLog_ipAddress_createdAt_idx`(`ipAddress`, `createdAt`),
    INDEX `SecurityLog_userId_createdAt_idx`(`userId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Wallet` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `balance` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,
    `locked` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,
    `isFrozen` BOOLEAN NOT NULL DEFAULT false,
    `frozenAt` DATETIME(3) NULL,

    UNIQUE INDEX `Wallet_userId_key`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `WalletFreezeHistory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `walletId` VARCHAR(191) NOT NULL,
    `frozenByUserId` VARCHAR(191) NOT NULL,
    `reason` ENUM('SUSPICIOUS_ACTIVITY', 'UNDER_INVESTIGATION', 'COURT_ORDER', 'SECURITY_BREACH', 'USER_REQUEST', 'COMPLIANCE_REVIEW', 'OTHER') NOT NULL,
    `reasonText` VARCHAR(191) NULL,
    `unfrozenAt` DATETIME(3) NULL,
    `unfrozenByUserId` VARCHAR(191) NULL,
    `unfreezeReason` VARCHAR(191) NULL,

    INDEX `WalletFreezeHistory_walletId_idx`(`walletId`),
    INDEX `WalletFreezeHistory_frozenByUserId_idx`(`frozenByUserId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Transaction` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `walletId` VARCHAR(191) NOT NULL,
    `type` ENUM('DEPOSIT', 'WITHDRAWAL', 'TRANSFER', 'ORDER_FILL', 'COMMISSION', 'ADMIN_ADJUSTMENT') NOT NULL,
    `amount` DECIMAL(30, 10) NOT NULL,
    `balanceBefore` DECIMAL(30, 10) NULL,
    `balanceAfter` DECIMAL(30, 10) NULL,
    `orderId` VARCHAR(191) NULL,
    `description` VARCHAR(191) NULL,
    `referenceId` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `Transaction_walletId_idx`(`walletId`),
    INDEX `Transaction_createdAt_idx`(`createdAt`),
    INDEX `Transaction_type_idx`(`type`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Order` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `walletId` VARCHAR(191) NOT NULL,
    `status` ENUM('PENDING', 'OPEN', 'MATCHED', 'PARTIALLY_FILLED', 'AWAITING_PAYMENT', 'COMPLETED', 'CANCELLED', 'EXPIRED', 'DISPUTED') NOT NULL DEFAULT 'PENDING',
    `side` ENUM('BUY', 'SELL') NOT NULL DEFAULT 'BUY',
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `price` DECIMAL(30, 10) NOT NULL,
    `quantity` DECIMAL(30, 10) NOT NULL,
    `filledAmount` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,
    `expiresAt` DATETIME(3) NULL,
    `isFrozen` BOOLEAN NOT NULL DEFAULT false,
    `userId` VARCHAR(191) NOT NULL,

    INDEX `Order_userId_idx`(`userId`),
    INDEX `Order_status_idx`(`status`),
    INDEX `Order_currency_idx`(`currency`),
    INDEX `Order_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Trade` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `orderId` VARCHAR(191) NOT NULL,
    `counterOrderId` VARCHAR(191) NULL,
    `buyerId` VARCHAR(191) NOT NULL,
    `sellerId` VARCHAR(191) NOT NULL,
    `currency` VARCHAR(191) NOT NULL,
    `price` DECIMAL(30, 10) NOT NULL,
    `quantity` DECIMAL(30, 10) NOT NULL,
    `status` ENUM('PENDING', 'LOCKED', 'IN_PROGRESS', 'COMPLETED', 'FAILED', 'CANCELLED', 'DISPUTED') NOT NULL DEFAULT 'PENDING',

    INDEX `Trade_buyerId_idx`(`buyerId`),
    INDEX `Trade_sellerId_idx`(`sellerId`),
    INDEX `Trade_status_idx`(`status`),
    INDEX `Trade_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `TradeHistory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `tradeId` VARCHAR(191) NOT NULL,
    `event` VARCHAR(191) NOT NULL,
    `details` VARCHAR(191) NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Escrow` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `tradeId` VARCHAR(191) NOT NULL,
    `amount` DECIMAL(30, 10) NOT NULL,
    `status` ENUM('LOCKED', 'RELEASED', 'FAILED') NOT NULL DEFAULT 'LOCKED',

    UNIQUE INDEX `Escrow_tradeId_key`(`tradeId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `OrderLock` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `tradeId` VARCHAR(191) NOT NULL,
    `orderId` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `amount` DECIMAL(30, 10) NOT NULL,
    `status` ENUM('LOCKED', 'RELEASED') NOT NULL DEFAULT 'LOCKED',

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `OrderAuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `orderId` VARCHAR(191) NOT NULL,
    `actorUserId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `details` VARCHAR(191) NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `TradeAuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `tradeId` VARCHAR(191) NOT NULL,
    `actorUserId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `details` VARCHAR(191) NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ReferralCommissionRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `percentage` DECIMAL(5, 4) NOT NULL,
    `description` VARCHAR(191) NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,

    UNIQUE INDEX `ReferralCommissionRule_name_key`(`name`),
    INDEX `ReferralCommissionRule_isActive_idx`(`isActive`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ReferralCode` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `code` VARCHAR(191) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `status` ENUM('ACTIVE', 'DISABLED') NOT NULL DEFAULT 'ACTIVE',

    UNIQUE INDEX `ReferralCode_code_key`(`code`),
    UNIQUE INDEX `ReferralCode_userId_key`(`userId`),
    INDEX `ReferralCode_code_idx`(`code`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Referral` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `referrerId` VARCHAR(191) NOT NULL,
    `referredId` VARCHAR(191) NOT NULL,
    `referralCodeId` VARCHAR(191) NOT NULL,

    UNIQUE INDEX `Referral_referredId_key`(`referredId`),
    INDEX `Referral_referrerId_idx`(`referrerId`),
    INDEX `Referral_referredId_idx`(`referredId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ReferralIncome` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `totalIncome` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,
    `pendingIncome` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,
    `paidIncome` DECIMAL(30, 10) NOT NULL DEFAULT 0.0,

    UNIQUE INDEX `ReferralIncome_userId_key`(`userId`),
    INDEX `ReferralIncome_userId_idx`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ReferralTransaction` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `referrerId` VARCHAR(191) NOT NULL,
    `referralId` VARCHAR(191) NOT NULL,
    `tradeId` VARCHAR(191) NULL,
    `commissionAmount` DECIMAL(30, 10) NOT NULL,
    `commissionRuleId` VARCHAR(191) NOT NULL,
    `status` ENUM('PENDING', 'PAID', 'FAILED') NOT NULL DEFAULT 'PENDING',
    `paidAt` DATETIME(3) NULL,

    INDEX `ReferralTransaction_referrerId_idx`(`referrerId`),
    INDEX `ReferralTransaction_referralId_idx`(`referralId`),
    INDEX `ReferralTransaction_status_idx`(`status`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ReferralAuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `adminUserId` VARCHAR(191) NULL,
    `targetUserId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `details` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,

    INDEX `ReferralAuditLog_adminUserId_idx`(`adminUserId`),
    INDEX `ReferralAuditLog_targetUserId_idx`(`targetUserId`),
    INDEX `ReferralAuditLog_action_idx`(`action`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Notification` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `type` ENUM('WALLET', 'ORDERS', 'TRADES', 'REFERRAL', 'COMMISSION', 'SECURITY', 'SUPPORT', 'ANNOUNCEMENTS', 'PROMOTIONS', 'SYSTEM') NOT NULL,
    `priority` ENUM('LOW', 'NORMAL', 'HIGH', 'URGENT') NOT NULL DEFAULT 'NORMAL',
    `channel` ENUM('IN_APP', 'EMAIL', 'SMS', 'PUSH') NOT NULL DEFAULT 'IN_APP',
    `title` VARCHAR(191) NOT NULL,
    `body` VARCHAR(191) NOT NULL,
    `data` JSON NULL,
    `isRead` BOOLEAN NOT NULL DEFAULT false,
    `readAt` DATETIME(3) NULL,
    `announcementId` VARCHAR(191) NULL,
    `referenceType` VARCHAR(191) NULL,
    `referenceId` VARCHAR(191) NULL,
    `deliveredAt` DATETIME(3) NULL,
    `expiresAt` DATETIME(3) NULL,

    INDEX `Notification_userId_idx`(`userId`),
    INDEX `Notification_userId_isRead_idx`(`userId`, `isRead`),
    INDEX `Notification_userId_type_idx`(`userId`, `type`),
    INDEX `Notification_userId_createdAt_idx`(`userId`, `createdAt`),
    INDEX `Notification_referenceType_referenceId_idx`(`referenceType`, `referenceId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationTemplate` (
    `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,
    `type` ENUM('WALLET', 'ORDERS', 'TRADES', 'REFERRAL', 'COMMISSION', 'SECURITY', 'SUPPORT', 'ANNOUNCEMENTS', 'PROMOTIONS', 'SYSTEM') NOT NULL,
    `channel` ENUM('IN_APP', 'EMAIL', 'SMS', 'PUSH') NOT NULL DEFAULT 'IN_APP',
    `priority` ENUM('LOW', 'NORMAL', 'HIGH', 'URGENT') NOT NULL DEFAULT 'NORMAL',
    `title` VARCHAR(191) NOT NULL,
    `body` VARCHAR(191) NOT NULL,
    `variables` JSON NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'ARCHIVED') NOT NULL DEFAULT 'ACTIVE',

    UNIQUE INDEX `NotificationTemplate_name_key`(`name`),
    INDEX `NotificationTemplate_type_idx`(`type`),
    INDEX `NotificationTemplate_status_idx`(`status`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationSetting` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `walletNotifications` BOOLEAN NOT NULL DEFAULT true,
    `orderNotifications` BOOLEAN NOT NULL DEFAULT true,
    `tradeNotifications` BOOLEAN NOT NULL DEFAULT true,
    `referralNotifications` BOOLEAN NOT NULL DEFAULT true,
    `commissionNotifications` BOOLEAN NOT NULL DEFAULT true,
    `securityNotifications` BOOLEAN NOT NULL DEFAULT true,
    `supportNotifications` BOOLEAN NOT NULL DEFAULT true,
    `announcementNotifications` BOOLEAN NOT NULL DEFAULT true,
    `promotionNotifications` BOOLEAN NOT NULL DEFAULT true,
    `systemNotifications` BOOLEAN NOT NULL DEFAULT true,
    `emailNotifications` BOOLEAN NOT NULL DEFAULT false,
    `smsNotifications` BOOLEAN NOT NULL DEFAULT false,
    `pushNotifications` BOOLEAN NOT NULL DEFAULT false,
    `quietHoursEnabled` BOOLEAN NOT NULL DEFAULT false,
    `quietHoursStart` VARCHAR(191) NULL,
    `quietHoursEnd` VARCHAR(191) NULL,

    UNIQUE INDEX `NotificationSetting_userId_key`(`userId`),
    INDEX `NotificationSetting_userId_idx`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `notificationId` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NOT NULL,
    `action` VARCHAR(191) NOT NULL,
    `channel` ENUM('IN_APP', 'EMAIL', 'SMS', 'PUSH') NOT NULL DEFAULT 'IN_APP',
    `metadata` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,

    INDEX `NotificationLog_notificationId_idx`(`notificationId`),
    INDEX `NotificationLog_userId_idx`(`userId`),
    INDEX `NotificationLog_action_idx`(`action`),
    INDEX `NotificationLog_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationQueue` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `notificationId` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NOT NULL,
    `channel` ENUM('IN_APP', 'EMAIL', 'SMS', 'PUSH') NOT NULL,
    `payload` JSON NOT NULL,
    `status` ENUM('PENDING', 'PROCESSING', 'SENT', 'FAILED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
    `attempts` INTEGER NOT NULL DEFAULT 0,
    `maxAttempts` INTEGER NOT NULL DEFAULT 3,
    `lastError` VARCHAR(191) NULL,
    `processedAt` DATETIME(3) NULL,
    `scheduledAt` DATETIME(3) NULL,

    INDEX `NotificationQueue_status_idx`(`status`),
    INDEX `NotificationQueue_userId_idx`(`userId`),
    INDEX `NotificationQueue_scheduledAt_idx`(`scheduledAt`),
    INDEX `NotificationQueue_channel_idx`(`channel`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `UserBanHistory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `userId` VARCHAR(191) NOT NULL,
    `bannedByUserId` VARCHAR(191) NOT NULL,
    `reason` ENUM('VIOLATION_OF_TERMS', 'FRAUDULENT_ACTIVITY', 'SUSPICIOUS_BEHAVIOR', 'CHARGEBACK', 'KYC_VIOLATION', 'SPAM', 'ABUSE', 'OTHER') NOT NULL,
    `reasonText` VARCHAR(191) NULL,
    `unbannedAt` DATETIME(3) NULL,
    `unbannedByUserId` VARCHAR(191) NULL,
    `unbanReason` VARCHAR(191) NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,

    INDEX `UserBanHistory_userId_idx`(`userId`),
    INDEX `UserBanHistory_bannedByUserId_idx`(`bannedByUserId`),
    INDEX `UserBanHistory_isActive_idx`(`isActive`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SupportTicket` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `subject` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NOT NULL,
    `status` ENUM('OPEN', 'IN_PROGRESS', 'WAITING_ON_USER', 'RESOLVED', 'CLOSED') NOT NULL DEFAULT 'OPEN',
    `priority` ENUM('LOW', 'MEDIUM', 'HIGH', 'URGENT') NOT NULL DEFAULT 'MEDIUM',
    `createdById` VARCHAR(191) NOT NULL,
    `assignedToId` VARCHAR(191) NULL,
    `closedById` VARCHAR(191) NULL,
    `closedAt` DATETIME(3) NULL,

    INDEX `SupportTicket_createdById_idx`(`createdById`),
    INDEX `SupportTicket_assignedToId_idx`(`assignedToId`),
    INDEX `SupportTicket_status_idx`(`status`),
    INDEX `SupportTicket_priority_idx`(`priority`),
    INDEX `SupportTicket_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SupportMessage` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `ticketId` VARCHAR(191) NOT NULL,
    `senderId` VARCHAR(191) NOT NULL,
    `message` VARCHAR(191) NOT NULL,
    `isAdmin` BOOLEAN NOT NULL DEFAULT false,
    `attachments` JSON NULL,

    INDEX `SupportMessage_ticketId_idx`(`ticketId`),
    INDEX `SupportMessage_senderId_idx`(`senderId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Announcement` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `title` VARCHAR(191) NOT NULL,
    `body` VARCHAR(191) NOT NULL,
    `priority` ENUM('INFO', 'WARNING', 'IMPORTANT', 'CRITICAL') NOT NULL DEFAULT 'INFO',
    `target` ENUM('ALL', 'USERS_ONLY', 'ADMINS_ONLY', 'VERIFIED_USERS') NOT NULL DEFAULT 'ALL',
    `createdById` VARCHAR(191) NOT NULL,
    `publishedAt` DATETIME(3) NULL,
    `expiresAt` DATETIME(3) NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,

    INDEX `Announcement_createdById_idx`(`createdById`),
    INDEX `Announcement_isActive_idx`(`isActive`),
    INDEX `Announcement_priority_idx`(`priority`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Report` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `type` ENUM('DAILY', 'WEEKLY', 'MONTHLY', 'TRADE', 'REVENUE', 'COMMISSION', 'WALLET', 'USER', 'CUSTOM') NOT NULL,
    `format` ENUM('CSV', 'EXCEL', 'JSON', 'PDF') NOT NULL DEFAULT 'CSV',
    `generatedById` VARCHAR(191) NULL,
    `dateFrom` DATETIME(3) NULL,
    `dateTo` DATETIME(3) NULL,
    `data` JSON NULL,
    `fileUrl` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `Report_type_idx`(`type`),
    INDEX `Report_generatedById_idx`(`generatedById`),
    INDEX `Report_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `KYC` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NOT NULL,
    `status` VARCHAR(191) NOT NULL DEFAULT 'PENDING',
    `type` VARCHAR(191) NOT NULL DEFAULT 'INDIVIDUAL',
    `reviewedById` VARCHAR(191) NULL,
    `reviewedAt` DATETIME(3) NULL,
    `reviewNotes` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    UNIQUE INDEX `KYC_userId_key`(`userId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `File` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `userId` VARCHAR(191) NULL,
    `purpose` VARCHAR(191) NOT NULL,
    `url` VARCHAR(191) NOT NULL,
    `mimeType` VARCHAR(191) NULL,
    `sizeBytes` BIGINT NULL,
    `name` VARCHAR(191) NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Setting` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `value` JSON NOT NULL,

    UNIQUE INDEX `Setting_key_key`(`key`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `CommissionRule` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `type` ENUM('PLATFORM', 'REFERRAL', 'AGENT', 'PARTNER', 'BONUS', 'MANUAL_ADJUSTMENT') NOT NULL,
    `percentage` DECIMAL(8, 6) NOT NULL,
    `description` VARCHAR(191) NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,

    UNIQUE INDEX `CommissionRule_type_key`(`type`),
    INDEX `CommissionRule_type_idx`(`type`),
    INDEX `CommissionRule_isActive_idx`(`isActive`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Commission` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `tradeId` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NOT NULL,
    `walletId` VARCHAR(191) NOT NULL,
    `transactionId` VARCHAR(191) NULL,
    `type` ENUM('PLATFORM', 'REFERRAL', 'AGENT', 'PARTNER', 'BONUS', 'MANUAL_ADJUSTMENT') NOT NULL,
    `status` ENUM('PENDING', 'CALCULATED', 'PAID', 'FAILED', 'REVERSED') NOT NULL DEFAULT 'PENDING',
    `ruleId` VARCHAR(191) NULL,
    `percentage` DECIMAL(8, 6) NOT NULL,
    `amount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL,
    `referenceId` VARCHAR(191) NULL,
    `notes` VARCHAR(191) NULL,

    UNIQUE INDEX `Commission_transactionId_key`(`transactionId`),
    INDEX `Commission_tradeId_idx`(`tradeId`),
    INDEX `Commission_userId_idx`(`userId`),
    INDEX `Commission_walletId_idx`(`walletId`),
    INDEX `Commission_type_idx`(`type`),
    INDEX `Commission_status_idx`(`status`),
    INDEX `Commission_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `CommissionAuditLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `commissionId` VARCHAR(191) NOT NULL,
    `adminUserId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `details` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,

    INDEX `CommissionAuditLog_commissionId_idx`(`commissionId`),
    INDEX `CommissionAuditLog_adminUserId_idx`(`adminUserId`),
    INDEX `CommissionAuditLog_action_idx`(`action`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `LoginLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `userId` VARCHAR(191) NULL,
    `email` VARCHAR(191) NULL,
    `event` ENUM('LOGIN', 'LOGOUT', 'FAILED_LOGIN', 'PASSWORD_RESET', 'OTP_VERIFICATION', 'TWO_FA', 'EMAIL_VERIFICATION') NOT NULL,
    `status` ENUM('SUCCESS', 'FAILED', 'BLOCKED', 'PENDING', 'EXPIRED') NOT NULL DEFAULT 'SUCCESS',
    `ipAddress` VARCHAR(191) NULL,
    `browser` VARCHAR(191) NULL,
    `os` VARCHAR(191) NULL,
    `device` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `location` JSON NULL,
    `failureReason` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `LoginLog_userId_idx`(`userId`),
    INDEX `LoginLog_email_idx`(`email`),
    INDEX `LoginLog_event_idx`(`event`),
    INDEX `LoginLog_status_idx`(`status`),
    INDEX `LoginLog_ipAddress_idx`(`ipAddress`),
    INDEX `LoginLog_createdAt_idx`(`createdAt`),
    INDEX `LoginLog_userId_createdAt_idx`(`userId`, `createdAt`),
    INDEX `LoginLog_event_status_createdAt_idx`(`event`, `status`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `TransactionLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `transactionId` VARCHAR(191) NULL,
    `walletId` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NULL,
    `type` ENUM('DEPOSIT', 'WITHDRAWAL', 'TRADE', 'TRANSFER', 'REFERRAL_CREDIT', 'COMMISSION_CREDIT', 'WALLET_UPDATE', 'REFUND') NOT NULL,
    `amount` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `status` ENUM('PENDING', 'COMPLETED', 'FAILED', 'CANCELLED', 'REVERSED') NOT NULL DEFAULT 'COMPLETED',
    `previousBalance` DECIMAL(30, 10) NULL,
    `newBalance` DECIMAL(30, 10) NULL,
    `referenceNumber` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,

    INDEX `TransactionLog_transactionId_idx`(`transactionId`),
    INDEX `TransactionLog_walletId_idx`(`walletId`),
    INDEX `TransactionLog_userId_idx`(`userId`),
    INDEX `TransactionLog_type_idx`(`type`),
    INDEX `TransactionLog_status_idx`(`status`),
    INDEX `TransactionLog_currency_idx`(`currency`),
    INDEX `TransactionLog_createdAt_idx`(`createdAt`),
    INDEX `TransactionLog_userId_createdAt_idx`(`userId`, `createdAt`),
    INDEX `TransactionLog_walletId_createdAt_idx`(`walletId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AdminLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `actorUserId` VARCHAR(191) NULL,
    `affectedUserId` VARCHAR(191) NULL,
    `action` VARCHAR(191) NOT NULL,
    `category` ENUM('USER_MANAGEMENT', 'WALLET_MANAGEMENT', 'ORDER_MANAGEMENT', 'TRADE_MANAGEMENT', 'ROLE_MANAGEMENT', 'PERMISSION_MANAGEMENT', 'ANNOUNCEMENT', 'COMMISSION', 'SUPPORT', 'KYC', 'REPORT', 'SYSTEM', 'OTHER') NOT NULL DEFAULT 'OTHER',
    `resource` VARCHAR(191) NULL,
    `resourceId` VARCHAR(191) NULL,
    `details` VARCHAR(191) NULL,
    `oldValue` JSON NULL,
    `newValue` JSON NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `AdminLog_actorUserId_idx`(`actorUserId`),
    INDEX `AdminLog_affectedUserId_idx`(`affectedUserId`),
    INDEX `AdminLog_action_idx`(`action`),
    INDEX `AdminLog_category_idx`(`category`),
    INDEX `AdminLog_resource_idx`(`resource`),
    INDEX `AdminLog_createdAt_idx`(`createdAt`),
    INDEX `AdminLog_actorUserId_createdAt_idx`(`actorUserId`, `createdAt`),
    INDEX `AdminLog_affectedUserId_createdAt_idx`(`affectedUserId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ErrorLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `message` VARCHAR(191) NOT NULL,
    `stackTrace` VARCHAR(191) NULL,
    `name` VARCHAR(191) NULL,
    `httpMethod` VARCHAR(191) NULL,
    `route` VARCHAR(191) NULL,
    `statusCode` INTEGER NULL,
    `severity` ENUM('ERROR', 'INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'ERROR',
    `userId` VARCHAR(191) NULL,
    `context` VARCHAR(191) NULL,
    `service` VARCHAR(191) NULL,
    `sanitized` BOOLEAN NOT NULL DEFAULT true,
    `metadata` JSON NULL,

    INDEX `ErrorLog_userId_idx`(`userId`),
    INDEX `ErrorLog_severity_idx`(`severity`),
    INDEX `ErrorLog_statusCode_idx`(`statusCode`),
    INDEX `ErrorLog_route_idx`(`route`),
    INDEX `ErrorLog_context_idx`(`context`),
    INDEX `ErrorLog_createdAt_idx`(`createdAt`),
    INDEX `ErrorLog_createdAt_severity_idx`(`createdAt`, `severity`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SystemLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `type` ENUM('STARTUP', 'SHUTDOWN', 'DEPLOYMENT', 'CRON_JOB', 'DATABASE', 'CACHE', 'QUEUE', 'WEBSOCKET', 'THIRD_PARTY', 'CONFIG_CHANGE', 'SECURITY', 'PERFORMANCE', 'MAINTENANCE') NOT NULL,
    `message` VARCHAR(191) NOT NULL,
    `severity` ENUM('ERROR', 'INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'INFO',
    `service` VARCHAR(191) NULL,
    `hostname` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `SystemLog_type_idx`(`type`),
    INDEX `SystemLog_severity_idx`(`severity`),
    INDEX `SystemLog_service_idx`(`service`),
    INDEX `SystemLog_createdAt_idx`(`createdAt`),
    INDEX `SystemLog_type_severity_createdAt_idx`(`type`, `severity`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `RequestLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `requestId` VARCHAR(191) NULL,
    `method` VARCHAR(191) NOT NULL,
    `url` VARCHAR(191) NOT NULL,
    `route` VARCHAR(191) NULL,
    `statusCode` INTEGER NOT NULL,
    `durationMs` INTEGER NOT NULL,
    `responseSize` INTEGER NULL,
    `ipAddress` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `userId` VARCHAR(191) NULL,
    `headers` JSON NULL,
    `query` JSON NULL,
    `body` JSON NULL,

    INDEX `RequestLog_method_idx`(`method`),
    INDEX `RequestLog_url_idx`(`url`),
    INDEX `RequestLog_statusCode_idx`(`statusCode`),
    INDEX `RequestLog_userId_idx`(`userId`),
    INDEX `RequestLog_ipAddress_idx`(`ipAddress`),
    INDEX `RequestLog_createdAt_idx`(`createdAt`),
    INDEX `RequestLog_userId_createdAt_idx`(`userId`, `createdAt`),
    INDEX `RequestLog_statusCode_createdAt_idx`(`statusCode`, `createdAt`),
    INDEX `RequestLog_route_createdAt_idx`(`route`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `LogArchive` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `logType` VARCHAR(191) NOT NULL,
    `logId` VARCHAR(191) NOT NULL,
    `reason` VARCHAR(191) NULL,
    `archivedByUserId` VARCHAR(191) NULL,
    `metadata` JSON NULL,

    INDEX `LogArchive_logType_idx`(`logType`),
    INDEX `LogArchive_logId_idx`(`logId`),
    INDEX `LogArchive_archivedByUserId_idx`(`archivedByUserId`),
    INDEX `LogArchive_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BackupHistory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `type` ENUM('DAILY', 'WEEKLY', 'MONTHLY', 'MANUAL') NOT NULL,
    `scope` ENUM('DATABASE_ONLY', 'FILES_ONLY', 'FULL') NOT NULL DEFAULT 'FULL',
    `status` ENUM('PENDING', 'RUNNING', 'COMPLETED', 'COMPRESSING', 'VERIFYING', 'FAILED', 'DELETED', 'EXPIRED') NOT NULL DEFAULT 'PENDING',
    `fileName` VARCHAR(191) NULL,
    `filePath` VARCHAR(191) NULL,
    `fileSizeBytes` BIGINT NULL,
    `mimeType` VARCHAR(191) NULL,
    `checksum` VARCHAR(191) NULL,
    `checksumAlgorithm` VARCHAR(191) NOT NULL DEFAULT 'SHA-256',
    `isEncrypted` BOOLEAN NOT NULL DEFAULT true,
    `encryptionAlgorithm` VARCHAR(191) NULL,
    `startedAt` DATETIME(3) NULL,
    `completedAt` DATETIME(3) NULL,
    `durationMs` INTEGER NULL,
    `databaseName` VARCHAR(191) NULL,
    `errorMessage` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `retentionExpiresAt` DATETIME(3) NULL,
    `isRetained` BOOLEAN NOT NULL DEFAULT true,
    `createdByUserId` VARCHAR(191) NULL,
    `restoredByUserId` VARCHAR(191) NULL,
    `restoredAt` DATETIME(3) NULL,
    `restoredToDatabase` VARCHAR(191) NULL,
    `restoreStatus` ENUM('PENDING', 'RESTORING_DATABASE', 'RESTORING_FILES', 'COMPLETED', 'FAILED', 'CANCELLED') NULL,

    INDEX `BackupHistory_type_idx`(`type`),
    INDEX `BackupHistory_status_idx`(`status`),
    INDEX `BackupHistory_createdAt_idx`(`createdAt`),
    INDEX `BackupHistory_createdByUserId_idx`(`createdByUserId`),
    INDEX `BackupHistory_checksum_idx`(`checksum`),
    INDEX `BackupHistory_retentionExpiresAt_idx`(`retentionExpiresAt`),
    INDEX `BackupHistory_retentionExpiresAt_isRetained_idx`(`retentionExpiresAt`, `isRetained`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BackupJob` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `type` ENUM('DAILY', 'WEEKLY', 'MONTHLY', 'MANUAL') NOT NULL,
    `jobType` ENUM('DATABASE', 'FILES', 'FULL') NOT NULL DEFAULT 'FULL',
    `scope` ENUM('DATABASE_ONLY', 'FILES_ONLY', 'FULL') NOT NULL DEFAULT 'FULL',
    `status` ENUM('QUEUED', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED') NOT NULL DEFAULT 'QUEUED',
    `scheduledFor` DATETIME(3) NULL,
    `startedAt` DATETIME(3) NULL,
    `completedAt` DATETIME(3) NULL,
    `durationMs` INTEGER NULL,
    `errorMessage` VARCHAR(191) NULL,
    `attempts` INTEGER NOT NULL DEFAULT 0,
    `maxAttempts` INTEGER NOT NULL DEFAULT 3,
    `metadata` JSON NULL,
    `backupHistoryId` VARCHAR(191) NULL,

    INDEX `BackupJob_type_idx`(`type`),
    INDEX `BackupJob_status_idx`(`status`),
    INDEX `BackupJob_scheduledFor_idx`(`scheduledFor`),
    INDEX `BackupJob_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `BackupVerification` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `backupHistoryId` VARCHAR(191) NOT NULL,
    `status` ENUM('PENDING', 'VERIFYING', 'PASSED', 'FAILED') NOT NULL DEFAULT 'PENDING',
    `checksum` VARCHAR(191) NULL,
    `expectedChecksum` VARCHAR(191) NULL,
    `checksumMatched` BOOLEAN NULL,
    `fileExists` BOOLEAN NULL,
    `fileSizeBytes` BIGINT NULL,
    `canDecrypt` BOOLEAN NULL,
    `verifiedAt` DATETIME(3) NULL,
    `errorMessage` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `verifiedByUserId` VARCHAR(191) NULL,

    INDEX `BackupVerification_backupHistoryId_idx`(`backupHistoryId`),
    INDEX `BackupVerification_status_idx`(`status`),
    INDEX `BackupVerification_verifiedByUserId_idx`(`verifiedByUserId`),
    INDEX `BackupVerification_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ConfigCategory` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `icon` VARCHAR(191) NULL,
    `color` VARCHAR(191) NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `isEnabled` BOOLEAN NOT NULL DEFAULT true,
    `parentId` VARCHAR(191) NULL,

    UNIQUE INDEX `ConfigCategory_key_key`(`key`),
    INDEX `ConfigCategory_key_idx`(`key`),
    INDEX `ConfigCategory_isEnabled_idx`(`isEnabled`),
    INDEX `ConfigCategory_parentId_idx`(`parentId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ConfigSetting` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `value` JSON NOT NULL,
    `defaultValue` JSON NULL,
    `valueType` ENUM('STRING', 'NUMBER', 'BOOLEAN', 'JSON', 'ARRAY', 'ENUM', 'DATE') NOT NULL DEFAULT 'JSON',
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'ACTIVE',
    `visibility` ENUM('PUBLIC', 'INTERNAL', 'ADMIN_ONLY', 'SUPER_ADMIN_ONLY') NOT NULL DEFAULT 'ADMIN_ONLY',
    `minValue` DOUBLE NULL,
    `maxValue` DOUBLE NULL,
    `minLength` INTEGER NULL,
    `maxLength` INTEGER NULL,
    `pattern` VARCHAR(191) NULL,
    `options` JSON NULL,
    `isRequired` BOOLEAN NOT NULL DEFAULT false,
    `isSecret` BOOLEAN NOT NULL DEFAULT false,
    `isSystem` BOOLEAN NOT NULL DEFAULT false,
    `group` VARCHAR(191) NULL,
    `appliesToRoles` JSON NULL,
    `appliesToCountries` JSON NULL,
    `appliesToUserGroups` JSON NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `isEnabled` BOOLEAN NOT NULL DEFAULT true,
    `lastChangedById` VARCHAR(191) NULL,
    `lastChangedAt` DATETIME(3) NULL,
    `version` INTEGER NOT NULL DEFAULT 1,
    `categoryId` VARCHAR(191) NULL,

    UNIQUE INDEX `ConfigSetting_key_key`(`key`),
    INDEX `ConfigSetting_key_idx`(`key`),
    INDEX `ConfigSetting_categoryId_idx`(`categoryId`),
    INDEX `ConfigSetting_status_idx`(`status`),
    INDEX `ConfigSetting_visibility_idx`(`visibility`),
    INDEX `ConfigSetting_group_idx`(`group`),
    INDEX `ConfigSetting_isEnabled_idx`(`isEnabled`),
    INDEX `ConfigSetting_version_idx`(`version`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ConfigChangeLog` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `settingId` VARCHAR(191) NOT NULL,
    `adminUserId` VARCHAR(191) NULL,
    `adminRole` VARCHAR(191) NULL,
    `module` VARCHAR(191) NULL,
    `settingKey` VARCHAR(191) NOT NULL,
    `settingName` VARCHAR(191) NULL,
    `oldValue` JSON NULL,
    `newValue` JSON NULL,
    `status` ENUM('APPLIED', 'SCHEDULED', 'PENDING', 'FAILED', 'ROLLED_BACK') NOT NULL DEFAULT 'APPLIED',
    `reason` VARCHAR(191) NULL,
    `changeType` VARCHAR(191) NULL,
    `ipAddress` VARCHAR(191) NULL,
    `browser` VARCHAR(191) NULL,
    `userAgent` VARCHAR(191) NULL,
    `scheduledFor` DATETIME(3) NULL,
    `appliedAt` DATETIME(3) NULL,
    `revertedAt` DATETIME(3) NULL,
    `version` INTEGER NOT NULL DEFAULT 1,
    `metadata` JSON NULL,

    INDEX `ConfigChangeLog_settingId_idx`(`settingId`),
    INDEX `ConfigChangeLog_adminUserId_idx`(`adminUserId`),
    INDEX `ConfigChangeLog_adminRole_idx`(`adminRole`),
    INDEX `ConfigChangeLog_module_idx`(`module`),
    INDEX `ConfigChangeLog_settingKey_idx`(`settingKey`),
    INDEX `ConfigChangeLog_status_idx`(`status`),
    INDEX `ConfigChangeLog_changeType_idx`(`changeType`),
    INDEX `ConfigChangeLog_createdAt_idx`(`createdAt`),
    INDEX `ConfigChangeLog_settingId_createdAt_idx`(`settingId`, `createdAt`),
    INDEX `ConfigChangeLog_adminUserId_createdAt_idx`(`adminUserId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ConfigVersion` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `settingId` VARCHAR(191) NOT NULL,
    `version` INTEGER NOT NULL,
    `value` JSON NOT NULL,
    `changeLogId` VARCHAR(191) NULL,
    `adminUserId` VARCHAR(191) NULL,
    `adminRole` VARCHAR(191) NULL,
    `reason` VARCHAR(191) NULL,
    `isRestored` BOOLEAN NOT NULL DEFAULT false,

    INDEX `ConfigVersion_settingId_idx`(`settingId`),
    INDEX `ConfigVersion_createdAt_idx`(`createdAt`),
    INDEX `ConfigVersion_version_idx`(`version`),
    UNIQUE INDEX `ConfigVersion_settingId_version_key`(`settingId`, `version`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `FeatureFlag` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `enabled` BOOLEAN NOT NULL DEFAULT true,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'ACTIVE',
    `appliesToRoles` JSON NULL,
    `appliesToCountries` JSON NULL,
    `appliesToUserGroups` JSON NULL,
    `percentage` INTEGER NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `settingId` VARCHAR(191) NULL,
    `lastChangedById` VARCHAR(191) NULL,
    `lastChangedAt` DATETIME(3) NULL,

    UNIQUE INDEX `FeatureFlag_key_key`(`key`),
    INDEX `FeatureFlag_key_idx`(`key`),
    INDEX `FeatureFlag_enabled_idx`(`enabled`),
    INDEX `FeatureFlag_status_idx`(`status`),
    INDEX `FeatureFlag_settingId_idx`(`settingId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ScheduledChange` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `settingId` VARCHAR(191) NOT NULL,
    `newValue` JSON NOT NULL,
    `scheduledFor` DATETIME(3) NOT NULL,
    `status` ENUM('PENDING', 'EXECUTED', 'FAILED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
    `executedAt` DATETIME(3) NULL,
    `failedAt` DATETIME(3) NULL,
    `errorMessage` VARCHAR(191) NULL,
    `adminUserId` VARCHAR(191) NULL,
    `adminRole` VARCHAR(191) NULL,
    `reason` VARCHAR(191) NULL,

    INDEX `ScheduledChange_settingId_idx`(`settingId`),
    INDEX `ScheduledChange_status_idx`(`status`),
    INDEX `ScheduledChange_scheduledFor_idx`(`scheduledFor`),
    INDEX `ScheduledChange_executedAt_idx`(`executedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `EmergencyControl` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `action` ENUM('DISABLE_PLATFORM', 'DISABLE_REGISTRATION', 'DISABLE_LOGIN', 'DISABLE_TRADING', 'DISABLE_WALLET', 'DISABLE_WITHDRAWALS', 'DISABLE_DEPOSITS', 'DISABLE_ORDERS', 'MAINTENANCE_MODE', 'FREEZE_ALL_WALLETS', 'BLOCK_ALL_USERS', 'ENABLE_READONLY', 'RESTORE') NOT NULL,
    `level` ENUM('NONE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'NONE',
    `enabled` BOOLEAN NOT NULL DEFAULT false,
    `message` VARCHAR(191) NULL,
    `metadata` JSON NULL,
    `triggeredAt` DATETIME(3) NULL,
    `triggeredByUserId` VARCHAR(191) NULL,
    `resolvedAt` DATETIME(3) NULL,
    `resolvedByUserId` VARCHAR(191) NULL,

    UNIQUE INDEX `EmergencyControl_action_key`(`action`),
    INDEX `EmergencyControl_action_idx`(`action`),
    INDEX `EmergencyControl_enabled_idx`(`enabled`),
    INDEX `EmergencyControl_level_idx`(`level`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ManagedEntity` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `type` ENUM('FEATURE_FLAG', 'BUSINESS_RULE', 'PRICING', 'SUBSCRIPTION_PLAN', 'COMMISSION_RULE', 'REFERRAL_RULE', 'WALLET_CONFIG', 'TRADING_CONFIG', 'ORDER_CONFIG', 'REWARD_RULE', 'PROMOTION', 'CAMPAIGN', 'NOTIFICATION_CONFIG', 'AUTH_CONFIG', 'SECURITY_CONFIG', 'KYC_CONFIG', 'SUPPORT_CONFIG', 'MAINTENANCE', 'ANALYTICS_CONFIG', 'CONTENT', 'LOCALIZATION', 'TAX_CONFIG', 'FEE_CONFIG', 'SYSTEM_CONFIG', 'EMERGENCY_CONTROL', 'GENERAL') NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'DRAFT',
    `visibility` ENUM('PUBLIC', 'INTERNAL', 'ADMIN_ONLY', 'SUPER_ADMIN_ONLY') NOT NULL DEFAULT 'ADMIN_ONLY',
    `data` JSON NULL,
    `metadata` JSON NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `startsAt` DATETIME(3) NULL,
    `endsAt` DATETIME(3) NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,

    INDEX `ManagedEntity_type_idx`(`type`),
    INDEX `ManagedEntity_status_idx`(`status`),
    INDEX `ManagedEntity_isActive_idx`(`isActive`),
    INDEX `ManagedEntity_startsAt_endsAt_idx`(`startsAt`, `endsAt`),
    INDEX `ManagedEntity_createdById_idx`(`createdById`),
    UNIQUE INDEX `ManagedEntity_type_key_key`(`type`, `key`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SubscriptionPlan` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `slug` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `price` DECIMAL(30, 10) NOT NULL,
    `currency` VARCHAR(191) NOT NULL DEFAULT 'USD',
    `durationDays` INTEGER NOT NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'DRAFT',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `visibility` ENUM('PUBLIC', 'INTERNAL', 'ADMIN_ONLY', 'SUPER_ADMIN_ONLY') NOT NULL DEFAULT 'ADMIN_ONLY',
    `benefits` JSON NULL,
    `walletBonus` DECIMAL(30, 10) NULL,
    `referralBonus` DECIMAL(30, 10) NULL,
    `cashback` DECIMAL(8, 6) NULL,
    `prioritySupport` BOOLEAN NOT NULL DEFAULT false,
    `tradingDiscount` DECIMAL(8, 6) NULL,
    `withdrawalDiscount` DECIMAL(8, 6) NULL,
    `appliesToCountries` JSON NULL,
    `appliesToUserGroups` JSON NULL,
    `availableToRoles` JSON NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,
    `settingId` VARCHAR(191) NULL,

    UNIQUE INDEX `SubscriptionPlan_slug_key`(`slug`),
    INDEX `SubscriptionPlan_slug_idx`(`slug`),
    INDEX `SubscriptionPlan_status_idx`(`status`),
    INDEX `SubscriptionPlan_isActive_idx`(`isActive`),
    INDEX `SubscriptionPlan_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Promotion` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `type` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'DRAFT',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `isPaused` BOOLEAN NOT NULL DEFAULT false,
    `data` JSON NULL,
    `metadata` JSON NULL,
    `startsAt` DATETIME(3) NULL,
    `endsAt` DATETIME(3) NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,
    `settingId` VARCHAR(191) NULL,

    UNIQUE INDEX `Promotion_key_key`(`key`),
    INDEX `Promotion_key_idx`(`key`),
    INDEX `Promotion_type_idx`(`type`),
    INDEX `Promotion_status_idx`(`status`),
    INDEX `Promotion_isActive_idx`(`isActive`),
    INDEX `Promotion_isPaused_idx`(`isPaused`),
    INDEX `Promotion_startsAt_endsAt_idx`(`startsAt`, `endsAt`),
    INDEX `Promotion_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Campaign` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `type` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'DRAFT',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `isPaused` BOOLEAN NOT NULL DEFAULT false,
    `data` JSON NULL,
    `metadata` JSON NULL,
    `startsAt` DATETIME(3) NULL,
    `endsAt` DATETIME(3) NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,
    `settingId` VARCHAR(191) NULL,

    UNIQUE INDEX `Campaign_key_key`(`key`),
    INDEX `Campaign_key_idx`(`key`),
    INDEX `Campaign_type_idx`(`type`),
    INDEX `Campaign_status_idx`(`status`),
    INDEX `Campaign_isActive_idx`(`isActive`),
    INDEX `Campaign_startsAt_endsAt_idx`(`startsAt`, `endsAt`),
    INDEX `Campaign_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `ContentItem` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `type` VARCHAR(191) NOT NULL,
    `title` VARCHAR(191) NOT NULL,
    `body` VARCHAR(191) NULL,
    `content` JSON NULL,
    `status` ENUM('ACTIVE', 'INACTIVE', 'DRAFT', 'DEPRECATED') NOT NULL DEFAULT 'DRAFT',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `publishedAt` DATETIME(3) NULL,
    `expiresAt` DATETIME(3) NULL,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `createdById` VARCHAR(191) NULL,
    `updatedById` VARCHAR(191) NULL,
    `settingId` VARCHAR(191) NULL,

    UNIQUE INDEX `ContentItem_key_key`(`key`),
    INDEX `ContentItem_key_idx`(`key`),
    INDEX `ContentItem_type_idx`(`type`),
    INDEX `ContentItem_status_idx`(`status`),
    INDEX `ContentItem_isActive_idx`(`isActive`),
    INDEX `ContentItem_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `LocalizationEntry` (
    `id` VARCHAR(191) NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,
    `key` VARCHAR(191) NOT NULL,
    `type` VARCHAR(191) NOT NULL,
    `locale` VARCHAR(191) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `value` JSON NOT NULL,
    `isDefault` BOOLEAN NOT NULL DEFAULT false,
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `sortOrder` INTEGER NOT NULL DEFAULT 0,
    `updatedById` VARCHAR(191) NULL,
    `settingId` VARCHAR(191) NULL,

    UNIQUE INDEX `LocalizationEntry_key_key`(`key`),
    INDEX `LocalizationEntry_key_idx`(`key`),
    INDEX `LocalizationEntry_type_idx`(`type`),
    INDEX `LocalizationEntry_locale_idx`(`locale`),
    INDEX `LocalizationEntry_isActive_idx`(`isActive`),
    INDEX `LocalizationEntry_isDefault_idx`(`isDefault`),
    UNIQUE INDEX `LocalizationEntry_type_locale_key`(`type`, `locale`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `User` ADD CONSTRAINT `User_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_permissionId_fkey` FOREIGN KEY (`permissionId`) REFERENCES `Permission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `Session` ADD CONSTRAINT `Session_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `Device`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `RefreshToken` ADD CONSTRAINT `RefreshToken_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `Device`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

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

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

-- AddForeignKey
ALTER TABLE `LoginHistory` ADD CONSTRAINT `LoginHistory_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `Device`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

-- AddForeignKey
ALTER TABLE `WalletFreezeHistory` ADD CONSTRAINT `WalletFreezeHistory_walletId_fkey` FOREIGN KEY (`walletId`) REFERENCES `Wallet`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WalletFreezeHistory` ADD CONSTRAINT `WalletFreezeHistory_frozenByUserId_fkey` FOREIGN KEY (`frozenByUserId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WalletFreezeHistory` ADD CONSTRAINT `WalletFreezeHistory_unfrozenByUserId_fkey` FOREIGN KEY (`unfrozenByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Transaction` ADD CONSTRAINT `Transaction_walletId_fkey` FOREIGN KEY (`walletId`) REFERENCES `Wallet`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Transaction` ADD CONSTRAINT `Transaction_orderId_fkey` FOREIGN KEY (`orderId`) REFERENCES `Order`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Order` ADD CONSTRAINT `Order_walletId_fkey` FOREIGN KEY (`walletId`) REFERENCES `Wallet`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `Trade` ADD CONSTRAINT `Trade_orderId_fkey` FOREIGN KEY (`orderId`) REFERENCES `Order`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Trade` ADD CONSTRAINT `Trade_counterOrderId_fkey` FOREIGN KEY (`counterOrderId`) REFERENCES `Order`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Trade` ADD CONSTRAINT `Trade_buyerId_fkey` FOREIGN KEY (`buyerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Trade` ADD CONSTRAINT `Trade_sellerId_fkey` FOREIGN KEY (`sellerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `TradeHistory` ADD CONSTRAINT `TradeHistory_tradeId_fkey` FOREIGN KEY (`tradeId`) REFERENCES `Trade`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Escrow` ADD CONSTRAINT `Escrow_tradeId_fkey` FOREIGN KEY (`tradeId`) REFERENCES `Trade`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `OrderLock` ADD CONSTRAINT `OrderLock_tradeId_fkey` FOREIGN KEY (`tradeId`) REFERENCES `Trade`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `OrderLock` ADD CONSTRAINT `OrderLock_orderId_fkey` FOREIGN KEY (`orderId`) REFERENCES `Order`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `OrderAuditLog` ADD CONSTRAINT `OrderAuditLog_orderId_fkey` FOREIGN KEY (`orderId`) REFERENCES `Order`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `OrderAuditLog` ADD CONSTRAINT `OrderAuditLog_actorUserId_fkey` FOREIGN KEY (`actorUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `TradeAuditLog` ADD CONSTRAINT `TradeAuditLog_tradeId_fkey` FOREIGN KEY (`tradeId`) REFERENCES `Trade`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `TradeAuditLog` ADD CONSTRAINT `TradeAuditLog_actorUserId_fkey` FOREIGN KEY (`actorUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `Referral` ADD CONSTRAINT `Referral_referrerId_fkey` FOREIGN KEY (`referrerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Referral` ADD CONSTRAINT `Referral_referredId_fkey` FOREIGN KEY (`referredId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Referral` ADD CONSTRAINT `Referral_referralCodeId_fkey` FOREIGN KEY (`referralCodeId`) REFERENCES `ReferralCode`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `ReferralTransaction` ADD CONSTRAINT `ReferralTransaction_referrerId_fkey` FOREIGN KEY (`referrerId`) REFERENCES `ReferralIncome`(`userId`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ReferralTransaction` ADD CONSTRAINT `ReferralTransaction_referralId_fkey` FOREIGN KEY (`referralId`) REFERENCES `Referral`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ReferralTransaction` ADD CONSTRAINT `ReferralTransaction_commissionRuleId_fkey` FOREIGN KEY (`commissionRuleId`) REFERENCES `ReferralCommissionRule`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ReferralAuditLog` ADD CONSTRAINT `ReferralAuditLog_adminUserId_fkey` FOREIGN KEY (`adminUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ReferralAuditLog` ADD CONSTRAINT `ReferralAuditLog_targetUserId_fkey` FOREIGN KEY (`targetUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_announcementId_fkey` FOREIGN KEY (`announcementId`) REFERENCES `Announcement`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `NotificationLog` ADD CONSTRAINT `NotificationLog_notificationId_fkey` FOREIGN KEY (`notificationId`) REFERENCES `Notification`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `NotificationQueue` ADD CONSTRAINT `NotificationQueue_notificationId_fkey` FOREIGN KEY (`notificationId`) REFERENCES `Notification`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `UserBanHistory` ADD CONSTRAINT `UserBanHistory_bannedByUserId_fkey` FOREIGN KEY (`bannedByUserId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `UserBanHistory` ADD CONSTRAINT `UserBanHistory_unbannedByUserId_fkey` FOREIGN KEY (`unbannedByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SupportTicket` ADD CONSTRAINT `SupportTicket_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SupportTicket` ADD CONSTRAINT `SupportTicket_assignedToId_fkey` FOREIGN KEY (`assignedToId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SupportTicket` ADD CONSTRAINT `SupportTicket_closedById_fkey` FOREIGN KEY (`closedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SupportMessage` ADD CONSTRAINT `SupportMessage_ticketId_fkey` FOREIGN KEY (`ticketId`) REFERENCES `SupportTicket`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `SupportMessage` ADD CONSTRAINT `SupportMessage_senderId_fkey` FOREIGN KEY (`senderId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Announcement` ADD CONSTRAINT `Announcement_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Report` ADD CONSTRAINT `Report_generatedById_fkey` FOREIGN KEY (`generatedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `KYC` ADD CONSTRAINT `KYC_reviewedById_fkey` FOREIGN KEY (`reviewedById`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `File` ADD CONSTRAINT `File_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Commission` ADD CONSTRAINT `Commission_tradeId_fkey` FOREIGN KEY (`tradeId`) REFERENCES `Trade`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `Commission` ADD CONSTRAINT `Commission_walletId_fkey` FOREIGN KEY (`walletId`) REFERENCES `Wallet`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Commission` ADD CONSTRAINT `Commission_transactionId_fkey` FOREIGN KEY (`transactionId`) REFERENCES `Transaction`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Commission` ADD CONSTRAINT `Commission_ruleId_fkey` FOREIGN KEY (`ruleId`) REFERENCES `CommissionRule`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `CommissionAuditLog` ADD CONSTRAINT `CommissionAuditLog_commissionId_fkey` FOREIGN KEY (`commissionId`) REFERENCES `Commission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `CommissionAuditLog` ADD CONSTRAINT `CommissionAuditLog_adminUserId_fkey` FOREIGN KEY (`adminUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AdminLog` ADD CONSTRAINT `AdminLog_actorUserId_fkey` FOREIGN KEY (`actorUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `LogArchive` ADD CONSTRAINT `LogArchive_archivedByUserId_fkey` FOREIGN KEY (`archivedByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BackupHistory` ADD CONSTRAINT `BackupHistory_createdByUserId_fkey` FOREIGN KEY (`createdByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BackupHistory` ADD CONSTRAINT `BackupHistory_restoredByUserId_fkey` FOREIGN KEY (`restoredByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BackupJob` ADD CONSTRAINT `BackupJob_backupHistoryId_fkey` FOREIGN KEY (`backupHistoryId`) REFERENCES `BackupHistory`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BackupVerification` ADD CONSTRAINT `BackupVerification_backupHistoryId_fkey` FOREIGN KEY (`backupHistoryId`) REFERENCES `BackupHistory`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `BackupVerification` ADD CONSTRAINT `BackupVerification_verifiedByUserId_fkey` FOREIGN KEY (`verifiedByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigCategory` ADD CONSTRAINT `ConfigCategory_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `ConfigCategory`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigSetting` ADD CONSTRAINT `ConfigSetting_categoryId_fkey` FOREIGN KEY (`categoryId`) REFERENCES `ConfigCategory`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigChangeLog` ADD CONSTRAINT `ConfigChangeLog_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigChangeLog` ADD CONSTRAINT `ConfigChangeLog_adminUserId_fkey` FOREIGN KEY (`adminUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigVersion` ADD CONSTRAINT `ConfigVersion_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ConfigVersion` ADD CONSTRAINT `ConfigVersion_changeLogId_fkey` FOREIGN KEY (`changeLogId`) REFERENCES `ConfigChangeLog`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `FeatureFlag` ADD CONSTRAINT `FeatureFlag_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `ScheduledChange` ADD CONSTRAINT `ScheduledChange_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `EmergencyControl` ADD CONSTRAINT `EmergencyControl_triggeredByUserId_fkey` FOREIGN KEY (`triggeredByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `EmergencyControl` ADD CONSTRAINT `EmergencyControl_resolvedByUserId_fkey` FOREIGN KEY (`resolvedByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

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

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

-- AddForeignKey
ALTER TABLE `SubscriptionPlan` ADD CONSTRAINT `SubscriptionPlan_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

-- AddForeignKey
ALTER TABLE `Promotion` ADD CONSTRAINT `Promotion_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

-- AddForeignKey
ALTER TABLE `Campaign` ADD CONSTRAINT `Campaign_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

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

-- AddForeignKey
ALTER TABLE `ContentItem` ADD CONSTRAINT `ContentItem_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

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

-- AddForeignKey
ALTER TABLE `LocalizationEntry` ADD CONSTRAINT `LocalizationEntry_settingId_fkey` FOREIGN KEY (`settingId`) REFERENCES `ConfigSetting`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
