-- ===================================================================
-- 强力清理脚本：彻底删除所有新设计的全局配置表
-- 保留原有的 ak_global_config 表（单表+key后缀设计）
-- ===================================================================

-- 注意：此脚本会强制删除所有可能的新设计表和对象
-- 执行前请确保已备份重要数据！

-- 首先检查当前存在的表
DO $$
DECLARE
    rec RECORD;
BEGIN
    RAISE NOTICE '========================================';
    RAISE NOTICE '当前存在的配置相关表：';
    RAISE NOTICE '========================================';
    
    FOR rec IN 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = 'public' 
        AND (table_name LIKE '%config%' OR table_name LIKE '%language%')
        ORDER BY table_name
    LOOP
        RAISE NOTICE '表: %', rec.table_name;
    END LOOP;
    
    RAISE NOTICE '========================================';
END $$;

-- 1. 删除所有相关函数（包括可能的不同版本）
-- 删除新设计的函数
DROP FUNCTION IF EXISTS public.get_configs_by_language(VARCHAR);
DROP FUNCTION IF EXISTS public.get_config_by_language(VARCHAR);
DROP FUNCTION IF EXISTS public.get_config_value(VARCHAR, VARCHAR);
DROP FUNCTION IF EXISTS public.get_hot_searches(VARCHAR);

-- 删除基于现有表的优化函数（来自 optimize_existing_global_config.sql）
DROP FUNCTION IF EXISTS public.get_global_config_by_language(VARCHAR);
DROP FUNCTION IF EXISTS public.get_global_config_value(VARCHAR, VARCHAR);
DROP FUNCTION IF EXISTS public.get_company_config(VARCHAR);
DROP FUNCTION IF EXISTS public.get_hot_search_keywords(VARCHAR);
DROP FUNCTION IF EXISTS public.get_social_media_config(VARCHAR);

-- 2. 删除所有相关视图
-- 删除新设计的视图
DROP VIEW IF EXISTS public.vw_global_config_multilingual CASCADE;
DROP VIEW IF EXISTS public.vw_config_by_language CASCADE;

-- 删除基于现有表的优化视图（来自 optimize_existing_global_config.sql）
DROP VIEW IF EXISTS public.vw_global_config_by_language CASCADE;

-- 3. 删除所有可能的触发器
DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config;
DROP TRIGGER IF EXISTS update_ak_global_configs_updated_at ON public.ak_global_configs;
DROP TRIGGER IF EXISTS update_ak_global_config_translations_updated_at ON public.ak_global_config_translations;
DROP TRIGGER IF EXISTS update_ak_config_main_updated_at ON public.ak_config_main;
DROP TRIGGER IF EXISTS update_ak_config_translations_updated_at ON public.ak_config_translations;

-- 4. 强制删除所有可能的新设计表（按依赖顺序）
-- 注意：保留 ak_languages 表，因为它与 ak_contents 系统有关联
DROP TABLE IF EXISTS public.ak_global_config_translations CASCADE;
DROP TABLE IF EXISTS public.ak_config_translations CASCADE;
DROP TABLE IF EXISTS public.ak_global_configs CASCADE;
DROP TABLE IF EXISTS public.ak_config_main CASCADE;
-- DROP TABLE IF EXISTS public.ak_languages CASCADE; -- 保留现有语言表
DROP TABLE IF EXISTS public.ak_language CASCADE;
DROP TABLE IF EXISTS public.languages CASCADE;

-- 5. 删除可能存在的序列（保留 ak_languages 相关序列）
DROP SEQUENCE IF EXISTS public.ak_global_configs_id_seq CASCADE;
DROP SEQUENCE IF EXISTS public.ak_config_main_id_seq CASCADE;
DROP SEQUENCE IF EXISTS public.ak_global_config_translations_id_seq CASCADE;
DROP SEQUENCE IF EXISTS public.ak_config_translations_id_seq CASCADE;
-- DROP SEQUENCE IF EXISTS public.ak_languages_id_seq CASCADE; -- 保留现有语言表序列

-- 6. 删除可能存在的类型定义
DROP TYPE IF EXISTS public.config_type CASCADE;
DROP TYPE IF EXISTS public.language_code CASCADE;

-- 7. 验证清理结果
DO $$
DECLARE
    table_count INTEGER;
    function_count INTEGER;
    view_count INTEGER;
    trigger_count INTEGER;
    sequence_count INTEGER;
    rec RECORD;
