-- =====================================================================================
-- 商城系统模拟数据插入脚本
-- 依赖: complete_mall_database.sql (必须先执行主数据库脚本)
-- 重要: 需要先在 Supabase Auth 中创建测试用户，建议使用 create_supabase_auth_users.js
-- 用途: 为商城系统生成测试数据，便于开发和测试
-- =====================================================================================

-- =====================================================================================
-- 0. 检查 Supabase Auth 用户环境
-- =====================================================================================

-- 检查是否为 Supabase 环境
DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth') THEN
        RAISE WARNING '当前环境不是 Supabase，将使用虚拟 auth_id';
        RAISE WARNING '如果是 Supabase 环境，请先使用以下方式创建测试用户：';
        RAISE WARNING '1. 执行 create_supabase_auth_users.js 脚本';
        RAISE WARNING '2. 或在 Supabase Dashboard 中手动创建用户';
    ELSE
        RAISE NOTICE '检测到 Supabase 环境，将尝试关联真实 auth 用户';
        
        -- 检查是否有测试用户
        IF EXISTS (SELECT 1 FROM auth.users WHERE email LIKE '%@mall.com') THEN
            RAISE NOTICE '发现测试用户，将使用真实 auth_id';
        ELSE
            RAISE WARNING '未发现测试用户，建议先执行 create_supabase_auth_users.js';
            RAISE WARNING '或手动在 Supabase Dashboard 创建以下测试用户：';
            RAISE WARNING '- admin@mall.com';
            RAISE WARNING '- merchant1@mall.com';
            RAISE WARNING '- merchant2@mall.com';
            RAISE WARNING '- customer1@mall.com';
            RAISE WARNING '- customer2@mall.com';
            RAISE WARNING '- customer3@mall.com';
            RAISE WARNING '- driver1@mall.com';
            RAISE WARNING '- driver2@mall.com';
        END IF;
    END IF;
END $$;

-- =====================================================================================
-- 1. 清理现有测试数据 (可选，谨慎使用)
-- =====================================================================================

-- TRUNCATE TABLE public.ml_product_reviews CASCADE;
-- TRUNCATE TABLE public.ml_order_items CASCADE;
-- TRUNCATE TABLE public.ml_orders CASCADE;
-- TRUNCATE TABLE public.ml_shopping_cart CASCADE;
-- TRUNCATE TABLE public.ml_user_coupons CASCADE;
-- TRUNCATE TABLE public.ml_coupon_templates CASCADE;
-- TRUNCATE TABLE public.ml_product_skus CASCADE;
-- TRUNCATE TABLE public.ml_products CASCADE;
-- TRUNCATE TABLE public.ml_shops CASCADE;
-- TRUNCATE TABLE public.ml_brands CASCADE;
-- TRUNCATE TABLE public.ml_categories CASCADE;
-- TRUNCATE TABLE public.ml_user_addresses CASCADE;
-- TRUNCATE TABLE public.ml_user_profiles CASCADE;

-- =====================================================================================
-- 2. Supabase Auth 用户创建 + ak_users 数据
-- =====================================================================================

-- 重要提示：在 Supabase 环境中，建议通过以下方式创建测试用户：
-- 
-- 方法一：使用 Supabase Dashboard 手动创建用户
-- 1. 进入 Supabase Dashboard -> Authentication -> Users
-- 2. 点击 "Add user" 创建以下测试用户：
--    - admin@mall.com (密码: Test123456!)
--    - merchant1@mall.com (密码: Test123456!)
--    - merchant2@mall.com (密码: Test123456!)
--    - customer1@mall.com (密码: Test123456!)
--    - customer2@mall.com (密码: Test123456!)
--    - customer3@mall.com (密码: Test123456!)
--    - driver1@mall.com (密码: Test123456!)
--    - driver2@mall.com (密码: Test123456!)
--
-- 方法二：使用 Supabase Admin API (需要在服务端执行)
-- 
-- 方法三：如果在本地开发环境，可以尝试直接插入 auth.users 表（仅限开发）

-- 检查是否为 Supabase 环境
DO $$
DECLARE
    is_supabase BOOLEAN := FALSE;
    auth_user_rec RECORD;
    test_emails TEXT[] := ARRAY[
        'admin@mall.com',
        'merchant1@mall.com', 
        'merchant2@mall.com',
        'customer1@mall.com',
        'customer2@mall.com',
        'customer3@mall.com',
        'driver1@mall.com',
        'driver2@mall.com'
    ];
    email_addr TEXT;
BEGIN
    -- 检查是否存在 auth schema (Supabase 特征)
    SELECT EXISTS (
        SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth'
    ) INTO is_supabase;
    
    IF is_supabase THEN
        RAISE NOTICE '检测到 Supabase 环境，检查 auth.users 表中的测试用户...';
        
        -- 检查测试用户是否存在
        FOREACH email_addr IN ARRAY test_emails LOOP
            SELECT id, email INTO auth_user_rec 
            FROM auth.users 
            WHERE email = email_addr 
            LIMIT 1;
            
            IF FOUND THEN
                RAISE NOTICE '✓ Auth用户已存在: % (ID: %)', auth_user_rec.email, auth_user_rec.id;
            ELSE
                RAISE NOTICE '✗ Auth用户不存在: %', email_addr;
                RAISE NOTICE '请在 Supabase Dashboard 中创建此用户或使用 Admin API';
            END IF;
        END LOOP;
        
        RAISE NOTICE '============================================';
        RAISE NOTICE '如果有缺失的用户，请按以下步骤操作：';
        RAISE NOTICE '1. 登录 Supabase Dashboard';
        RAISE NOTICE '2. 进入 Authentication -> Users';
        RAISE NOTICE '3. 点击 "Add user" 创建缺失的用户';
        RAISE NOTICE '4. 邮箱格式: user@mall.com, 密码: Test123456!';
        RAISE NOTICE '5. 重新执行此脚本';
        RAISE NOTICE '============================================';
    ELSE
        RAISE NOTICE '非 Supabase 环境，将创建虚拟 auth_id...';
    END IF;
END $$;

-- =====================================================================================
-- 1. 插入用户数据 (ak_users) - 关联 Supabase Auth 用户
-- =====================================================================================

-- 临时函数：获取或创建 auth_id
CREATE OR REPLACE FUNCTION get_or_create_auth_id(user_email TEXT)
RETURNS UUID AS $$
DECLARE
    auth_user_id UUID;
