-- ========================================
-- 005-validate-all.sql
-- ========================================
-- 目的：全局验证10个Schema和数据迁移的完整性
-- 预计时间：10分钟
-- 作者：AI助手
-- 日期：2025-11-09
-- ========================================

-- 前置条件：
-- 1. 已执行 001-create-all-10-schemas.sql
-- 2. 已执行 002-migrate-platform.sql
-- 3. 已执行 003-migrate-aia.sql
-- 4. 已执行 004-migrate-pkb.sql

-- ========================================
-- 第一部分：Schema完整性验证
-- ========================================

\echo '========================================';
\echo '第一部分：Schema完整性验证';
\echo '========================================';

SELECT 
    'Schema检查' AS check_type,
    nspname AS schema_name,
    CASE 
        WHEN nspname IN ('platform_schema', 'aia_schema', 'pkb_schema', 
                         'asl_schema', 'common_schema', 'dc_schema',
                         'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema')
        THEN '✅ 存在'
        ELSE '❌ 不存在'
    END AS status,
    pg_catalog.obj_description(oid, 'pg_namespace') AS description
FROM pg_namespace
WHERE nspname IN (
    'platform_schema', 'aia_schema', 'pkb_schema',
    'asl_schema', 'common_schema', 'dc_schema',
    'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
)
ORDER BY nspname;

-- 统计Schema数量
DO $$
DECLARE
    schema_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO schema_count
    FROM pg_namespace
    WHERE nspname IN (
        'platform_schema', 'aia_schema', 'pkb_schema',
        'asl_schema', 'common_schema', 'dc_schema',
        'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
    );
    
    RAISE NOTICE '========================================';
    IF schema_count = 10 THEN
        RAISE NOTICE '✅ Schema完整性检查通过：10个Schema全部创建成功';
    ELSE
        RAISE WARNING '❌ Schema完整性检查失败：预期10个，实际%个', schema_count;
    END IF;
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第二部分：表结构验证
-- ========================================

\echo '';
\echo '========================================';
\echo '第二部分：表结构验证';
\echo '========================================';

SELECT 
    'platform_schema' AS schema_name,
    tablename AS table_name,
    '✅' AS status
FROM pg_tables
WHERE schemaname = 'platform_schema'

UNION ALL

SELECT 
    'aia_schema',
    tablename,
    '✅'
FROM pg_tables
WHERE schemaname = 'aia_schema'

UNION ALL

SELECT 
    'pkb_schema',
    tablename,
    '✅'
FROM pg_tables
WHERE schemaname = 'pkb_schema'

ORDER BY schema_name, table_name;

-- 统计各Schema的表数量
DO $$
DECLARE
    platform_tables INTEGER;
    aia_tables INTEGER;
    pkb_tables INTEGER;
    all_ok BOOLEAN := true;
BEGIN
    SELECT COUNT(*) INTO platform_tables FROM pg_tables WHERE schemaname = 'platform_schema';
    SELECT COUNT(*) INTO aia_tables FROM pg_tables WHERE schemaname = 'aia_schema';
    SELECT COUNT(*) INTO pkb_tables FROM pg_tables WHERE schemaname = 'pkb_schema';
    
    RAISE NOTICE '========================================';
    RAISE NOTICE 'platform_schema: % 个表 (预期1个)', platform_tables;
    RAISE NOTICE 'aia_schema: % 个表 (预期5个)', aia_tables;
    RAISE NOTICE 'pkb_schema: % 个表 (预期5个)', pkb_tables;
    RAISE NOTICE '========================================';
    
    IF platform_tables != 1 THEN
        RAISE WARNING '❌ platform_schema表数量异常';
        all_ok := false;
    END IF;
    
    IF aia_tables != 5 THEN
        RAISE WARNING '❌ aia_schema表数量异常';
        all_ok := false;
    END IF;
    
    IF pkb_tables != 5 THEN
        RAISE WARNING '❌ pkb_schema表数量异常';
        all_ok := false;
    END IF;
    
    IF all_ok THEN
        RAISE NOTICE '✅ 表结构验证通过：所有表创建成功';
    END IF;
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第三部分：数据量对比验证
-- ========================================

