CREATE TABLE IF NOT EXISTS customers ( id VARCHAR(36) NOT NULL PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, full_name VARCHAR(255) NOT NULL, is_verified TINYINT(1) NOT NULL DEFAULT 0, verify_token VARCHAR(128) NULL, reset_token VARCHAR(128) NULL, reset_token_expires DATETIME NULL, stripe_customer_id VARCHAR(100) NULL UNIQUE, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_email (email), INDEX idx_stripe_customer (stripe_customer_id) ); CREATE TABLE IF NOT EXISTS subscriptions ( id VARCHAR(36) NOT NULL PRIMARY KEY, customer_id VARCHAR(36) NOT NULL, license_id VARCHAR(36) NOT NULL, stripe_subscription_id VARCHAR(100) NOT NULL UNIQUE, stripe_price_id VARCHAR(100) NOT NULL, plan_key VARCHAR(20) NOT NULL DEFAULT 'free', billing_interval VARCHAR(10) NOT NULL DEFAULT 'monthly', status VARCHAR(20) NOT NULL DEFAULT 'active', server_ip VARCHAR(45) NOT NULL, current_period_start DATETIME NOT NULL, current_period_end DATETIME NOT NULL, cancel_at_period_end TINYINT(1) NOT NULL DEFAULT 0, canceled_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, INDEX idx_customer_id (customer_id), INDEX idx_license_id (license_id), INDEX idx_stripe_sub (stripe_subscription_id), INDEX idx_server_ip (server_ip) ); CREATE TABLE IF NOT EXISTS ip_change_requests ( id VARCHAR(36) NOT NULL PRIMARY KEY, customer_id VARCHAR(36) NOT NULL, subscription_id VARCHAR(36) NOT NULL, old_ip VARCHAR(45) NOT NULL, new_ip VARCHAR(45) NOT NULL, status VARCHAR(10) NOT NULL DEFAULT 'pending', requested_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, processed_at DATETIME NULL, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, FOREIGN KEY (subscription_id) REFERENCES subscriptions(id) ON DELETE CASCADE, INDEX idx_customer_id (customer_id) );