BEGIN
    -- 尝试从 auth.users 获取真实用户ID
    IF EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth') THEN
        SELECT id INTO auth_user_id FROM auth.users WHERE email = user_email LIMIT 1;
        
        IF auth_user_id IS NOT NULL THEN
            RETURN auth_user_id;
        ELSE
            RAISE WARNING '用户 % 在 auth.users 中不存在，使用虚拟UUID', user_email;
        END IF;
    END IF;
    
    -- 生成确定性虚拟UUID (基于邮箱)
    RETURN uuid_generate_v5(uuid_ns_dns(), user_email);
END;
$$ LANGUAGE plpgsql;

-- 插入系统管理员
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('admin@mall.com'),
    '系统管理员',
    'admin',
    'admin@mall.com',
    '13800138000',
    'https://example.com/avatars/admin.jpg',
    'active',
    'web',
    NOW() - INTERVAL '365 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'admin@mall.com');

-- 插入商家用户
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('merchant1@mall.com'),
    '数码专营店',
    'merchant',
    'merchant1@mall.com',
    '13800138001',
    'https://example.com/avatars/merchant1.jpg',
    'active',
    'web',
    NOW() - INTERVAL '300 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'merchant1@mall.com');

INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('merchant2@mall.com'),
    '时尚服饰店',
    'merchant',
    'merchant2@mall.com',
    '13800138002',
    'https://example.com/avatars/merchant2.jpg',
    'active',
    'web',
    NOW() - INTERVAL '200 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'merchant2@mall.com');

-- 插入普通用户
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('customer1@mall.com'),
    '张小明',
    'customer',
    'customer1@mall.com',
    '13800138101',
    'https://example.com/avatars/customer1.jpg',
    'active',
    'mobile',
    NOW() - INTERVAL '180 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer1@mall.com');

INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('customer2@mall.com'),
    '李小红',
    'customer',
    'customer2@mall.com',
    '13800138102',
    'https://example.com/avatars/customer2.jpg',
    'active',
    'mobile',
    NOW() - INTERVAL '120 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer2@mall.com');

INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('customer3@mall.com'),
    '王小华',
    'customer',
    'customer3@mall.com',
    '13800138103',
    'https://example.com/avatars/customer3.jpg',
    'active',
    'web',
    NOW() - INTERVAL '90 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer3@mall.com');

-- 插入配送员
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('driver1@mall.com'),
    '快递小哥1',
    'delivery',
    'driver1@mall.com',
    '13800138201',
    'https://example.com/avatars/driver1.jpg',
    'active',
    'mobile',
    NOW() - INTERVAL '150 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'driver1@mall.com');

INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT 
    get_or_create_auth_id('driver2@mall.com'),
    '快递小哥2',
    'delivery',
    'driver2@mall.com',
    '13800138202',
    'https://example.com/avatars/driver2.jpg',
    'active',
    'mobile',
    NOW() - INTERVAL '100 days',
    NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'driver2@mall.com');

-- 清理临时函数
DROP FUNCTION get_or_create_auth_id(TEXT);

-- =====================================================================================
-- 2. 获取用户ID (用于后续插入)
-- =====================================================================================
DO $$
DECLARE
    admin_id UUID;
    merchant1_id UUID;
    merchant2_id UUID;
    customer1_id UUID;
    customer2_id UUID;
    customer3_id UUID;
    driver1_id UUID;
    driver2_id UUID;
BEGIN
    -- 获取用户ID（使用email字段）
    SELECT id INTO admin_id FROM ak_users WHERE email = 'admin@mall.com';
    SELECT id INTO merchant1_id FROM ak_users WHERE email = 'merchant1@mall.com';
    SELECT id INTO merchant2_id FROM ak_users WHERE email = 'merchant2@mall.com';
    SELECT id INTO customer1_id FROM ak_users WHERE email = 'customer1@mall.com';
    SELECT id INTO customer2_id FROM ak_users WHERE email = 'customer2@mall.com';
    SELECT id INTO customer3_id FROM ak_users WHERE email = 'customer3@mall.com';
    SELECT id INTO driver1_id FROM ak_users WHERE email = 'driver1@mall.com';
    SELECT id INTO driver2_id FROM ak_users WHERE email = 'driver2@mall.com';

    -- 创建临时表存储ID
    CREATE TEMP TABLE IF NOT EXISTS temp_user_ids (
        role VARCHAR(20),
        user_id UUID
    );
    
    INSERT INTO temp_user_ids VALUES
    ('admin', admin_id),
    ('merchant1', merchant1_id),
    ('merchant2', merchant2_id),
    ('customer1', customer1_id),
    ('customer2', customer2_id),
    ('customer3', customer3_id),
    ('driver1', driver1_id),
    ('driver2', driver2_id);
END $$;

-- =====================================================================================
-- 3. 用户档案数据
-- =====================================================================================

-- 插入用户档案
INSERT INTO public.ml_user_profiles (user_id, status, real_name, credit_score, verification_status, verification_data, preferences)
SELECT 
    t.user_id,
    1, -- 正常状态
    CASE 
        WHEN t.role = 'admin' THEN '系统管理员'
        WHEN t.role = 'merchant1' THEN '张三丰'
        WHEN t.role = 'merchant2' THEN '李四海'
        WHEN t.role = 'customer1' THEN '王小明'
        WHEN t.role = 'customer2' THEN '刘小红'
        WHEN t.role = 'customer3' THEN '陈小华'
        WHEN t.role = 'driver1' THEN '赵配送'
        WHEN t.role = 'driver2' THEN '钱师傅'
    END,
    CASE 
        WHEN t.role = 'admin' THEN 1000
        WHEN t.role IN ('merchant1', 'merchant2') THEN 950
        WHEN t.role IN ('driver1', 'driver2') THEN 900
        ELSE 850
    END,
    CASE 
        WHEN t.role IN ('admin', 'merchant1', 'merchant2') THEN 1 -- 已认证
        ELSE 0 -- 未认证
    END,
    '{}', -- 认证数据
    '{"language": "zh-CN", "currency": "CNY", "notifications": true}' -- 偏好设置
FROM temp_user_ids t
ON CONFLICT (user_id) DO UPDATE SET
    real_name = EXCLUDED.real_name,
    credit_score = EXCLUDED.credit_score,
    verification_status = EXCLUDED.verification_status;