\echo '';
\echo '========================================';
\echo '第三部分：数据量对比验证';
\echo '========================================';

-- 3.1 Platform Schema
SELECT 
    'users' AS table_name,
    (SELECT COUNT(*) FROM public.users) AS public_count,
    (SELECT COUNT(*) FROM platform_schema.users) AS migrated_count,
    CASE 
        WHEN (SELECT COUNT(*) FROM public.users) = (SELECT COUNT(*) FROM platform_schema.users)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END AS status
WHERE EXISTS (SELECT 1 FROM public.users LIMIT 1);

-- 3.2 AIA Schema
SELECT 
    'projects' AS table_name,
    (SELECT COUNT(*) FROM public.projects) AS public_count,
    (SELECT COUNT(*) FROM aia_schema.projects) AS migrated_count,
    CASE 
        WHEN (SELECT COUNT(*) FROM public.projects) = (SELECT COUNT(*) FROM aia_schema.projects)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END AS status

UNION ALL

SELECT 
    'conversations',
    (SELECT COUNT(*) FROM public.conversations),
    (SELECT COUNT(*) FROM aia_schema.conversations),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.conversations) = (SELECT COUNT(*) FROM aia_schema.conversations)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'messages',
    (SELECT COUNT(*) FROM public.messages),
    (SELECT COUNT(*) FROM aia_schema.messages),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.messages) = (SELECT COUNT(*) FROM aia_schema.messages)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'general_conversations',
    (SELECT COUNT(*) FROM public.general_conversations),
    (SELECT COUNT(*) FROM aia_schema.general_conversations),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.general_conversations) = (SELECT COUNT(*) FROM aia_schema.general_conversations)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'general_messages',
    (SELECT COUNT(*) FROM public.general_messages),
    (SELECT COUNT(*) FROM aia_schema.general_messages),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.general_messages) = (SELECT COUNT(*) FROM aia_schema.general_messages)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END;

-- 3.3 PKB Schema
SELECT 
    'knowledge_bases' AS table_name,
    (SELECT COUNT(*) FROM public.knowledge_bases) AS public_count,
    (SELECT COUNT(*) FROM pkb_schema.knowledge_bases) AS migrated_count,
    CASE 
        WHEN (SELECT COUNT(*) FROM public.knowledge_bases) = (SELECT COUNT(*) FROM pkb_schema.knowledge_bases)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END AS status

UNION ALL

SELECT 
    'documents',
    (SELECT COUNT(*) FROM public.documents),
    (SELECT COUNT(*) FROM pkb_schema.documents),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.documents) = (SELECT COUNT(*) FROM pkb_schema.documents)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'batch_tasks',
    (SELECT COUNT(*) FROM public.batch_tasks),
    (SELECT COUNT(*) FROM pkb_schema.batch_tasks),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.batch_tasks) = (SELECT COUNT(*) FROM pkb_schema.batch_tasks)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'batch_results',
    (SELECT COUNT(*) FROM public.batch_results),
    (SELECT COUNT(*) FROM pkb_schema.batch_results),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.batch_results) = (SELECT COUNT(*) FROM pkb_schema.batch_results)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END

UNION ALL

SELECT 
    'task_templates',
    (SELECT COUNT(*) FROM public.task_templates),
    (SELECT COUNT(*) FROM pkb_schema.task_templates),
    CASE 
        WHEN (SELECT COUNT(*) FROM public.task_templates) = (SELECT COUNT(*) FROM pkb_schema.task_templates)
        THEN '✅ 一致'
        ELSE '❌ 不一致'
    END;

-- ========================================
-- 第四部分：外键约束验证
-- ========================================

\echo '';
\echo '========================================';
\echo '第四部分：外键约束验证';
\echo '========================================';

