-- 从 member_user 迁移数据到 ak_users 的SQL脚本
-- 创建日期: 2025-06-23
-- 用途: 将智跑系统的用户数据迁移到新的ak_users表结构

-- =============================================================================
-- 1. 数据迁移前的准备工作
-- =============================================================================

-- 检查源表数据
SELECT 
    COUNT(*) as total_member_users,
    COUNT(DISTINCT user_id) as unique_user_ids,
    COUNT(CASE WHEN deleted = true THEN 1 END) as deleted_users
FROM public.member_user;

-- 检查目标表当前数据
SELECT COUNT(*) as current_ak_users FROM public.ak_users;

-- =============================================================================
-- 2. 数据迁移主脚本
-- =============================================================================

-- 插入数据到 ak_users 表
INSERT INTO public.ak_users (
    id,                    -- 使用 member_user.user_id
    username,              -- 使用 nickname 或 name
    email,                 -- 需要生成或使用手机号@domain
    password_hash,         -- 使用 member_user.password
    gender,                -- 转换 sex 字段
    birthday,              -- 转换 birthday 字段
    height_cm,             -- 默认为 NULL
    weight_kg,             -- 默认为 NULL
    avatar_url,            -- 使用 avatar 字段
    region_id,             -- 默认为 NULL（需要后续映射）
    school_id,             -- 默认为 NULL（需要后续映射）
    grade_id,              -- 默认为 NULL（需要后续映射）
    class_id,              -- 默认为 NULL（需要后续映射）
    role,                  -- 默认为 'student'
    created_at,            -- 使用 create_time
    updated_at,            -- 使用 update_time
    auth_id,               -- 使用 user_id（关联 users 表）
    preferred_language,    -- 默认为 NULL
    bio,                   -- 使用 mark 字段
    phone                  -- 使用 mobile 字段
)
SELECT 
    mu.user_id,                                                    -- id
    COALESCE(                                                      -- username
        NULLIF(TRIM(mu.nickname), ''), 
        NULLIF(TRIM(mu.name), ''), 
        'user_' || EXTRACT(EPOCH FROM mu.create_time)::bigint
    ),
    CASE                                                           -- email
        WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != '''''' 
        THEN mu.mobile || '@akmon.local'
        ELSE 'user_' || mu.id || '@akmon.local'
    END,
    CASE                                                           -- password_hash
        WHEN mu.password IS NOT NULL AND mu.password != '' 
        THEN mu.password
        ELSE gen_random_uuid()::text
    END,
    CASE                                                           -- gender
        WHEN mu.sex = 1 THEN 'male'
        WHEN mu.sex = 2 THEN 'female'
        ELSE 'other'
    END,
    mu.birthday::date,                                             -- birthday
    NULL,                                                          -- height_cm
    NULL,                                                          -- weight_kg
    CASE                                                           -- avatar_url
        WHEN mu.avatar IS NOT NULL AND mu.avatar != '' 
        THEN mu.avatar
        ELSE NULL
    END,
    NULL,                                                          -- region_id
    NULL,                                                          -- school_id
    NULL,                                                          -- grade_id
    NULL,                                                          -- class_id
    'student',                                                     -- role (默认为学生)
    mu.create_time AT TIME ZONE 'UTC',                            -- created_at
    mu.update_time AT TIME ZONE 'UTC',                            -- updated_at
    mu.user_id,                                                    -- auth_id
    NULL,                                                          -- preferred_language
    CASE                                                           -- bio
        WHEN mu.mark IS NOT NULL AND TRIM(mu.mark) != '' 
        THEN mu.mark
        ELSE NULL
    END,
    CASE                                                           -- phone
        WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != '''''' 
        THEN mu.mobile
        ELSE NULL
    END
FROM public.member_user mu
WHERE mu.deleted = false                                           -- 只迁移未删除的用户
  AND mu.user_id IS NOT NULL                                       -- 确保有有效的user_id
  AND NOT EXISTS (                                                 -- 避免重复插入
      SELECT 1 FROM public.ak_users au WHERE au.id = mu.user_id
  );

-- =============================================================================
-- 3. 数据迁移后的验证
-- =============================================================================

-- 验证迁移结果
SELECT 
    'Migration Summary' as check_type,
    COUNT(*) as migrated_users
FROM public.ak_users au
WHERE au.auth_id IS NOT NULL;

-- 检查是否有重复的用户名
SELECT 
    'Username Duplicates' as check_type,
    username,
    COUNT(*) as duplicate_count
FROM public.ak_users
GROUP BY username
HAVING COUNT(*) > 1;

-- 检查是否有重复的邮箱
SELECT 
    'Email Duplicates' as check_type,
    email,
    COUNT(*) as duplicate_count
FROM public.ak_users
GROUP BY email
HAVING COUNT(*) > 1;

-- 检查迁移的完整性
SELECT 
    'Data Integrity Check' as check_type,
    COUNT(DISTINCT mu.user_id) as source_users,
    COUNT(DISTINCT au.id) as migrated_users,
    COUNT(DISTINCT mu.user_id) - COUNT(DISTINCT au.id) as missing_users
FROM public.member_user mu
LEFT JOIN public.ak_users au ON mu.user_id = au.id
WHERE mu.deleted = false;

-- =============================================================================
-- 4. 可选的清理和优化操作
-- =============================================================================

-- 更新序列（如果需要）
-- SELECT setval('ak_users_id_seq', (SELECT MAX(id) FROM ak_users));

-- 分析表以优化查询性能
ANALYZE public.ak_users;

-- =============================================================================
-- 5. 回滚脚本（如果需要）
-- =============================================================================

-- 如果需要回滚迁移，可以使用以下脚本：
/*
-- 删除从 member_user 迁移过来的数据
DELETE FROM public.ak_users 
WHERE auth_id IN (
    SELECT user_id FROM public.member_user WHERE deleted = false
);
*/

-- =============================================================================
-- 6. 后续处理建议
-- =============================================================================

/*
迁移完成后，建议进行以下操作：

1. 更新 region_id, school_id, grade_id, class_id 字段
   - 根据业务逻辑映射到对应的新表

2. 设置用户角色
   - 根据 member_user 的 group_id 或其他字段设置正确的角色

3. 处理用户偏好设置
   - 如果有其他偏好数据需要迁移

4. 验证登录功能
   - 确保用户可以使用新的认证系统登录

5. 数据备份
   - 在生产环境执行前务必备份原始数据
*/