-- =====================================================================================
-- 4. 用户地址数据
-- =====================================================================================

-- 插入用户地址
INSERT INTO public.ml_user_addresses (user_id, receiver_name, receiver_phone, province, city, district, address_detail, is_default, label, latitude, longitude)
SELECT 
    t.user_id,
    CASE 
        WHEN t.role = 'customer1' THEN '王小明'
        WHEN t.role = 'customer2' THEN '刘小红'
        WHEN t.role = 'customer3' THEN '陈小华'
        WHEN t.role = 'merchant1' THEN '张三丰'
        WHEN t.role = 'merchant2' THEN '李四海'
    END,
    CASE 
        WHEN t.role = 'customer1' THEN '13800138003'
        WHEN t.role = 'customer2' THEN '13800138004'
        WHEN t.role = 'customer3' THEN '13800138005'
        WHEN t.role = 'merchant1' THEN '13800138001'
        WHEN t.role = 'merchant2' THEN '13800138002'
    END,
    '北京市',
    '朝阳区',
    '望京街道',
    CASE 
        WHEN t.role = 'customer1' THEN '望京SOHO T1座 1201室'
        WHEN t.role = 'customer2' THEN '国贸大厦 A座 2301室'
        WHEN t.role = 'customer3' THEN '三里屯太古里 B1-023'
        WHEN t.role = 'merchant1' THEN '中关村创业大街 8号楼'
        WHEN t.role = 'merchant2' THEN '亦庄经济开发区 科创园'
    END,
    TRUE, -- 默认地址
    'home',
    39.9942 + (random() - 0.5) * 0.01, -- 北京纬度附近
    116.3258 + (random() - 0.5) * 0.01  -- 北京经度附近
FROM temp_user_ids t
WHERE t.role IN ('customer1', 'customer2', 'customer3', 'merchant1', 'merchant2');

-- 为部分用户添加第二个地址
INSERT INTO public.ml_user_addresses (user_id, receiver_name, receiver_phone, province, city, district, address_detail, is_default, label, latitude, longitude)
SELECT 
    t.user_id,
    '公司收货',
    '010-12345678',
    '北京市',
    '海淀区',
    '中关村街道',
    '中关村大街1号 科技大厦',
    FALSE,
    'office',
    39.9042,
    116.3958
FROM temp_user_ids t
WHERE t.role IN ('customer1', 'customer2');

-- =====================================================================================
-- 5. 商品分类数据
-- =====================================================================================

-- 删除默认分类，插入更详细的分类
DELETE FROM public.ml_categories;

-- 一级分类
INSERT INTO public.ml_categories (id, name, slug, level, path, sort_order, icon_url, description) VALUES
(uuid_generate_v4(), '数码电器', 'digital', 1, ARRAY['数码电器'], 1, 'icon-digital', '手机、电脑、家电等数码产品'),
(uuid_generate_v4(), '服装鞋帽', 'fashion', 1, ARRAY['服装鞋帽'], 2, 'icon-fashion', '男装、女装、鞋子、配饰'),
(uuid_generate_v4(), '家居用品', 'home', 1, ARRAY['家居用品'], 3, 'icon-home', '家具、装饰、生活用品'),
(uuid_generate_v4(), '食品饮料', 'food', 1, ARRAY['食品饮料'], 4, 'icon-food', '新鲜食材、零食、饮品'),
(uuid_generate_v4(), '美妆护肤', 'beauty', 1, ARRAY['美妆护肤'], 5, 'icon-beauty', '化妆品、护肤品、个人护理'),
(uuid_generate_v4(), '运动户外', 'sports', 1, ARRAY['运动户外'], 6, 'icon-sports', '运动器材、户外装备、健身用品'),
(uuid_generate_v4(), '图书文娱', 'books', 1, ARRAY['图书文娱'], 7, 'icon-books', '图书、音像、文具、玩具'),
(uuid_generate_v4(), '母婴用品', 'baby', 1, ARRAY['母婴用品'], 8, 'icon-baby', '婴儿用品、孕妇用品、儿童玩具');

-- 获取一级分类ID并创建二级分类
DO $$
DECLARE
    digital_id UUID;
    fashion_id UUID;
    home_id UUID;
    food_id UUID;
BEGIN
    -- 获取一级分类ID
    SELECT id INTO digital_id FROM public.ml_categories WHERE slug = 'digital';
    SELECT id INTO fashion_id FROM public.ml_categories WHERE slug = 'fashion';
    SELECT id INTO home_id FROM public.ml_categories WHERE slug = 'home';
    SELECT id INTO food_id FROM public.ml_categories WHERE slug = 'food';
    
    -- 数码电器二级分类
    INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
    (digital_id, '手机通讯', 'mobile', 2, ARRAY['数码电器', '手机通讯'], 1),
    (digital_id, '电脑办公', 'computer', 2, ARRAY['数码电器', '电脑办公'], 2),
    (digital_id, '家用电器', 'appliance', 2, ARRAY['数码电器', '家用电器'], 3),
    (digital_id, '数码配件', 'accessories', 2, ARRAY['数码电器', '数码配件'], 4);
    
    -- 服装鞋帽二级分类
    INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
    (fashion_id, '男装', 'mens-wear', 2, ARRAY['服装鞋帽', '男装'], 1),
    (fashion_id, '女装', 'womens-wear', 2, ARRAY['服装鞋帽', '女装'], 2),
    (fashion_id, '男鞋', 'mens-shoes', 2, ARRAY['服装鞋帽', '男鞋'], 3),
    (fashion_id, '女鞋', 'womens-shoes', 2, ARRAY['服装鞋帽', '女鞋'], 4);
    
    -- 家居用品二级分类
    INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
    (home_id, '家具', 'furniture', 2, ARRAY['家居用品', '家具'], 1),
    (home_id, '家装', 'decoration', 2, ARRAY['家居用品', '家装'], 2),
    (home_id, '厨具', 'kitchen', 2, ARRAY['家居用品', '厨具'], 3),
    (home_id, '生活用品', 'daily', 2, ARRAY['家居用品', '生活用品'], 4);
    
    -- 食品饮料二级分类
    INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
    (food_id, '新鲜水果', 'fruits', 2, ARRAY['食品饮料', '新鲜水果'], 1),
    (food_id, '肉禽蛋类', 'meat', 2, ARRAY['食品饮料', '肉禽蛋类'], 2),
    (food_id, '零食坚果', 'snacks', 2, ARRAY['食品饮料', '零食坚果'], 3),
    (food_id, '酒水饮料', 'drinks', 2, ARRAY['食品饮料', '酒水饮料'], 4);