SELECT 
    tc.table_schema AS schema_name,
    tc.table_name,
    tc.constraint_name,
    kcu.column_name,
    ccu.table_schema AS foreign_schema,
    ccu.table_name AS foreign_table,
    ccu.column_name AS foreign_column,
    '✅' AS status
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
    ON tc.constraint_name = kcu.constraint_name
    AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage ccu
    ON ccu.constraint_name = tc.constraint_name
    AND ccu.table_schema = tc.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY'
    AND tc.table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema')
ORDER BY tc.table_schema, tc.table_name, tc.constraint_name;

-- 统计外键数量
DO $$
DECLARE
    fk_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO fk_count
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY'
        AND table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema');
    
    RAISE NOTICE '========================================';
    RAISE NOTICE '✅ 外键约束总数：%', fk_count;
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第五部分：跨Schema引用验证
-- ========================================

\echo '';
\echo '========================================';
\echo '第五部分：跨Schema引用验证';
\echo '========================================';

-- 验证所有引用platform_schema.users的外键是否有效
DO $$
DECLARE
    invalid_aia_projects INTEGER;
    invalid_aia_conversations INTEGER;
    invalid_aia_general_conversations INTEGER;
    invalid_pkb_knowledge_bases INTEGER;
    invalid_pkb_documents INTEGER;
    all_valid BOOLEAN := true;
BEGIN
    -- 验证aia_schema.projects
    SELECT COUNT(*) INTO invalid_aia_projects
    FROM aia_schema.projects p
    LEFT JOIN platform_schema.users u ON p.user_id = u.id
    WHERE u.id IS NULL;
    
    -- 验证aia_schema.conversations
    SELECT COUNT(*) INTO invalid_aia_conversations
    FROM aia_schema.conversations c
    LEFT JOIN platform_schema.users u ON c.user_id = u.id
    WHERE u.id IS NULL;
    
    -- 验证aia_schema.general_conversations
    SELECT COUNT(*) INTO invalid_aia_general_conversations
    FROM aia_schema.general_conversations gc
    LEFT JOIN platform_schema.users u ON gc.user_id = u.id
    WHERE u.id IS NULL;
    
    -- 验证pkb_schema.knowledge_bases
    SELECT COUNT(*) INTO invalid_pkb_knowledge_bases
    FROM pkb_schema.knowledge_bases kb
    LEFT JOIN platform_schema.users u ON kb.user_id = u.id
    WHERE u.id IS NULL;
    
    -- 验证pkb_schema.documents
    SELECT COUNT(*) INTO invalid_pkb_documents
    FROM pkb_schema.documents d
    LEFT JOIN platform_schema.users u ON d.user_id = u.id
    WHERE u.id IS NULL;
    
    RAISE NOTICE '========================================';
    RAISE NOTICE '跨Schema引用验证结果：';
    RAISE NOTICE '----------------------------------------';
    
    IF invalid_aia_projects > 0 THEN
        RAISE WARNING '❌ aia_schema.projects有%条无效user_id', invalid_aia_projects;
        all_valid := false;
    ELSE
        RAISE NOTICE '✅ aia_schema.projects外键全部有效';
    END IF;
    
    IF invalid_aia_conversations > 0 THEN
        RAISE WARNING '❌ aia_schema.conversations有%条无效user_id', invalid_aia_conversations;
        all_valid := false;
    ELSE
        RAISE NOTICE '✅ aia_schema.conversations外键全部有效';
    END IF;
    
    IF invalid_aia_general_conversations > 0 THEN
        RAISE WARNING '❌ aia_schema.general_conversations有%条无效user_id', invalid_aia_general_conversations;
        all_valid := false;
    ELSE
        RAISE NOTICE '✅ aia_schema.general_conversations外键全部有效';
    END IF;
    
    IF invalid_pkb_knowledge_bases > 0 THEN
        RAISE WARNING '❌ pkb_schema.knowledge_bases有%条无效user_id', invalid_pkb_knowledge_bases;
        all_valid := false;
    ELSE
        RAISE NOTICE '✅ pkb_schema.knowledge_bases外键全部有效';
    END IF;
    
    IF invalid_pkb_documents > 0 THEN
        RAISE WARNING '❌ pkb_schema.documents有%条无效user_id', invalid_pkb_documents;
        all_valid := false;
    ELSE
        RAISE NOTICE '✅ pkb_schema.documents外键全部有效';
    END IF;
    
    RAISE NOTICE '========================================';
    
    IF all_valid THEN
        RAISE NOTICE '✅ 所有跨Schema引用验证通过';
    ELSE
        RAISE WARNING '❌ 存在无效的跨Schema引用';
    END IF;
    
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第六部分：索引验证
-- ========================================

