-- ===================================================================
-- 数据库清理和重建脚本
-- 用于解决索引和表已存在的问题
-- 在执行主数据库脚本前运行此脚本
-- ===================================================================

-- 设置客户端编码
SET client_encoding = 'UTF8';

-- 删除可能已存在的索引
DO $$
DECLARE
    r RECORD;
BEGIN
    -- 删除所有以 idx_ 开头的索引
    FOR r IN (SELECT indexname FROM pg_indexes WHERE indexname LIKE 'idx_%' AND schemaname = 'public')
    LOOP
        EXECUTE 'DROP INDEX IF EXISTS public.' || quote_ident(r.indexname);
        RAISE NOTICE '删除索引: %', r.indexname;
    END LOOP;
    
    RAISE NOTICE '所有相关索引已清理完成！';
END $$;

-- 删除可能已存在的触发器
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT trigger_name, event_object_table 
              FROM information_schema.triggers 
              WHERE trigger_schema = 'public' 
              AND trigger_name LIKE 'trigger_%')
    LOOP
        EXECUTE 'DROP TRIGGER IF EXISTS ' || quote_ident(r.trigger_name) || ' ON public.' || quote_ident(r.event_object_table);
        RAISE NOTICE '删除触发器: % on %', r.trigger_name, r.event_object_table;
    END LOOP;
    
    RAISE NOTICE '所有相关触发器已清理完成！';
END $$;

-- 删除可能已存在的函数
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT proname, oidvectortypes(proargtypes) as args
              FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid 
              WHERE n.nspname = 'public' 
              AND proname IN ('update_favorite_folder_count', 'update_content_favorite_stats', 
                             'update_content_share_stats', 'generate_share_code', 'update_share_analytics'))
    LOOP
        EXECUTE 'DROP FUNCTION IF EXISTS public.' || quote_ident(r.proname) || '(' || r.args || ')';
        RAISE NOTICE '删除函数: %', r.proname;
    END LOOP;
    
    RAISE NOTICE '所有相关函数已清理完成！';
END $$;

-- 可选：删除可能已存在的表（谨慎使用！）
/*
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables 
              WHERE schemaname = 'public' 
              AND tablename LIKE 'ak_%')
    LOOP
        EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
        RAISE NOTICE '删除表: %', r.tablename;
    END LOOP;
    
    RAISE NOTICE '所有相关表已删除！';
END $$;
*/

RAISE NOTICE '数据库清理完成！现在可以运行主数据库脚本了。';