END $$;

-- =====================================================================================
-- 6. 品牌数据
-- =====================================================================================

INSERT INTO public.ml_brands (name, logo_url, description, website) VALUES
('苹果', 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/apple/apple-original.svg', '创新科技品牌', 'https://www.apple.com'),
('华为', 'https://logo.clearbit.com/huawei.com', '全球领先的信息与通信技术解决方案供应商', 'https://www.huawei.com'),
('小米', 'https://logo.clearbit.com/mi.com', '专注于智能硬件和电子产品', 'https://www.mi.com'),
('三星', 'https://logo.clearbit.com/samsung.com', '全球知名电子产品制造商', 'https://www.samsung.com'),
('耐克', 'https://logo.clearbit.com/nike.com', '全球著名体育用品品牌', 'https://www.nike.com'),
('阿迪达斯', 'https://logo.clearbit.com/adidas.com', '德国运动用品制造商', 'https://www.adidas.com'),
('优衣库', 'https://logo.clearbit.com/uniqlo.com', '日本休闲服饰品牌', 'https://www.uniqlo.com'),
('宜家', 'https://logo.clearbit.com/ikea.com', '瑞典家居用品零售商', 'https://www.ikea.com'),
('美的', 'https://logo.clearbit.com/midea.com', '中国家电制造商', 'https://www.midea.com'),
('海尔', 'https://logo.clearbit.com/haier.com', '全球知名家电品牌', 'https://www.haier.com');

-- =====================================================================================
-- 7. 店铺数据
-- =====================================================================================

-- 获取商家用户ID并创建店铺
INSERT INTO public.ml_shops (merchant_id, shop_name, shop_logo, shop_banner, description, business_license, contact_name, contact_phone, contact_email, address, business_hours, status, verified_at)
SELECT 
    t.user_id,
    CASE 
        WHEN t.role = 'merchant1' THEN '张三丰数码专营店'
        WHEN t.role = 'merchant2' THEN '李四海时尚小铺'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN 'https://api.dicebear.com/7.x/shapes/svg?seed=shop1'
        WHEN t.role = 'merchant2' THEN 'https://api.dicebear.com/7.x/shapes/svg?seed=shop2'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN 'https://picsum.photos/800/200?random=1'
        WHEN t.role = 'merchant2' THEN 'https://picsum.photos/800/200?random=2'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN '专业销售各类数码产品，品质保证，服务至上'
        WHEN t.role = 'merchant2' THEN '时尚潮流服饰，让您成为街头最亮的星'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN '91110000MA0001234A'
        WHEN t.role = 'merchant2' THEN '91110000MA0005678B'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN '张三丰'
        WHEN t.role = 'merchant2' THEN '李四海'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN '13800138001'
        WHEN t.role = 'merchant2' THEN '13800138002'
    END,
    CASE 
        WHEN t.role = 'merchant1' THEN 'merchant1@mall.com'
        WHEN t.role = 'merchant2' THEN 'merchant2@mall.com'
    END,
    '{"province": "北京市", "city": "朝阳区", "district": "望京街道", "detail": "望京商业中心"}',
    '{"monday": "09:00-21:00", "tuesday": "09:00-21:00", "wednesday": "09:00-21:00", "thursday": "09:00-21:00", "friday": "09:00-21:00", "saturday": "09:00-22:00", "sunday": "10:00-20:00"}',
    1, -- 正常状态
    NOW() - INTERVAL '30 days' -- 30天前认证
FROM temp_user_ids t
WHERE t.role IN ('merchant1', 'merchant2');

-- =====================================================================================
-- 8. 商品数据
-- =====================================================================================

-- 获取分类和品牌ID
DO $$
DECLARE
    mobile_cat_id UUID;
    computer_cat_id UUID;
    mens_wear_cat_id UUID;
    womens_wear_cat_id UUID;
    furniture_cat_id UUID;
    fruits_cat_id UUID;
    
    apple_brand_id UUID;
    huawei_brand_id UUID;
    xiaomi_brand_id UUID;
    nike_brand_id UUID;
    uniqlo_brand_id UUID;
    ikea_brand_id UUID;
    
    merchant1_id UUID;
    merchant2_id UUID;
BEGIN
    -- 获取分类ID
    SELECT id INTO mobile_cat_id FROM public.ml_categories WHERE slug = 'mobile';
    SELECT id INTO computer_cat_id FROM public.ml_categories WHERE slug = 'computer';
    SELECT id INTO mens_wear_cat_id FROM public.ml_categories WHERE slug = 'mens-wear';
    SELECT id INTO womens_wear_cat_id FROM public.ml_categories WHERE slug = 'womens-wear';
    SELECT id INTO furniture_cat_id FROM public.ml_categories WHERE slug = 'furniture';
    SELECT id INTO fruits_cat_id FROM public.ml_categories WHERE slug = 'fruits';
    
    -- 获取品牌ID
    SELECT id INTO apple_brand_id FROM public.ml_brands WHERE name = '苹果';
    SELECT id INTO huawei_brand_id FROM public.ml_brands WHERE name = '华为';
    SELECT id INTO xiaomi_brand_id FROM public.ml_brands WHERE name = '小米';
    SELECT id INTO nike_brand_id FROM public.ml_brands WHERE name = '耐克';
    SELECT id INTO uniqlo_brand_id FROM public.ml_brands WHERE name = '优衣库';
    SELECT id INTO ikea_brand_id FROM public.ml_brands WHERE name = '宜家';
    
    -- 获取商家ID
    SELECT user_id INTO merchant1_id FROM temp_user_ids WHERE role = 'merchant1';
    SELECT user_id INTO merchant2_id FROM temp_user_ids WHERE role = 'merchant2';
    
    -- 插入商品数据 - 商家1的数码产品
    INSERT INTO public.ml_products (
        merchant_id, category_id, brand_id, product_code, name, subtitle, description,
        main_image_url, image_urls, base_price, market_price, total_stock, available_stock,
        weight, status, is_featured, is_new, is_hot, tags, slug
    ) VALUES
    -- iPhone 15 Pro
    (merchant1_id, mobile_cat_id, apple_brand_id, 'IP15P-001', 
     'iPhone 15 Pro 256GB 深空黑色', 
     'A17 Pro芯片，钛金属设计，专业级摄像头系统',
     '全新iPhone 15 Pro采用航空级钛金属设计，搭载A17 Pro芯片，配备专业级摄像头系统，支持5G网络。48MP主摄像头，2倍变焦，4K视频录制。',
     'https://picsum.photos/600/600?random=10',
     '["https://picsum.photos/600/600?random=11", "https://picsum.photos/600/600?random=12", "https://picsum.photos/600/600?random=13"]',
     8999.00, 9999.00, 50, 45, 0.187, 1, true, true, true,
     ARRAY['手机', '苹果', 'iPhone', '5G', '新品'], 'iphone-15-pro-256gb-black'),
     
    -- 华为 Mate 60 Pro
    (merchant1_id, mobile_cat_id, huawei_brand_id, 'HW-M60P-001',
     '华为 Mate 60 Pro 512GB 雅川青',
     '卫星通话，昆仑玻璃，超聚光夜拍',
     '华为Mate 60 Pro支持卫星通话功能，采用昆仑玻璃，配备超聚光夜拍摄像头，5000万像素主摄，支持100倍数字变焦。',
     'https://picsum.photos/600/600?random=20',
     '["https://picsum.photos/600/600?random=21", "https://picsum.photos/600/600?random=22"]',
     6999.00, 7999.00, 30, 28, 0.225, 1, true, false, true,
     ARRAY['手机', '华为', 'Mate', '卫星通话'], 'huawei-mate-60-pro-512gb'),
     
    -- 小米笔记本
    (merchant1_id, computer_cat_id, xiaomi_brand_id, 'XM-NB-001',
     '小米笔记本 Pro 14 增强版',
     '2.8K OLED屏幕，12代酷睿处理器',
     '14英寸2.8K OLED全面屏，120Hz刷新率，第12代Intel Core处理器，16GB内存，512GB固态硬盘，雷电4接口。',
     'https://picsum.photos/600/600?random=30',
     '["https://picsum.photos/600/600?random=31", "https://picsum.photos/600/600?random=32"]',
     5999.00, 6999.00, 20, 18, 1.4, 1, false, true, false,
     ARRAY['笔记本', '小米', 'OLED', '办公'], 'xiaomi-notebook-pro-14');
     
    -- 插入商品数据 - 商家2的时尚产品
    INSERT INTO public.ml_products (
        merchant_id, category_id, brand_id, product_code, name, subtitle, description,
        main_image_url, image_urls, base_price, market_price, total_stock, available_stock,
        weight, status, is_featured, is_new, is_hot, tags, slug
    ) VALUES
    -- 耐克运动鞋
    (merchant2_id, mens_wear_cat_id, nike_brand_id, 'NK-AIR-001',
     'Nike Air Max 270 男士运动鞋',
     '全掌气垫，舒适透气，时尚百搭',
     'Nike Air Max 270采用全新的Air Max气垫设计，提供卓越的缓震效果。透气网面鞋身，轻量化设计，适合日常运动和休闲穿着。',
     'https://picsum.photos/600/600?random=40',
     '["https://picsum.photos/600/600?random=41", "https://picsum.photos/600/600?random=42"]',
     899.00, 1099.00, 100, 95, 0.8, 1, true, false, true,
     ARRAY['运动鞋', '耐克', '气垫', '男鞋'], 'nike-air-max-270-mens'),
     
    -- 优衣库T恤
    (merchant2_id, mens_wear_cat_id, uniqlo_brand_id, 'UQ-TEE-001',
     'UNIQLO 优质棉圆领T恤（短袖）',
     '100%纯棉，柔软舒适，多色可选',
     '采用100%精选纯棉制作，触感柔软，吸汗透气。简约设计，多种颜色可选，是日常穿搭的必备单品。',
     'https://picsum.photos/600/600?random=50',
     '["https://picsum.photos/600/600?random=51", "https://picsum.photos/600/600?random=52"]',
     59.00, 79.00, 200, 180, 0.2, 1, false, false, false,
     ARRAY['T恤', '优衣库', '纯棉', '基础款'], 'uniqlo-cotton-tshirt'),
     
    -- 女装连衣裙
    (merchant2_id, womens_wear_cat_id, uniqlo_brand_id, 'UQ-DRESS-001',
     'UNIQLO 女装雪纺连衣裙',
     '轻盈雪纺面料，优雅飘逸，职场通勤',
     '采用轻盈雪纺面料，版型优雅，适合职场通勤和日常聚会。A字版型修饰身形，多种花色可选。',
     'https://picsum.photos/600/600?random=60',
     '["https://picsum.photos/600/600?random=61", "https://picsum.photos/600/600?random=62"]',
     299.00, 399.00, 80, 75, 0.3, 1, true, true, false,
     ARRAY['连衣裙', '优衣库', '雪纺', '女装'], 'uniqlo-chiffon-dress');
END $$;

-- =====================================================================================
-- 9. 商品SKU数据
-- =====================================================================================

-- 为iPhone添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT 
    p.id,
    'IP15P-' || color.code || '-' || storage.code,
    jsonb_build_object('颜色', color.name, '存储容量', storage.name),
    p.base_price + storage.price_diff,
    p.market_price + storage.price_diff,
    15,
    'https://picsum.photos/400/400?random=' || (10 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES 
    (1, 'BLK', '深空黑色', 0),
    (2, 'WHT', '白色钛金属', 0),
    (3, 'BLU', '蓝色钛金属', 0)
) AS color(id, code, name, price_diff)
CROSS JOIN (VALUES
    (1, '128G', '128GB', -1000),
    (2, '256G', '256GB', 0),
    (3, '512G', '512GB', 1500)
) AS storage(id, code, name, price_diff)
WHERE p.product_code = 'IP15P-001';

-- 为运动鞋添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT 
    p.id,
    'NK-AIR-' || color.code || '-' || size.code,
    jsonb_build_object('颜色', color.name, '尺码', size.name),
    p.base_price,
    p.market_price,
    10,
    'https://picsum.photos/400/400?random=' || (40 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES 
    (1, 'BLK', '黑色'),
    (2, 'WHT', '白色'),
    (3, 'RED', '红色')
) AS color(id, code, name)
CROSS JOIN (VALUES
    (1, '40', '40码'),
    (2, '41', '41码'),
    (3, '42', '42码'),
    (4, '43', '43码'),
    (5, '44', '44码')
) AS size(id, code, name)
WHERE p.product_code = 'NK-AIR-001';

-- 为T恤添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT 
    p.id,
    'UQ-TEE-' || color.code || '-' || size.code,
    jsonb_build_object('颜色', color.name, '尺码', size.name),
    p.base_price,
    p.market_price,
    25,
    'https://picsum.photos/400/400?random=' || (50 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES 
    (1, 'WHT', '白色'),
    (2, 'BLK', '黑色'),
    (3, 'GRY', '灰色'),
    (4, 'NVY', '深蓝色')
) AS color(id, code, name)
CROSS JOIN (VALUES
    (1, 'S', 'S'),
    (2, 'M', 'M'),
    (3, 'L', 'L'),
    (4, 'XL', 'XL')
) AS size(id, code, name)
WHERE p.product_code = 'UQ-TEE-001';

-- =====================================================================================
-- 10. 购物车数据
-- =====================================================================================

-- 为消费者添加购物车数据
INSERT INTO public.ml_shopping_cart (user_id, product_id, sku_id, quantity, selected)
SELECT 
    customer.user_id,
    p.id,
    s.id,
    CASE 
        WHEN customer.role = 'customer1' THEN 1
        WHEN customer.role = 'customer2' THEN 2
        ELSE 1
    END,
    true
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
LEFT JOIN public.ml_product_skus s ON p.id = s.product_id
WHERE customer.role IN ('customer1', 'customer2', 'customer3')
  AND p.status = 1
  AND (s.id IS NULL OR s.status = 1)
  AND random() < 0.3 -- 30%的概率添加到购物车
LIMIT 15;

-- =====================================================================================
-- 11. 优惠券数据
-- =====================================================================================

-- 创建优惠券模板
INSERT INTO public.ml_coupon_templates (
    merchant_id, name, description, coupon_type, discount_type, discount_value,
    min_order_amount, max_discount_amount, total_quantity, per_user_limit,
    start_time, end_time, status
) VALUES
-- 平台券
(NULL, '新用户专享券', '新用户注册即送50元无门槛券', 1, 1, 50.00, 0, 50.00, 1000, 1, 
 NOW() - INTERVAL '1 day', NOW() + INTERVAL '30 days', 1),
(NULL, '满200减30', '全平台满200元减30元', 1, 1, 30.00, 200.00, 30.00, 500, 3,
 NOW() - INTERVAL '1 day', NOW() + INTERVAL '15 days', 1),
(NULL, '9折优惠券', '全平台9折优惠，最高减100元', 2, 2, 0.9, 100.00, 100.00, 200, 1,
 NOW() - INTERVAL '1 day', NOW() + INTERVAL '7 days', 1),

-- 商家券
((SELECT user_id FROM temp_user_ids WHERE role = 'merchant1'), 
 '数码专营店满1000减100', '店铺满1000元减100元', 1, 1, 100.00, 1000.00, 100.00, 100, 2,
 NOW() - INTERVAL '1 day', NOW() + INTERVAL '20 days', 1),
((SELECT user_id FROM temp_user_ids WHERE role = 'merchant2'), 
 '时尚小铺免运费券', '店铺订单免运费', 3, 1, 15.00, 0, 15.00, 50, 1,
 NOW() - INTERVAL '1 day', NOW() + INTERVAL '10 days', 1);

-- 为用户发放优惠券
INSERT INTO public.ml_user_coupons (user_id, template_id, coupon_code, status, expire_at)
SELECT 
    customer.user_id,
    t.id,
    public.generate_coupon_code(),
    1, -- 未使用
    t.end_time
FROM temp_user_ids customer
CROSS JOIN public.ml_coupon_templates t
WHERE customer.role IN ('customer1', 'customer2', 'customer3')
  AND t.status = 1
  AND random() < 0.6; -- 60%的概率获得优惠券

-- =====================================================================================
-- 12. 订单数据
-- =====================================================================================

-- 生成订单数据
DO $$
DECLARE
    customer_rec RECORD;
    selected_merchant_id UUID;
    product_rec RECORD;
    order_id UUID;
    order_no TEXT;
    total_amount DECIMAL;
BEGIN
    -- 为每个客户生成2-4个订单
    FOR customer_rec IN 
        SELECT user_id, role FROM temp_user_ids WHERE role LIKE 'customer%'
    LOOP
        FOR i IN 1..FLOOR(2 + random() * 3)::INTEGER LOOP
            -- 生成订单号
            order_no := public.generate_order_no();
            
            -- 随机选择商家
            SELECT user_id INTO selected_merchant_id FROM temp_user_ids 
            WHERE role LIKE 'merchant%' 
            ORDER BY random() LIMIT 1;
            
            -- 计算订单总金额（这里简化，实际应该根据商品计算）
            total_amount := 100 + random() * 2000;
            
            -- 创建订单
            INSERT INTO public.ml_orders (
                id, order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount,
                shipping_address, order_status, payment_status, shipping_status,
                paid_at, shipped_at, delivered_at,
                remark, created_at
            ) VALUES (
                uuid_generate_v4(), order_no, customer_rec.user_id, selected_merchant_id,
                total_amount - 10, 10.00, total_amount,
                jsonb_build_object(
                    'receiver_name', '收货人姓名',
                    'receiver_phone', '13800138000',
                    'province', '北京市',
                    'city', '朝阳区',
                    'district', '望京街道',
                    'address_detail', '望京SOHO T1座 1201室'
                ),
                CASE 
                    WHEN random() < 0.6 THEN 4 -- 已完成
                    WHEN random() < 0.8 THEN 3 -- 待收货
                    WHEN random() < 0.9 THEN 2 -- 待发货
                    ELSE 1 -- 待付款
                END,
                CASE 
                    WHEN random() < 0.8 THEN 2 -- 已付款
                    ELSE 1 -- 未付款
                END,
                CASE 
                    WHEN random() < 0.7 THEN 4 -- 已送达
                    WHEN random() < 0.85 THEN 3 -- 运输中
                    WHEN random() < 0.9 THEN 2 -- 已发货
                    ELSE 1 -- 未发货
                END,
                CASE WHEN random() < 0.8 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 10) END,
                CASE WHEN random() < 0.7 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 8) END,
                CASE WHEN random() < 0.6 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 5) END,
                '请尽快发货，谢谢！',
                NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
            ) RETURNING id INTO order_id;
            
            -- 为订单添加商品
            FOR product_rec IN 
                SELECT 
                    p.id as product_id, 
                    s.id as sku_id, 
                    p.name, 
                    COALESCE(s.price, p.base_price) as price, -- 使用SKU价格，如果没有则使用基础价格
                    COALESCE(s.image_url, p.main_image_url) as image_url -- 使用SKU图片，如果没有则使用主图
                FROM public.ml_products p
                LEFT JOIN public.ml_product_skus s ON p.id = s.product_id
                WHERE p.merchant_id = selected_merchant_id
                  AND p.status = 1
                  AND (s.id IS NULL OR s.status = 1)
                ORDER BY random()
                LIMIT FLOOR(1 + random() * 3)::INTEGER
            LOOP
                DECLARE
                    item_quantity INTEGER;
                    item_price DECIMAL;
                BEGIN
                    item_quantity := FLOOR(1 + random() * 2)::INTEGER;
                    item_price := product_rec.price;
                    
                    INSERT INTO public.ml_order_items (
                        order_id, product_id, sku_id, product_name,
                        price, quantity, total_amount, image_url
                    ) VALUES (
                        order_id, product_rec.product_id, product_rec.sku_id, product_rec.name,
                        item_price, item_quantity,
                        item_price * item_quantity,
                        product_rec.image_url
                    );
                END;
            END LOOP;
        END LOOP;
    END LOOP;