\echo '';
\echo '========================================';
\echo '第六部分：索引验证';
\echo '========================================';

SELECT 
    schemaname AS schema_name,
    tablename AS table_name,
    indexname AS index_name,
    '✅' AS status
FROM pg_indexes
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
ORDER BY schemaname, tablename, indexname;

-- 统计索引数量
DO $$
DECLARE
    index_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO index_count
    FROM pg_indexes
    WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
        AND indexname NOT LIKE '%pkey'; -- 排除主键索引
    
    RAISE NOTICE '========================================';
    RAISE NOTICE '✅ 非主键索引总数：%', index_count;
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第七部分：数据采样验证（抽样检查）
-- ========================================

\echo '';
\echo '========================================';
\echo '第七部分：数据采样验证';
\echo '========================================';

-- 采样验证：检查ID是否完全一致
DO $$
DECLARE
    user_ids_match BOOLEAN;
    project_ids_match BOOLEAN;
BEGIN
    -- 验证users的ID
    SELECT NOT EXISTS (
        SELECT id FROM public.users
        EXCEPT
        SELECT id FROM platform_schema.users
    ) AND NOT EXISTS (
        SELECT id FROM platform_schema.users
        EXCEPT
        SELECT id FROM public.users
    ) INTO user_ids_match;
    
    -- 验证projects的ID
    SELECT NOT EXISTS (
        SELECT id FROM public.projects
        EXCEPT
        SELECT id FROM aia_schema.projects
    ) AND NOT EXISTS (
        SELECT id FROM aia_schema.projects
        EXCEPT
        SELECT id FROM public.projects
    ) INTO project_ids_match;
    
    RAISE NOTICE '========================================';
    IF user_ids_match THEN
        RAISE NOTICE '✅ users表ID完全一致';
    ELSE
        RAISE WARNING '❌ users表ID存在差异';
    END IF;
    
    IF project_ids_match THEN
        RAISE NOTICE '✅ projects表ID完全一致';
    ELSE
        RAISE WARNING '❌ projects表ID存在差异';
    END IF;
    RAISE NOTICE '========================================';
END $$;

-- ========================================
-- 第八部分：最终总结报告
-- ========================================

\echo '';
\echo '========================================';
\echo '最终总结报告';
\echo '========================================';

SELECT 
    '✅ Schema隔离迁移验证完成' AS summary,
    (SELECT COUNT(*) FROM platform_schema.users) || ' users' AS platform,
    (SELECT COUNT(*) FROM aia_schema.projects) || ' projects, ' ||
    (SELECT COUNT(*) FROM aia_schema.conversations) || ' conversations' AS aia,
    (SELECT COUNT(*) FROM pkb_schema.knowledge_bases) || ' knowledge_bases, ' ||
    (SELECT COUNT(*) FROM pkb_schema.documents) || ' documents' AS pkb;

\echo '';
\echo '========================================';
\echo '✅ 所有验证完成！';
\echo '========================================';
\echo '下一步：';
\echo '1. 更新Prisma配置（schema.prisma）';
\echo '2. 生成Prisma Client';
\echo '3. 更新代码以使用新Schema';
\echo '4. 运行应用测试';
\echo '========================================';

-- ========================================
-- 完成
-- ========================================







