import { NextResponse } from 'next/server'; import supabase from '@/lib/db'; interface IpkStatus { tahun_angkatan: number; status_kuliah: string; total_mahasiswa: number; rata_rata_ipk: number; } export async function GET(request: Request) { try { const { searchParams } = new URL(request.url); const tahunAngkatan = searchParams.get('tahun_angkatan'); const statusKuliah = searchParams.get('status_kuliah'); if (!statusKuliah) { console.error('Missing required parameter: status_kuliah'); return NextResponse.json( { error: 'Missing required parameter: status_kuliah' }, { status: 400 } ); } let query = supabase .from('mahasiswa') .select('tahun_angkatan, ipk, nim') .eq('status_kuliah', statusKuliah) .not('ipk', 'is', null); if (tahunAngkatan && tahunAngkatan !== 'all') { query = query.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { data, error } = await query; if (error) { console.error('Error fetching IPK status data:', error); return NextResponse.json( { error: 'Failed to fetch IPK status data' }, { status: 500 } ); } // Kelompokkan berdasarkan tahun_angkatan dan status_kuliah const groupedData = data.reduce((acc, item: any) => { const tahun_angkatan = item.tahun_angkatan; const status_kuliah = item.status_kuliah; const ipk = item.ipk; const key = `${tahun_angkatan}-${status_kuliah}`; if (!acc[key]) { acc[key] = { tahun_angkatan, status_kuliah, total_mahasiswa: 0, total_ipk: 0 }; } acc[key].total_mahasiswa += 1; acc[key].total_ipk += ipk; return acc; }, {} as Record); // Konversi ke format akhir dan hitung rata-rata IPK const results: IpkStatus[] = Object.values(groupedData) .map(item => ({ tahun_angkatan: item.tahun_angkatan, status_kuliah: item.status_kuliah, total_mahasiswa: item.total_mahasiswa, rata_rata_ipk: Math.round((item.total_ipk / item.total_mahasiswa) * 100) / 100 })) .sort((a, b) => { // Urutkan berdasarkan tahun_angkatan DESC, status_kuliah ASC if (a.tahun_angkatan !== b.tahun_angkatan) { return b.tahun_angkatan - a.tahun_angkatan; } return a.status_kuliah.localeCompare(b.status_kuliah); }); return NextResponse.json(results); } catch (error) { console.error('Error in ipk-status route:', error); return NextResponse.json( { error: 'Internal Server Error', details: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 } ); } }