BEGIN
    -- 检查剩余的配置相关表（排除现有的 ak_languages 表）
    SELECT COUNT(*) INTO table_count 
    FROM information_schema.tables 
    WHERE table_schema = 'public' 
    AND table_name IN (
        'ak_global_configs', 
        'ak_global_config_translations', 
        'ak_config_main', 
        'ak_config_translations', 
        'ak_language', 
        'languages'
    );
    
    -- 检查剩余的相关函数
    SELECT COUNT(*) INTO function_count 
    FROM information_schema.routines 
    WHERE routine_schema = 'public' 
    AND routine_name IN (
        'get_configs_by_language', 
        'get_config_by_language', 
        'get_config_value', 
        'get_hot_searches',
        'get_global_config_by_language',
        'get_global_config_value',
        'get_company_config',
        'get_hot_search_keywords',
        'get_social_media_config'
    );
    
    -- 检查剩余的相关视图
    SELECT COUNT(*) INTO view_count 
    FROM information_schema.views 
    WHERE table_schema = 'public' 
    AND table_name IN (
        'vw_global_config_multilingual',
        'vw_global_config_by_language',
        'vw_config_by_language'
    );
    
    -- 检查剩余的相关序列
    SELECT COUNT(*) INTO sequence_count 
    FROM information_schema.sequences 
    WHERE sequence_schema = 'public' 
    AND sequence_name LIKE '%config%';
    
    RAISE NOTICE '========================================';
    RAISE NOTICE '强力清理结果检查：';
    RAISE NOTICE '剩余新设计表数量: %', table_count;
    RAISE NOTICE '剩余相关函数数量: %', function_count;
    RAISE NOTICE '剩余相关视图数量: %', view_count;
    RAISE NOTICE '剩余相关序列数量: %', sequence_count;
    RAISE NOTICE '========================================';
    
    -- 显示剩余的配置相关表（ak_languages 是现有系统表，会保留）
    RAISE NOTICE '当前剩余的配置相关表：';
    FOR rec IN 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = 'public' 
        AND (table_name LIKE '%config%' OR table_name LIKE '%language%')
        ORDER BY table_name
    LOOP
        RAISE NOTICE '  - %', rec.table_name;
    END LOOP;
    
    -- 特别说明保留的表
    IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_languages') THEN
        RAISE NOTICE '  ℹ️  ak_languages 表已保留（与 ak_contents 系统关联）';
    END IF;
    
    IF table_count = 0 AND function_count = 0 AND view_count = 0 THEN
        RAISE NOTICE '✅ 全面清理完成！所有新设计的表结构和优化函数已删除';
        RAISE NOTICE '现在可以重新执行 optimize_existing_global_config.sql 创建新的优化函数';
    ELSE
        RAISE NOTICE '⚠️ 还有一些对象未删除，可能需要手动处理';
    END IF;
    
    RAISE NOTICE '========================================';
END $$;

-- 8. 检查原有表是否还存在并显示其结构
DO $$
DECLARE
    original_table_exists BOOLEAN;
    column_info RECORD;
BEGIN
    SELECT EXISTS (
        SELECT 1 FROM information_schema.tables 
        WHERE table_schema = 'public' 
        AND table_name = 'ak_global_config'
        AND table_type = 'BASE TABLE'
    ) INTO original_table_exists;
    
    IF original_table_exists THEN
        RAISE NOTICE '✅ 原有的 ak_global_config 表仍然存在';
        
        -- 显示表结构
        RAISE NOTICE '表结构：';
        FOR column_info IN 
            SELECT column_name, data_type, is_nullable, column_default
            FROM information_schema.columns 
            WHERE table_schema = 'public' 
            AND table_name = 'ak_global_config'
            ORDER BY ordinal_position
        LOOP
            RAISE NOTICE '  - % (% %)', 
                column_info.column_name, 
                column_info.data_type,
                CASE WHEN column_info.is_nullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END;
        END LOOP;
        
        -- 显示配置数量
        RAISE NOTICE '当前配置数量: %', (
            SELECT COUNT(*) FROM public.ak_global_config WHERE is_active = true
        );
        
        -- 显示一些示例配置
        RAISE NOTICE '示例配置（前5个）：';
        FOR column_info IN 
            SELECT config_key, config_value 
            FROM public.ak_global_config 
            WHERE is_active = true 
            ORDER BY config_key 
            LIMIT 5
        LOOP
            RAISE NOTICE '  - %: %', column_info.config_key, LEFT(column_info.config_value, 50);
        END LOOP;
        
    ELSE
        RAISE NOTICE '❌ 警告：原有的 ak_global_config 表不存在！';
        RAISE NOTICE '您可能需要：';
        RAISE NOTICE '1. 从备份恢复原有表';
        RAISE NOTICE '2. 或者执行 init_company_global_config.sql 重新创建';
    END IF;
END $$;

-- 9. 可选：重新创建基础触发器函数（如果被删除了）
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 10. 可选：重新为原有表创建触发器（如果被删除了）
DO $$
BEGIN
    IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_global_config') THEN
        DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config;
        CREATE TRIGGER update_ak_global_config_updated_at
            BEFORE UPDATE ON public.ak_global_config
            FOR EACH ROW
            EXECUTE FUNCTION update_updated_at_column();
        RAISE NOTICE '✅ 为原有表重新创建了更新触发器';
    END IF;
END $$;

-- 完成提示
DO $$
BEGIN
    RAISE NOTICE '========================================';
    RAISE NOTICE '全面清理脚本执行完成！';
    RAISE NOTICE '已删除所有新设计的表、函数、视图等对象';
    RAISE NOTICE '========================================';
    RAISE NOTICE '后续建议步骤：';
    RAISE NOTICE '1. 验证原有的 ak_global_config 表功能正常';
    RAISE NOTICE '2. 确认 ak_languages 表与 ak_contents 系统关联正常';
    RAISE NOTICE '3. 重新执行 optimize_existing_global_config.sql 创建优化查询函数';
    RAISE NOTICE '4. 测试前端配置加载功能';
    RAISE NOTICE '5. 如果原有表不存在，执行 init_company_global_config.sql';
    RAISE NOTICE '========================================';
END $$;
