CREATE TABLE `accounts` (
	`userId` varchar(36) NOT NULL,
	`type` varchar(255) NOT NULL,
	`provider` varchar(255) NOT NULL,
	`providerAccountId` varchar(255) NOT NULL,
	`refresh_token` varchar(255),
	`access_token` varchar(255),
	`expires_at` int,
	`token_type` varchar(255),
	`scope` varchar(255),
	`id_token` varchar(2048),
	`session_state` varchar(255),
	CONSTRAINT `accounts_provider_providerAccountId_pk` PRIMARY KEY(`provider`,`providerAccountId`)
);
--> statement-breakpoint
CREATE TABLE `affiliate_commissions` (
	`id` varchar(36) NOT NULL,
	`affiliate_id` varchar(36) NOT NULL,
	`order_id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`customer_email` text NOT NULL,
	`commission_cents` int NOT NULL,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `affiliate_commissions_id` PRIMARY KEY(`id`),
	CONSTRAINT `affiliate_commissions_order_id_unique` UNIQUE(`order_id`)
);
--> statement-breakpoint
CREATE TABLE `affiliates` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`code` varchar(64) NOT NULL,
	`name` text,
	`commission_percent` int NOT NULL,
	`active` boolean NOT NULL DEFAULT true,
	`total_clicks` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `affiliates_id` PRIMARY KEY(`id`),
	CONSTRAINT `affiliates_organizer_code_key` UNIQUE(`organizer_id`,`code`),
	CONSTRAINT `commission_percent_range` CHECK(`affiliates`.`commission_percent` between 1 and 100)
);
--> statement-breakpoint
CREATE TABLE `app_secrets` (
	`key` varchar(255) NOT NULL,
	`value` text NOT NULL,
	`updated_by` varchar(36),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	CONSTRAINT `app_secrets_key` PRIMARY KEY(`key`)
);
--> statement-breakpoint
CREATE TABLE `audit_log` (
	`id` varchar(36) NOT NULL,
	`actor_id` varchar(36),
	`action` text NOT NULL,
	`target_type` text,
	`target_id` text,
	`detail` json,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `audit_log_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `campaign_recipients` (
	`id` varchar(36) NOT NULL,
	`campaign_id` varchar(36) NOT NULL,
	`customer_id` varchar(36),
	`destination` text NOT NULL,
	`status` enum('pending','sending','sent','failed','skipped_opt_out') NOT NULL DEFAULT 'pending',
	`provider_message_id` varchar(255),
	`cost_cents` bigint NOT NULL DEFAULT 0,
	`error` text,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	`sent_at` timestamp,
	CONSTRAINT `campaign_recipients_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `campaigns` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`name` text NOT NULL,
	`channel` enum('sms','email') NOT NULL,
	`segment_id` varchar(36),
	`subject` text,
	`body` text NOT NULL,
	`status` enum('draft','queued','sending','sent','failed') NOT NULL DEFAULT 'draft',
	`currency` varchar(10) NOT NULL DEFAULT 'KES',
	`recipient_count` int NOT NULL DEFAULT 0,
	`sent_count` int NOT NULL DEFAULT 0,
	`failed_count` int NOT NULL DEFAULT 0,
	`skipped_count` int NOT NULL DEFAULT 0,
	`estimated_cost_cents` bigint NOT NULL DEFAULT 0,
	`actual_cost_cents` bigint NOT NULL DEFAULT 0,
	`created_by` varchar(36),
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	`queued_at` timestamp,
	`sent_at` timestamp,
	CONSTRAINT `campaigns_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `categories` (
	`id` varchar(36) NOT NULL,
	`name` text NOT NULL,
	`slug` varchar(255) NOT NULL,
	`color` varchar(20) NOT NULL DEFAULT '#2D6CFF',
	`sort_order` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `categories_id` PRIMARY KEY(`id`),
	CONSTRAINT `categories_slug_unique` UNIQUE(`slug`)
);
--> statement-breakpoint
CREATE TABLE `coupon_redemptions` (
	`id` varchar(36) NOT NULL,
	`coupon_id` varchar(36) NOT NULL,
	`order_id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`customer_email` text NOT NULL,
	`discount_cents` int NOT NULL,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `coupon_redemptions_id` PRIMARY KEY(`id`),
	CONSTRAINT `coupon_redemptions_order_id_unique` UNIQUE(`order_id`)
);
--> statement-breakpoint
CREATE TABLE `coupons` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`event_id` varchar(36),
	`code` varchar(64) NOT NULL,
	`kind` enum('percent','fixed') NOT NULL,
	`percent_off` int,
	`amount_off_cents` int,
	`max_redemptions` int,
	`per_customer_limit` int,
	`starts_at` timestamp,
	`ends_at` timestamp,
	`active` boolean NOT NULL DEFAULT true,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `coupons_id` PRIMARY KEY(`id`),
	CONSTRAINT `coupons_organizer_code_key` UNIQUE(`organizer_id`,`code`),
	CONSTRAINT `percent_off_range` CHECK(`coupons`.`percent_off` is null or `coupons`.`percent_off` between 1 and 100),
	CONSTRAINT `amount_off_non_negative` CHECK(`coupons`.`amount_off_cents` is null or `coupons`.`amount_off_cents` >= 0),
	CONSTRAINT `max_redemptions_positive` CHECK(`coupons`.`max_redemptions` is null or `coupons`.`max_redemptions` > 0),
	CONSTRAINT `per_customer_limit_positive` CHECK(`coupons`.`per_customer_limit` is null or `coupons`.`per_customer_limit` > 0),
	CONSTRAINT `kind_matches_discount_fields` CHECK((`coupons`.`kind` = 'percent' and `coupons`.`percent_off` is not null and `coupons`.`amount_off_cents` is null)
          or (`coupons`.`kind` = 'fixed' and `coupons`.`amount_off_cents` is not null and `coupons`.`percent_off` is null))
);
--> statement-breakpoint
CREATE TABLE `customer_segments` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`name` text NOT NULL,
	`filter` json NOT NULL,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	CONSTRAINT `customer_segments_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `customers` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`email` varchar(255) NOT NULL,
	`full_name` text,
	`phone` text,
	`total_orders` int NOT NULL DEFAULT 0,
	`total_spent_cents` bigint NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	`sms_opt_in` boolean NOT NULL DEFAULT true,
	`email_opt_in` boolean NOT NULL DEFAULT true,
	`sms_opted_out_at` timestamp,
	`email_opted_out_at` timestamp,
	CONSTRAINT `customers_id` PRIMARY KEY(`id`),
	CONSTRAINT `customers_organizer_email_key` UNIQUE(`organizer_id`,`email`)
);
--> statement-breakpoint
CREATE TABLE `event_links` (
	`id` varchar(36) NOT NULL,
	`event_id` varchar(36) NOT NULL,
	`label` text NOT NULL,
	`url` text NOT NULL,
	`kind` enum('gallery','video','press') NOT NULL DEFAULT 'gallery',
	`sort_order` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `event_links_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `events` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`title` text NOT NULL,
	`description` text,
	`venue` text,
	`starts_at` timestamp NOT NULL,
	`ends_at` timestamp,
	`cover_image_url` text,
	`status` enum('draft','published','cancelled') NOT NULL DEFAULT 'draft',
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`fee_bps` int NOT NULL DEFAULT 400,
	`category_id` varchar(36),
	`organizer_name` text,
	`city` text,
	`age_restriction` text,
	`featured` boolean NOT NULL DEFAULT false,
	CONSTRAINT `events_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `financing_requests` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`requested_by` varchar(36),
	`amount_cents` bigint NOT NULL,
	`currency` varchar(10) NOT NULL DEFAULT 'kes',
	`note` text,
	`status` enum('pending','approved','rejected','disbursed','repaid') NOT NULL DEFAULT 'pending',
	`repayment_rate_bps` int NOT NULL DEFAULT 1200,
	`outstanding_cents` bigint NOT NULL DEFAULT 0,
	`resolution_note` text,
	`resolved_by` varchar(36),
	`resolved_at` timestamp,
	`payout_account_id` varchar(36),
	`disbursed_by` varchar(36),
	`disbursed_at` timestamp,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	`active_marker` varchar(36) GENERATED ALWAYS AS ((case when `status` in ('pending','approved','disbursed') then `organizer_id` else null end)) STORED,
	CONSTRAINT `financing_requests_id` PRIMARY KEY(`id`),
	CONSTRAINT `uniq_financing_active_per_organizer` UNIQUE(`active_marker`),
	CONSTRAINT `financing_amount_positive` CHECK(`financing_requests`.`amount_cents` > 0),
	CONSTRAINT `financing_outstanding_non_negative` CHECK(`financing_requests`.`outstanding_cents` >= 0),
	CONSTRAINT `financing_repayment_rate_range` CHECK(`financing_requests`.`repayment_rate_bps` > 0 and `financing_requests`.`repayment_rate_bps` <= 10000)
);
--> statement-breakpoint
CREATE TABLE `gallery_albums` (
	`id` varchar(36) NOT NULL,
	`slug` varchar(255) NOT NULL,
	`title` text NOT NULL,
	`concept` text,
	`date_label` text,
	`venue` text,
	`sort_order` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`event_id` varchar(36),
	CONSTRAINT `gallery_albums_id` PRIMARY KEY(`id`),
	CONSTRAINT `gallery_albums_slug_unique` UNIQUE(`slug`)
);
--> statement-breakpoint
CREATE TABLE `gallery_photos` (
	`id` varchar(36) NOT NULL,
	`album_id` varchar(36) NOT NULL,
	`url` text NOT NULL,
	`sort_order` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`status` enum('pending','approved','rejected') NOT NULL DEFAULT 'approved',
	`kind` enum('photo','video') NOT NULL DEFAULT 'photo',
	`credit_name` text,
	`credit_url` text,
	`submitted_by` varchar(36),
	CONSTRAINT `gallery_photos_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `orders` (
	`id` varchar(36) NOT NULL,
	`event_id` varchar(36) NOT NULL,
	`buyer_email` text NOT NULL,
	`buyer_name` text,
	`buyer_phone` text,
	`stripe_session_id` varchar(255),
	`stripe_payment_intent` text,
	`total_cents` int NOT NULL DEFAULT 0,
	`currency` varchar(10) NOT NULL DEFAULT 'usd',
	`status` enum('pending','paid','cancelled','refunded') NOT NULL DEFAULT 'pending',
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`payment_method` enum('card','mpesa','paypal') NOT NULL DEFAULT 'card',
	`mpesa_checkout_request_id` varchar(255),
	`mpesa_receipt` text,
	`pending_items` json,
	`paypal_order_id` varchar(255),
	`paypal_capture_id` text,
	`paypal_amount_usd` decimal(10,2),
	`customer_id` varchar(36),
	`coupon_code` text,
	`affiliate_ref` text,
	`coupon_id` varchar(36),
	`discount_cents` int NOT NULL DEFAULT 0,
	`affiliate_id` varchar(36),
	`paystack_reference` varchar(255),
	CONSTRAINT `orders_id` PRIMARY KEY(`id`),
	CONSTRAINT `orders_stripe_session_id_unique` UNIQUE(`stripe_session_id`),
	CONSTRAINT `orders_mpesa_checkout_request_id_unique` UNIQUE(`mpesa_checkout_request_id`),
	CONSTRAINT `orders_paypal_order_id_unique` UNIQUE(`paypal_order_id`),
	CONSTRAINT `orders_paystack_reference_unique` UNIQUE(`paystack_reference`)
);
--> statement-breakpoint
CREATE TABLE `otp_codes` (
	`id` varchar(36) NOT NULL,
	`phone` varchar(32) NOT NULL,
	`code_hash` varchar(255) NOT NULL,
	`expires_at` timestamp NOT NULL,
	`consumed_at` timestamp,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `otp_codes_id` PRIMARY KEY(`id`)
);
--> statement-breakpoint
CREATE TABLE `payout_accounts` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`type` enum('mpesa','bank') NOT NULL,
	`mpesa_msisdn` text,
	`bank_name` text,
	`bank_account_name` text,
	`bank_account_number` text,
	`bank_branch` text,
	`verified` boolean NOT NULL DEFAULT false,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	CONSTRAINT `payout_accounts_id` PRIMARY KEY(`id`),
	CONSTRAINT `payout_accounts_organizer_id_unique` UNIQUE(`organizer_id`)
);
--> statement-breakpoint
CREATE TABLE `payouts` (
	`id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`payout_account_id` varchar(36),
	`method` enum('mpesa','bank') NOT NULL,
	`amount_cents` bigint NOT NULL,
	`currency` varchar(10) NOT NULL DEFAULT 'kes',
	`status` enum('pending','processing','paid','failed') NOT NULL DEFAULT 'pending',
	`destination` text,
	`b2c_conversation_id` text,
	`b2c_originator_conversation_id` varchar(255),
	`b2c_transaction_id` text,
	`failure_reason` text,
	`notes` text,
	`created_by` varchar(36),
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	`paid_at` timestamp,
	CONSTRAINT `payouts_id` PRIMARY KEY(`id`),
	CONSTRAINT `amount_cents_positive` CHECK(`payouts`.`amount_cents` > 0)
);
--> statement-breakpoint
CREATE TABLE `refund_requests` (
	`id` varchar(36) NOT NULL,
	`order_id` varchar(36) NOT NULL,
	`event_id` varchar(36) NOT NULL,
	`organizer_id` varchar(36) NOT NULL,
	`requested_by` varchar(36),
	`amount_cents` bigint NOT NULL,
	`reason` text,
	`status` enum('pending','approved','rejected') NOT NULL DEFAULT 'pending',
	`resolution_note` text,
	`resolved_by` varchar(36),
	`resolved_at` timestamp,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`gateway` text,
	`gateway_refund_status` enum('pending','succeeded','failed'),
	`gateway_refund_id` text,
	`gateway_conversation_id` text,
	`gateway_originator_conversation_id` varchar(255),
	`gateway_error` text,
	`pending_marker` varchar(36) GENERATED ALWAYS AS ((case when `status` = 'pending' then `order_id` else null end)) STORED,
	CONSTRAINT `refund_requests_id` PRIMARY KEY(`id`),
	CONSTRAINT `uniq_refund_pending_per_order` UNIQUE(`pending_marker`)
);
--> statement-breakpoint
CREATE TABLE `sessions` (
	`sessionToken` varchar(255) NOT NULL,
	`userId` varchar(36) NOT NULL,
	`expires` timestamp NOT NULL,
	CONSTRAINT `sessions_sessionToken` PRIMARY KEY(`sessionToken`)
);
--> statement-breakpoint
CREATE TABLE `site_settings` (
	`key` varchar(255) NOT NULL,
	`value` json NOT NULL,
	`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
	CONSTRAINT `site_settings_key` PRIMARY KEY(`key`)
);
--> statement-breakpoint
CREATE TABLE `ticket_types` (
	`id` varchar(36) NOT NULL,
	`event_id` varchar(36) NOT NULL,
	`name` text NOT NULL,
	`price_cents` int NOT NULL,
	`currency` varchar(10) NOT NULL DEFAULT 'usd',
	`quantity_total` int NOT NULL,
	`quantity_sold` int NOT NULL DEFAULT 0,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`original_price_cents` int,
	CONSTRAINT `ticket_types_id` PRIMARY KEY(`id`),
	CONSTRAINT `price_cents_non_negative` CHECK(`ticket_types`.`price_cents` >= 0),
	CONSTRAINT `quantity_total_non_negative` CHECK(`ticket_types`.`quantity_total` >= 0),
	CONSTRAINT `quantity_sold_non_negative` CHECK(`ticket_types`.`quantity_sold` >= 0)
);
--> statement-breakpoint
CREATE TABLE `tickets` (
	`id` varchar(36) NOT NULL,
	`order_id` varchar(36) NOT NULL,
	`ticket_type_id` varchar(36) NOT NULL,
	`event_id` varchar(36) NOT NULL,
	`code` varchar(64) NOT NULL,
	`attendee_name` text,
	`attendee_email` text,
	`status` enum('valid','used','void') NOT NULL DEFAULT 'valid',
	`checked_in_at` timestamp,
	`created_at` timestamp NOT NULL DEFAULT (now()),
	`checked_in_gate` text,
	`signature` text,
	CONSTRAINT `tickets_id` PRIMARY KEY(`id`),
	CONSTRAINT `tickets_code_unique` UNIQUE(`code`)
);
--> statement-breakpoint
CREATE TABLE `users` (
	`id` varchar(36) NOT NULL,
	`name` varchar(255),
	`email` varchar(255),
	`emailVerified` timestamp(3),
	`image` varchar(255),
	`phone` varchar(32),
	`password_hash` varchar(255),
	`role` enum('admin','organizer') NOT NULL DEFAULT 'organizer',
	`status` enum('active','suspended','banned') NOT NULL DEFAULT 'active',
	`created_at` timestamp NOT NULL DEFAULT (now()),
	CONSTRAINT `users_id` PRIMARY KEY(`id`),
	CONSTRAINT `users_email_unique` UNIQUE(`email`),
	CONSTRAINT `users_phone_unique` UNIQUE(`phone`)
);
--> statement-breakpoint
CREATE TABLE `verification_tokens` (
	`identifier` varchar(255) NOT NULL,
	`token` varchar(255) NOT NULL,
	`expires` timestamp NOT NULL,
	CONSTRAINT `verification_tokens_identifier_token_pk` PRIMARY KEY(`identifier`,`token`)
);
--> statement-breakpoint
ALTER TABLE `accounts` ADD CONSTRAINT `accounts_userId_users_id_fk` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `affiliate_commissions` ADD CONSTRAINT `affiliate_commissions_affiliate_id_affiliates_id_fk` FOREIGN KEY (`affiliate_id`) REFERENCES `affiliates`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `affiliate_commissions` ADD CONSTRAINT `affiliate_commissions_order_id_orders_id_fk` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `affiliate_commissions` ADD CONSTRAINT `affiliate_commissions_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `affiliates` ADD CONSTRAINT `affiliates_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `app_secrets` ADD CONSTRAINT `app_secrets_updated_by_users_id_fk` FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `audit_log` ADD CONSTRAINT `audit_log_actor_id_users_id_fk` FOREIGN KEY (`actor_id`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `campaign_recipients` ADD CONSTRAINT `campaign_recipients_campaign_id_campaigns_id_fk` FOREIGN KEY (`campaign_id`) REFERENCES `campaigns`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `campaign_recipients` ADD CONSTRAINT `campaign_recipients_customer_id_customers_id_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `campaigns` ADD CONSTRAINT `campaigns_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `campaigns` ADD CONSTRAINT `campaigns_segment_id_customer_segments_id_fk` FOREIGN KEY (`segment_id`) REFERENCES `customer_segments`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `campaigns` ADD CONSTRAINT `campaigns_created_by_users_id_fk` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `coupon_redemptions` ADD CONSTRAINT `coupon_redemptions_coupon_id_coupons_id_fk` FOREIGN KEY (`coupon_id`) REFERENCES `coupons`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `coupon_redemptions` ADD CONSTRAINT `coupon_redemptions_order_id_orders_id_fk` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `coupon_redemptions` ADD CONSTRAINT `coupon_redemptions_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `coupons` ADD CONSTRAINT `coupons_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `coupons` ADD CONSTRAINT `coupons_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `customer_segments` ADD CONSTRAINT `customer_segments_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `customers` ADD CONSTRAINT `customers_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `event_links` ADD CONSTRAINT `event_links_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `events` ADD CONSTRAINT `events_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `events` ADD CONSTRAINT `events_category_id_categories_id_fk` FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `financing_requests` ADD CONSTRAINT `financing_requests_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `financing_requests` ADD CONSTRAINT `financing_requests_requested_by_users_id_fk` FOREIGN KEY (`requested_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `financing_requests` ADD CONSTRAINT `financing_requests_resolved_by_users_id_fk` FOREIGN KEY (`resolved_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `financing_requests` ADD CONSTRAINT `financing_requests_payout_account_id_payout_accounts_id_fk` FOREIGN KEY (`payout_account_id`) REFERENCES `payout_accounts`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `financing_requests` ADD CONSTRAINT `financing_requests_disbursed_by_users_id_fk` FOREIGN KEY (`disbursed_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `gallery_albums` ADD CONSTRAINT `gallery_albums_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `gallery_photos` ADD CONSTRAINT `gallery_photos_album_id_gallery_albums_id_fk` FOREIGN KEY (`album_id`) REFERENCES `gallery_albums`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `gallery_photos` ADD CONSTRAINT `gallery_photos_submitted_by_users_id_fk` FOREIGN KEY (`submitted_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `orders` ADD CONSTRAINT `orders_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `orders` ADD CONSTRAINT `orders_customer_id_customers_id_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `orders` ADD CONSTRAINT `orders_coupon_id_coupons_id_fk` FOREIGN KEY (`coupon_id`) REFERENCES `coupons`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `orders` ADD CONSTRAINT `orders_affiliate_id_affiliates_id_fk` FOREIGN KEY (`affiliate_id`) REFERENCES `affiliates`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `payout_accounts` ADD CONSTRAINT `payout_accounts_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `payouts` ADD CONSTRAINT `payouts_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `payouts` ADD CONSTRAINT `payouts_payout_account_id_payout_accounts_id_fk` FOREIGN KEY (`payout_account_id`) REFERENCES `payout_accounts`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `payouts` ADD CONSTRAINT `payouts_created_by_users_id_fk` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `refund_requests` ADD CONSTRAINT `refund_requests_order_id_orders_id_fk` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `refund_requests` ADD CONSTRAINT `refund_requests_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `refund_requests` ADD CONSTRAINT `refund_requests_organizer_id_users_id_fk` FOREIGN KEY (`organizer_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `refund_requests` ADD CONSTRAINT `refund_requests_requested_by_users_id_fk` FOREIGN KEY (`requested_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `refund_requests` ADD CONSTRAINT `refund_requests_resolved_by_users_id_fk` FOREIGN KEY (`resolved_by`) REFERENCES `users`(`id`) ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `sessions` ADD CONSTRAINT `sessions_userId_users_id_fk` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `ticket_types` ADD CONSTRAINT `ticket_types_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `tickets` ADD CONSTRAINT `tickets_order_id_orders_id_fk` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `tickets` ADD CONSTRAINT `tickets_ticket_type_id_ticket_types_id_fk` FOREIGN KEY (`ticket_type_id`) REFERENCES `ticket_types`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `tickets` ADD CONSTRAINT `tickets_event_id_events_id_fk` FOREIGN KEY (`event_id`) REFERENCES `events`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX `idx_affiliate_commissions_affiliate` ON `affiliate_commissions` (`affiliate_id`);--> statement-breakpoint
CREATE INDEX `idx_audit_log_created` ON `audit_log` (`created_at`);--> statement-breakpoint
CREATE INDEX `idx_campaign_recipients_campaign` ON `campaign_recipients` (`campaign_id`);--> statement-breakpoint
CREATE INDEX `idx_campaign_recipients_pending` ON `campaign_recipients` (`campaign_id`,`status`);--> statement-breakpoint
CREATE INDEX `idx_campaign_recipients_provider_message` ON `campaign_recipients` (`provider_message_id`);--> statement-breakpoint
CREATE INDEX `idx_campaigns_organizer` ON `campaigns` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_campaigns_status` ON `campaigns` (`status`,`queued_at`);--> statement-breakpoint
CREATE INDEX `idx_coupon_redemptions_coupon` ON `coupon_redemptions` (`coupon_id`);--> statement-breakpoint
CREATE INDEX `idx_coupons_event` ON `coupons` (`event_id`);--> statement-breakpoint
CREATE INDEX `idx_customer_segments_organizer` ON `customer_segments` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_customers_organizer` ON `customers` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_event_links_event` ON `event_links` (`event_id`);--> statement-breakpoint
CREATE INDEX `idx_events_organizer` ON `events` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_events_category` ON `events` (`category_id`);--> statement-breakpoint
CREATE INDEX `idx_financing_requests_status` ON `financing_requests` (`status`);--> statement-breakpoint
CREATE INDEX `idx_financing_requests_organizer` ON `financing_requests` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_gallery_photos_album` ON `gallery_photos` (`album_id`);--> statement-breakpoint
CREATE INDEX `idx_gallery_photos_status` ON `gallery_photos` (`status`);--> statement-breakpoint
CREATE INDEX `idx_orders_event` ON `orders` (`event_id`);--> statement-breakpoint
CREATE INDEX `idx_orders_customer` ON `orders` (`customer_id`);--> statement-breakpoint
CREATE INDEX `idx_otp_codes_phone` ON `otp_codes` (`phone`);--> statement-breakpoint
CREATE INDEX `idx_payouts_organizer` ON `payouts` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_payouts_status` ON `payouts` (`status`);--> statement-breakpoint
CREATE INDEX `idx_payouts_b2c_originator` ON `payouts` (`b2c_originator_conversation_id`);--> statement-breakpoint
CREATE INDEX `idx_refund_requests_status` ON `refund_requests` (`status`);--> statement-breakpoint
CREATE INDEX `idx_refund_requests_organizer` ON `refund_requests` (`organizer_id`);--> statement-breakpoint
CREATE INDEX `idx_refund_requests_gateway_originator` ON `refund_requests` (`gateway_originator_conversation_id`);--> statement-breakpoint
CREATE INDEX `idx_ticket_types_event` ON `ticket_types` (`event_id`);--> statement-breakpoint
CREATE INDEX `idx_tickets_event` ON `tickets` (`event_id`);--> statement-breakpoint
CREATE INDEX `idx_tickets_order` ON `tickets` (`order_id`);