END $$;

-- =====================================================================================
-- 13. 商品评价数据
-- =====================================================================================

-- 为已完成的订单生成评价
INSERT INTO public.ml_product_reviews (
    order_id, order_item_id, user_id, product_id, merchant_id,
    rating, content, images, is_anonymous, status, created_at
)
SELECT 
    o.id,
    oi.id,
    o.user_id,
    oi.product_id,
    o.merchant_id,
    FLOOR(3 + random() * 3)::INTEGER, -- 3-5星评价
    CASE 
        WHEN random() < 0.3 THEN '商品质量很好，物流很快，推荐购买！'
        WHEN random() < 0.6 THEN '包装完好，商品和描述一致，满意的购物体验。'
        WHEN random() < 0.8 THEN '性价比不错，会再次购买的。'
        ELSE '商品不错，快递也很快，好评！'
    END,
    CASE 
        WHEN random() < 0.3 THEN '["https://picsum.photos/300/300?random=' || FLOOR(random() * 100)::INTEGER || '"]'
        ELSE '[]'
    END::JSONB,
    random() < 0.1, -- 10%匿名评价
    1, -- 正常状态
    o.delivered_at + INTERVAL '1 day' * FLOOR(random() * 10)
FROM public.ml_orders o
JOIN public.ml_order_items oi ON o.id = oi.order_id
WHERE o.order_status = 4 -- 已完成的订单
  AND o.delivered_at IS NOT NULL
  AND random() < 0.7; -- 70%的概率有评价

