-- Users table CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, full_name VARCHAR(100), phone VARCHAR(20), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, is_active BOOLEAN DEFAULT TRUE, role ENUM('user', 'admin') DEFAULT 'user' ); -- Addresses table CREATE TABLE IF NOT EXISTS addresses ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, address_line1 VARCHAR(255) NOT NULL, address_line2 VARCHAR(255), city VARCHAR(100) NOT NULL, state VARCHAR(100), postal_code VARCHAR(20), is_default BOOLEAN DEFAULT FALSE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Categories table CREATE TABLE IF NOT EXISTS categories ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, name_ar VARCHAR(100) NOT NULL, description TEXT, description_ar TEXT, parent_id INT, image_url VARCHAR(255), FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE SET NULL ); -- Products table CREATE TABLE IF NOT EXISTS products ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT, name VARCHAR(255) NOT NULL, name_ar VARCHAR(255) NOT NULL, description TEXT, description_ar TEXT, price DECIMAL(10,2) NOT NULL, sale_price DECIMAL(10,2), stock_quantity INT DEFAULT 0, sku VARCHAR(50) UNIQUE, weight DECIMAL(10,2), benefits TEXT, benefits_ar TEXT, ingredients TEXT, ingredients_ar TEXT, usage_instructions TEXT, usage_instructions_ar TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES categories(id) ); -- Product Images table CREATE TABLE IF NOT EXISTS product_images ( id INT PRIMARY KEY AUTO_INCREMENT, product_id INT, image_url VARCHAR(255) NOT NULL, is_primary BOOLEAN DEFAULT FALSE, sort_order INT DEFAULT 0, FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE ); -- Reviews table CREATE TABLE IF NOT EXISTS reviews ( id INT PRIMARY KEY AUTO_INCREMENT, product_id INT, user_id INT, rating INT NOT NULL CHECK (rating BETWEEN 1 AND 5), comment TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_verified BOOLEAN DEFAULT FALSE, FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ); -- Shopping Cart table CREATE TABLE IF NOT EXISTS shopping_cart ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, product_id INT, quantity INT DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES products(id) ); -- Wishlist table CREATE TABLE IF NOT EXISTS wishlist ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, product_id INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES products(id) ); -- Orders table CREATE TABLE IF NOT EXISTS orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending', total_amount DECIMAL(10,2) NOT NULL, shipping_address_id INT, payment_method VARCHAR(50), payment_status ENUM('pending', 'paid', 'failed') DEFAULT 'pending', shipping_method VARCHAR(50), shipping_cost DECIMAL(10,2) DEFAULT 0, discount_amount DECIMAL(10,2) DEFAULT 0, coupon_code VARCHAR(50), notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (shipping_address_id) REFERENCES addresses(id) ); -- Order Items table CREATE TABLE IF NOT EXISTS order_items ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT, product_id INT, quantity INT NOT NULL, price DECIMAL(10,2) NOT NULL, FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES products(id) ); -- Coupons table CREATE TABLE IF NOT EXISTS coupons ( id INT PRIMARY KEY AUTO_INCREMENT, code VARCHAR(50) UNIQUE NOT NULL, type ENUM('percentage', 'fixed') NOT NULL, value DECIMAL(10,2) NOT NULL, min_purchase DECIMAL(10,2), max_discount DECIMAL(10,2), start_date TIMESTAMP, end_date TIMESTAMP, usage_limit INT, used_count INT DEFAULT 0, is_active BOOLEAN DEFAULT TRUE ); -- Blog Posts table CREATE TABLE IF NOT EXISTS blog_posts ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, title_ar VARCHAR(255) NOT NULL, content TEXT NOT NULL, content_ar TEXT NOT NULL, author_id INT, featured_image VARCHAR(255), status ENUM('draft', 'published') DEFAULT 'draft', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, published_at TIMESTAMP, FOREIGN KEY (author_id) REFERENCES users(id) ); -- Newsletter Subscribers table CREATE TABLE IF NOT EXISTS newsletter_subscribers ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(100) UNIQUE NOT NULL, is_active BOOLEAN DEFAULT TRUE, subscribed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Chat Messages table CREATE TABLE IF NOT EXISTS chat_messages ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, admin_id INT, message TEXT NOT NULL, is_admin BOOLEAN DEFAULT FALSE, is_read BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (admin_id) REFERENCES users(id) ); -- FAQ Categories table CREATE TABLE IF NOT EXISTS faq_categories ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, name_ar VARCHAR(100) NOT NULL, sort_order INT DEFAULT 0 ); -- FAQs table CREATE TABLE IF NOT EXISTS faqs ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT, question VARCHAR(255) NOT NULL, question_ar VARCHAR(255) NOT NULL, answer TEXT NOT NULL, answer_ar TEXT NOT NULL, sort_order INT DEFAULT 0, FOREIGN KEY (category_id) REFERENCES faq_categories(id) ); -- User Points table CREATE TABLE IF NOT EXISTS user_points ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, points INT DEFAULT 0, earned_from VARCHAR(50), earned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Referral System table CREATE TABLE IF NOT EXISTS referrals ( id INT PRIMARY KEY AUTO_INCREMENT, referrer_id INT, referred_id INT, status ENUM('pending', 'completed') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, completed_at TIMESTAMP, FOREIGN KEY (referrer_id) REFERENCES users(id), FOREIGN KEY (referred_id) REFERENCES users(id) );