-- Supabase RPC 函数最终修复版本
-- 完全匹配 Supabase RPC 参数命名规范

-- 1. 删除所有现有函数
DROP FUNCTION IF EXISTS public.get_teacher_analytics CASCADE;
DROP FUNCTION IF EXISTS public.get_top_performers CASCADE;
DROP FUNCTION IF EXISTS public.get_chart_data CASCADE;
DROP FUNCTION IF EXISTS public.get_recent_activities CASCADE;
DROP FUNCTION IF EXISTS public.test_rpc_access CASCADE;

-- 2. 创建 get_teacher_analytics 函数 - 使用精确的参数名称
CREATE OR REPLACE FUNCTION public.get_teacher_analytics(
    teacher_id uuid DEFAULT NULL,
    start_date text DEFAULT NULL,
    end_date text DEFAULT NULL
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
    result_data jsonb;
BEGIN
    -- 返回模拟统计数据
    result_data := jsonb_build_object(
        'total_students', 28,
        'total_assignments', 12,
        'completion_rate', 87.5,
        'average_score', 82.3,
        'active_classes', 4,
        'total_submissions', 285,
        'pending_reviews', 15,
        'graded_submissions', 270,
        'teacher_id', COALESCE(teacher_id::text, 'default'),
        'date_range', jsonb_build_object(
            'start_date', COALESCE(start_date, '2024-06-01'),
            'end_date', COALESCE(end_date, '2024-06-12')
        ),
        'generated_at', now()::text
    );
    
    RETURN result_data;
EXCEPTION WHEN OTHERS THEN
    RETURN jsonb_build_object(
        'error', true,
        'message', 'Function execution failed: ' || SQLERRM,
        'code', SQLSTATE
    );
END;
$$;

-- 3. 创建 get_top_performers 函数
CREATE OR REPLACE FUNCTION public.get_top_performers(
    teacher_id uuid DEFAULT NULL,
    start_date text DEFAULT NULL,
    end_date text DEFAULT NULL,
    "limit" integer DEFAULT 10
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
    result_data jsonb;
    limit_count integer;
BEGIN
    limit_count := COALESCE("limit", 10);
    
    -- 返回模拟的优秀学员数据
    result_data := jsonb_build_array(
        jsonb_build_object(
            'student_id', '550e8400-e29b-41d4-a716-446655440001',
            'name', '王小明',
            'username', 'wangxiaoming',
            'avatar_url', null,
            'score', 96.8,
            'submission_count', 12,
            'completion_rate', 100.0,
            'class_name', '高三(1)班',
            'rank_position', 1
        ),
        jsonb_build_object(
            'student_id', '550e8400-e29b-41d4-a716-446655440002',
            'name', '张丽华',
            'username', 'zhanglihua',
            'avatar_url', null,
            'score', 94.2,
            'submission_count', 11,
            'completion_rate', 91.7,
            'class_name', '高三(2)班',
            'rank_position', 2
        ),
        jsonb_build_object(
            'student_id', '550e8400-e29b-41d4-a716-446655440003',
            'name', '李强',
            'username', 'liqiang',
            'avatar_url', null,
            'score', 92.5,
            'submission_count', 10,
            'completion_rate', 83.3,
            'class_name', '高三(1)班',
            'rank_position', 3
        ),
        jsonb_build_object(
            'student_id', '550e8400-e29b-41d4-a716-446655440004',
            'name', '陈美丽',
            'username', 'chenmeili',
            'avatar_url', null,
            'score', 90.1,
            'submission_count', 9,
            'completion_rate', 75.0,
            'class_name', '高三(2)班',
            'rank_position', 4
        ),
        jsonb_build_object(
            'student_id', '550e8400-e29b-41d4-a716-446655440005',
            'name', '刘志伟',
            'username', 'liuzhiwei',
            'avatar_url', null,
            'score', 88.7,
            'submission_count', 8,
            'completion_rate', 66.7,
            'class_name', '高三(1)班',
            'rank_position', 5
        )
    );
    
    RETURN result_data;
EXCEPTION WHEN OTHERS THEN
    RETURN jsonb_build_object(
        'error', true,
        'message', 'Function execution failed: ' || SQLERRM,
        'code', SQLSTATE
    );
END;
$$;

-- 4. 创建 get_chart_data 函数
CREATE OR REPLACE FUNCTION public.get_chart_data(
    teacher_id uuid DEFAULT NULL,
    start_date text DEFAULT NULL,
    end_date text DEFAULT NULL,
    "type" text DEFAULT 'completion_rate'
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
    result_data jsonb;
    chart_type text;
BEGIN
    chart_type := COALESCE("type", 'completion_rate');
    
    -- 根据类型返回不同的图表数据
    IF chart_type = 'completion_rate' THEN
        result_data := jsonb_build_array(
            jsonb_build_object('date_key', '2024-06-01', 'value', 75.5, 'label', '完成率', 'count', 15),
            jsonb_build_object('date_key', '2024-06-02', 'value', 82.3, 'label', '完成率', 'count', 18),
            jsonb_build_object('date_key', '2024-06-03', 'value', 88.1, 'label', '完成率', 'count', 22),
            jsonb_build_object('date_key', '2024-06-04', 'value', 90.5, 'label', '完成率', 'count', 25),
            jsonb_build_object('date_key', '2024-06-05', 'value', 87.2, 'label', '完成率', 'count', 23),
            jsonb_build_object('date_key', '2024-06-06', 'value', 92.8, 'label', '完成率', 'count', 28),
            jsonb_build_object('date_key', '2024-06-07', 'value', 85.6, 'label', '完成率', 'count', 21)
        );
    ELSIF chart_type = 'score_distribution' THEN
        result_data := jsonb_build_array(
            jsonb_build_object('range', '90-100', 'label', '优秀', 'count', 25, 'percentage', 18.7),
            jsonb_build_object('range', '80-89', 'label', '良好', 'count', 45, 'percentage', 33.6),
            jsonb_build_object('range', '70-79', 'label', '中等', 'count', 35, 'percentage', 26.1),
            jsonb_build_object('range', '60-69', 'label', '及格', 'count', 20, 'percentage', 14.9),
            jsonb_build_object('range', '60以下', 'label', '不及格', 'count', 8, 'percentage', 6.0)
        );
    ELSIF chart_type = 'submission_trend' THEN
        result_data := jsonb_build_array(
            jsonb_build_object('date_key', '2024-06-01', 'value', 12, 'label', '提交数量', 'count', 12),
            jsonb_build_object('date_key', '2024-06-02', 'value', 15, 'label', '提交数量', 'count', 15),
            jsonb_build_object('date_key', '2024-06-03', 'value', 18, 'label', '提交数量', 'count', 18),
            jsonb_build_object('date_key', '2024-06-04', 'value', 22, 'label', '提交数量', 'count', 22),
            jsonb_build_object('date_key', '2024-06-05', 'value', 19, 'label', '提交数量', 'count', 19),
            jsonb_build_object('date_key', '2024-06-06', 'value', 25, 'label', '提交数量', 'count', 25),
            jsonb_build_object('date_key', '2024-06-07', 'value', 16, 'label', '提交数量', 'count', 16)
        );
    ELSE
        result_data := '[]'::jsonb;
    END IF;
    
    RETURN result_data;
EXCEPTION WHEN OTHERS THEN
    RETURN jsonb_build_object(
        'error', true,
        'message', 'Function execution failed: ' || SQLERRM,
        'code', SQLSTATE,
        'chart_type', chart_type
    );
END;
$$;

-- 5. 创建 get_recent_activities 函数
CREATE OR REPLACE FUNCTION public.get_recent_activities(
    teacher_id uuid DEFAULT NULL,
    "limit" integer DEFAULT 20
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
    result_data jsonb;
    limit_count integer;
BEGIN
    limit_count := COALESCE("limit", 20);
    
    -- 返回模拟的近期活动数据
    result_data := jsonb_build_array(
        jsonb_build_object(
            'activity_id', '550e8400-e29b-41d4-a716-446655440001',
            'activity_type', 'assignment_submitted',
            'title', '王小明提交了跑步训练作业',
            'description', '完成了5公里跑步训练，用时25分钟',
            'student_name', '王小明',
            'assignment_title', '跑步训练',
            'activity_time', '2024-06-12T08:30:00Z',
            'time_ago', '2小时前'
        ),
        jsonb_build_object(
            'activity_id', '550e8400-e29b-41d4-a716-446655440002',
            'activity_type', 'assignment_submitted',
            'title', '张丽华提交了力量训练作业',
            'description', '完成了器械训练，表现优秀',
            'student_name', '张丽华',
            'assignment_title', '力量训练',
            'activity_time', '2024-06-12T07:15:00Z',
            'time_ago', '3小时前'
        ),
        jsonb_build_object(
            'activity_id', '550e8400-e29b-41d4-a716-446655440003',
            'activity_type', 'project_completed',
            'title', '李强完成了体能测试项目',
            'description', '各项指标达到优秀标准',
            'student_name', '李强',
            'assignment_title', '体能测试',
            'activity_time', '2024-06-12T06:45:00Z',
            'time_ago', '4小时前'
        ),
        jsonb_build_object(
            'activity_id', '550e8400-e29b-41d4-a716-446655440004',
            'activity_type', 'assignment_graded',
            'title', '陈美丽的作业已批改',
            'description', '体操训练作业获得优秀评价',
            'student_name', '陈美丽',
            'assignment_title', '体操训练',
            'activity_time', '2024-06-12T05:20:00Z',
            'time_ago', '5小时前'
        ),
        jsonb_build_object(
            'activity_id', '550e8400-e29b-41d4-a716-446655440005',
            'activity_type', 'assignment_submitted',
            'title', '刘志伟提交了游泳训练作业',
            'description', '完成了1000米自由泳，技术有所提升',
            'student_name', '刘志伟',
            'assignment_title', '游泳训练',
            'activity_time', '2024-06-12T04:15:00Z',
            'time_ago', '6小时前'
        )
    );
    
    RETURN result_data;
EXCEPTION WHEN OTHERS THEN
    RETURN jsonb_build_object(
        'error', true,
        'message', 'Function execution failed: ' || SQLERRM,
        'code', SQLSTATE
    );
END;
$$;

-- 6. 创建简单的测试函数（无参数）
CREATE OR REPLACE FUNCTION public.test_rpc_access()
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
    RETURN jsonb_build_object(
        'status', 'success',
        'message', 'RPC access test successful',
        'current_user', current_user,
        'timestamp', now()
    );
END;
$$;

-- 7. 设置完整权限
GRANT EXECUTE ON FUNCTION public.get_teacher_analytics TO authenticated, anon, service_role;
GRANT EXECUTE ON FUNCTION public.get_top_performers TO authenticated, anon, service_role;
GRANT EXECUTE ON FUNCTION public.get_chart_data TO authenticated, anon, service_role;
GRANT EXECUTE ON FUNCTION public.get_recent_activities TO authenticated, anon, service_role;
GRANT EXECUTE ON FUNCTION public.test_rpc_access TO authenticated, anon, service_role;

-- 8. 设置函数所有者
ALTER FUNCTION public.get_teacher_analytics OWNER TO postgres;
ALTER FUNCTION public.get_top_performers OWNER TO postgres;
ALTER FUNCTION public.get_chart_data OWNER TO postgres;
ALTER FUNCTION public.get_recent_activities OWNER TO postgres;
ALTER FUNCTION public.test_rpc_access OWNER TO postgres;

-- 9. 验证函数签名
SELECT 
    r.routine_name,
    r.routine_type,
    r.data_type as return_type,
    string_agg(
        COALESCE(p.parameter_name, 'unnamed') || ' ' || p.data_type ||
        CASE WHEN p.parameter_default IS NOT NULL THEN ' DEFAULT ' || p.parameter_default ELSE '' END,
        ', ' ORDER BY p.ordinal_position
    ) as parameters
FROM information_schema.routines r
LEFT JOIN information_schema.parameters p ON 
    r.specific_name = p.specific_name AND 
    r.routine_schema = p.specific_schema
WHERE r.routine_schema = 'public' 
AND r.routine_name IN ('get_teacher_analytics', 'get_top_performers', 'get_chart_data', 'get_recent_activities', 'test_rpc_access')
GROUP BY r.routine_name, r.routine_type, r.data_type
ORDER BY r.routine_name;

-- 10. 测试所有函数
DO $$
DECLARE
    test_result jsonb;
BEGIN
    -- 测试 test_rpc_access（无参数）
    SELECT public.test_rpc_access() INTO test_result;
    RAISE NOTICE '✅ test_rpc_access: %', (test_result->>'status');
    
    -- 测试 get_teacher_analytics（带参数）
    SELECT public.get_teacher_analytics(
        teacher_id := NULL,
        start_date := '2024-06-01',
        end_date := '2024-06-12'
    ) INTO test_result;
    RAISE NOTICE '✅ get_teacher_analytics: % 学生', (test_result->>'total_students');
    
    -- 测试 get_top_performers
    SELECT public.get_top_performers(
        teacher_id := NULL,
        start_date := NULL,
        end_date := NULL,
        "limit" := 5
    ) INTO test_result;
    RAISE NOTICE '✅ get_top_performers: % 条记录', jsonb_array_length(test_result);
    
    -- 测试 get_chart_data
    SELECT public.get_chart_data(
        teacher_id := NULL,
        start_date := NULL,
        end_date := NULL,
        "type" := 'completion_rate'
    ) INTO test_result;
    RAISE NOTICE '✅ get_chart_data: % 条记录', jsonb_array_length(test_result);
    
    -- 测试 get_recent_activities
    SELECT public.get_recent_activities(
        teacher_id := NULL,
        "limit" := 10
    ) INTO test_result;
    RAISE NOTICE '✅ get_recent_activities: % 条记录', jsonb_array_length(test_result);
    
    RAISE NOTICE '🎉 所有 RPC 函数创建成功并测试通过！';
END;
$$;

-- 11. 显示函数调用示例
SELECT 
    '📋 RPC 调用示例' as info,
    '前端可以使用以下参数调用：' as description;

SELECT 
    'get_teacher_analytics' as function_name,
    jsonb_build_object(
        'teacher_id', 'uuid_string_or_null',
        'start_date', '2024-06-01',
        'end_date', '2024-06-12'
    ) as parameters_example;

SELECT 
    'get_top_performers' as function_name,
    jsonb_build_object(
        'teacher_id', 'uuid_string_or_null',
        'start_date', '2024-06-01',
        'end_date', '2024-06-12',
        'limit', 10
    ) as parameters_example;

SELECT 
    'get_chart_data' as function_name,
    jsonb_build_object(
        'teacher_id', 'uuid_string_or_null',
        'start_date', '2024-06-01',
        'end_date', '2024-06-12',
        'type', 'completion_rate'
    ) as parameters_example;

SELECT 
    'get_recent_activities' as function_name,
    jsonb_build_object(
        'teacher_id', 'uuid_string_or_null',
        'limit', 20
    ) as parameters_example;

-- 12. 成功提示
SELECT 
    '🎉 Supabase RPC Functions Ready!' as status,
    'All functions are now properly configured for RPC calls' as message,
    'Use exact parameter names as shown in examples above' as important_note,
    now() as deployed_at;