-- =====================================================================================
-- 14. 用户行为数据
-- =====================================================================================

-- 用户收藏数据
INSERT INTO public.ml_user_favorites (user_id, target_type, target_id)
SELECT 
    customer.user_id,
    1, -- 商品收藏
    p.id
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
WHERE customer.role LIKE 'customer%'
  AND p.status = 1
  AND random() < 0.2 -- 20%的概率收藏
ON CONFLICT (user_id, target_type, target_id) DO NOTHING;

-- 店铺收藏
INSERT INTO public.ml_user_favorites (user_id, target_type, target_id)
SELECT 
    customer.user_id,
    2, -- 店铺收藏
    s.merchant_id
FROM temp_user_ids customer
CROSS JOIN public.ml_shops s
WHERE customer.role LIKE 'customer%'
  AND random() < 0.3 -- 30%的概率收藏店铺
ON CONFLICT (user_id, target_type, target_id) DO NOTHING;

-- 浏览历史数据
INSERT INTO public.ml_browse_history (user_id, product_id, browse_duration, created_at, updated_at)
SELECT 
    customer.user_id,
    p.id,
    FLOOR(10 + random() * 300)::INTEGER, -- 10-300秒浏览时长
    NOW() - INTERVAL '1 day' * FLOOR(random() * 30), -- 30天内的浏览记录
    NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
WHERE customer.role LIKE 'customer%'
  AND p.status = 1
  AND random() < 0.4 -- 40%的概率有浏览记录
ON CONFLICT (user_id, product_id) DO UPDATE SET
    browse_duration = EXCLUDED.browse_duration,
    updated_at = EXCLUDED.updated_at;

-- 搜索历史数据
INSERT INTO public.ml_search_history (user_id, keyword, result_count, created_at)
SELECT 
    customer.user_id,
    keyword.word,
    FLOOR(1 + random() * 50)::INTEGER, -- 1-50个结果
    NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
FROM temp_user_ids customer
CROSS JOIN (VALUES 
    ('iPhone'), ('华为手机'), ('笔记本电脑'), ('运动鞋'), 
    ('T恤'), ('连衣裙'), ('耳机'), ('充电器'), ('数据线'), ('手机壳')
) AS keyword(word)
WHERE customer.role LIKE 'customer%'
  AND random() < 0.3; -- 30%的概率有搜索记录

-- =====================================================================================
-- 15. 配送数据
-- =====================================================================================

-- 配送员信息
INSERT INTO public.ml_delivery_drivers (
    user_id, real_name, id_card, driver_license, vehicle_type, vehicle_number,
    service_areas, work_status, current_lat, current_lng, status
)
SELECT 
    t.user_id,
    CASE 
        WHEN t.role = 'driver1' THEN '赵配送'
        WHEN t.role = 'driver2' THEN '钱师傅'
    END,
    CASE 
        WHEN t.role = 'driver1' THEN '110101199001011234'
        WHEN t.role = 'driver2' THEN '110101199002022345'
    END,
    CASE 
        WHEN t.role = 'driver1' THEN 'D110101199001011234'
        WHEN t.role = 'driver2' THEN 'D110101199002022345'
    END,
    1, -- 电动车
    CASE 
        WHEN t.role = 'driver1' THEN '京A12345'
        WHEN t.role = 'driver2' THEN '京A67890'
    END,
    '["朝阳区", "海淀区", "东城区"]'::JSONB,
    1, -- 在线
    39.9042 + (random() - 0.5) * 0.01,
    116.4074 + (random() - 0.5) * 0.01,
    1 -- 正常状态
FROM temp_user_ids t
WHERE t.role LIKE 'driver%';

-- 配送任务（为部分已发货订单创建配送任务）
INSERT INTO public.ml_delivery_tasks (
    order_id, driver_id, pickup_address, delivery_address,
    distance, estimated_time, delivery_fee, status,
    assigned_at, picked_at, delivered_at, delivery_code
)
SELECT DISTINCT ON (o.id) -- 确保每个订单只有一个配送任务
    o.id,
    d.id,
    jsonb_build_object(
        'name', '商家仓库',
        'phone', '010-12345678',
        'address', '北京市朝阳区望京商业中心'
    ),
    o.shipping_address,
    ROUND((5 + random() * 15)::NUMERIC, 2), -- 5-20公里
    FLOOR(20 + random() * 40)::INTEGER, -- 20-60分钟
    CASE 
        WHEN (o.shipping_address->>'district') = '朝阳区' THEN 8.00
        ELSE 12.00
    END,
    CASE 
        WHEN o.order_status >= 4 THEN 5 -- 已送达
        WHEN o.order_status >= 3 THEN 4 -- 配送中
        WHEN o.shipping_status >= 2 THEN 2 -- 已接单
        ELSE 1 -- 待接单
    END,
    o.shipped_at,
    CASE WHEN o.order_status >= 3 THEN o.shipped_at + INTERVAL '30 minutes' END,
    CASE WHEN o.order_status >= 4 THEN o.delivered_at END,
    LPAD(FLOOR(random() * 10000)::TEXT, 4, '0') -- 4位取货码
FROM public.ml_orders o
CROSS JOIN public.ml_delivery_drivers d
WHERE o.shipping_status >= 2 -- 已发货的订单
  AND random() < 0.8 -- 80%的概率有配送任务
  AND NOT EXISTS ( -- 确保订单尚未有配送任务
      SELECT 1 FROM public.ml_delivery_tasks dt WHERE dt.order_id = o.id
  )
ORDER BY o.id, random() -- 每个订单随机选择一个配送员
LIMIT 50; -- 限制配送任务数量，避免过多数据

-- =====================================================================================
-- 16. 更新统计数据
-- =====================================================================================

-- 更新商品统计数据
UPDATE public.ml_products SET
    view_count = FLOOR(100 + random() * 9900)::INTEGER,
    sale_count = (
        SELECT COALESCE(SUM(oi.quantity), 0)
        FROM public.ml_order_items oi
        JOIN public.ml_orders o ON oi.order_id = o.id
        WHERE oi.product_id = ml_products.id
          AND o.order_status = 4
    ),
    favorite_count = (
        SELECT COUNT(*)
        FROM public.ml_user_favorites f
        WHERE f.target_type = 1
          AND f.target_id = ml_products.id
    ),
    rating_avg = (
        SELECT COALESCE(AVG(rating), 0)
        FROM public.ml_product_reviews r
        WHERE r.product_id = ml_products.id
          AND r.status = 1
    ),
    rating_count = (
        SELECT COUNT(*)
        FROM public.ml_product_reviews r
        WHERE r.product_id = ml_products.id
          AND r.status = 1
    );

-- 更新店铺统计数据
UPDATE public.ml_shops SET
    product_count = (
        SELECT COUNT(*)
        FROM public.ml_products p
        WHERE p.merchant_id = ml_shops.merchant_id
          AND p.status = 1
    ),
    order_count = (
        SELECT COUNT(*)
        FROM public.ml_orders o
        WHERE o.merchant_id = ml_shops.merchant_id
          AND o.order_status = 4
    ),
    rating_avg = (
        SELECT COALESCE(AVG(r.rating), 0)
        FROM public.ml_product_reviews r
        WHERE r.merchant_id = ml_shops.merchant_id
          AND r.status = 1
    ),
    rating_count = (
        SELECT COUNT(*)
        FROM public.ml_product_reviews r
        WHERE r.merchant_id = ml_shops.merchant_id
          AND r.status = 1
    );

-- 更新配送员统计数据
UPDATE public.ml_delivery_drivers SET
    order_count = (
        SELECT COUNT(*)
        FROM public.ml_delivery_tasks dt
        WHERE dt.driver_id = ml_delivery_drivers.id
          AND dt.status = 5
    ),
    rating_avg = 4.5 + random() * 0.5, -- 4.5-5.0星评价
    rating_count = FLOOR(10 + random() * 90)::INTEGER; -- 10-100个评价

-- =====================================================================================
-- 17. 清理临时数据
-- =====================================================================================

DROP TABLE IF EXISTS temp_user_ids;

-- =====================================================================================
-- 18. 完成提示
-- =====================================================================================

DO $$
BEGIN
    RAISE NOTICE '=======================================================';
    RAISE NOTICE '商城系统模拟数据插入完成！';
    RAISE NOTICE '=======================================================';
    RAISE NOTICE '已创建数据概况：';
    RAISE NOTICE '- 测试用户: 8个 (管理员1个, 商家2个, 消费者3个, 配送员2个)';
    RAISE NOTICE '- 用户地址: 7个';
    RAISE NOTICE '- 商品分类: 多级分类体系';
    RAISE NOTICE '- 品牌: 10个知名品牌';
    RAISE NOTICE '- 店铺: 2个商家店铺';
    RAISE NOTICE '- 商品: 6个商品 + 多规格SKU';
    RAISE NOTICE '- 购物车: 随机购物车数据';
    RAISE NOTICE '- 优惠券: 5个优惠券模板 + 用户优惠券';
    RAISE NOTICE '- 订单: 多个测试订单 + 订单商品';
    RAISE NOTICE '- 商品评价: 基于完成订单的评价';
    RAISE NOTICE '- 用户行为: 收藏、浏览、搜索记录';
    RAISE NOTICE '- 配送数据: 配送员 + 配送任务';
    RAISE NOTICE '=======================================================';
    RAISE NOTICE '数据状态: 包含各种业务场景的测试数据';
    RAISE NOTICE '建议: 可根据实际需要调整数据量和内容';
    RAISE NOTICE '=======================================================';
END $$;
