'use client' import { useEffect, useState } from 'react' import { MainLayout } from '@/components/layout/main-layout' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { BookOpen, Calendar, ClipboardList, TrendingUp, Clock, CheckCircle, XCircle, Loader2 } from 'lucide-react' import { toast } from 'sonner' interface Student { id: string; firstName: string; lastName: string; admissionNumber: string; } interface Stats { totalClasses: number; attendanceRate: number; todayClasses: number; monthlyAbsences: number; } interface TodayScheduleItem { id: string; name: string; section: string; time: string; room: string; professor: string; } interface AttendanceHistoryItem { id: string; class: string; date: string; status: string; time: string; statusColor: string; } interface ClassOverviewItem { id: string; name: string; section: string; professor: string; attendance: number; totalClasses: number; attendedClasses: number; } interface DashboardData { student: Student; stats: Stats; todaySchedule: TodayScheduleItem[]; recentAttendances: AttendanceHistoryItem[]; classesOverview: ClassOverviewItem[]; } export default function StudentDashboard() { const [data, setData] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { fetchDashboardData() }, []) const fetchDashboardData = async () => { try { setLoading(true) const response = await fetch('/api/student/dashboard') if (!response.ok) { throw new Error('Error al cargar los datos del dashboard') } const dashboardData: DashboardData = await response.json() setData(dashboardData) } catch (error) { console.error('Error:', error) toast.error('Error al cargar los datos del dashboard') } finally { setLoading(false) } } if (loading) { return (
) } if (!data) { return (

No se pudieron cargar los datos del dashboard.

) } const stats = [ { title: 'Mis Clases', value: data.stats.totalClasses.toString(), description: 'Clases matriculadas', icon: BookOpen, color: 'text-blue-600', bgColor: 'bg-blue-100' }, { title: 'Asistencia General', value: `${data.stats.attendanceRate}%`, description: 'Promedio del semestre', icon: TrendingUp, color: 'text-green-600', bgColor: 'bg-green-100' }, { title: 'Clases Hoy', value: data.stats.todayClasses.toString(), description: 'Clases programadas', icon: Calendar, color: 'text-purple-600', bgColor: 'bg-purple-100' }, { title: 'Faltas Este Mes', value: data.stats.monthlyAbsences.toString(), description: 'Inasistencias registradas', icon: XCircle, color: 'text-red-600', bgColor: 'bg-red-100' } ] return (
{/* Estadísticas */}
{stats.map((stat) => { const Icon = stat.icon return ( {stat.title}
{stat.value}

{stat.description}

) })}
{/* Horario de Hoy */} Horario de Hoy Clases programadas para hoy
{data.todaySchedule.length > 0 ? ( data.todaySchedule.map((classItem) => (

{classItem.name}

{classItem.section} • {classItem.room}

{classItem.time} • Prof. {classItem.professor}

)) ) : (

No hay clases programadas para hoy

)}
{/* Historial de Asistencia */} Asistencia Reciente Últimos registros de asistencia
{data.recentAttendances.length > 0 ? ( data.recentAttendances.map((record) => (

{record.class}

{record.date} • {record.time}

{record.status === 'Presente' || record.status === 'Justificado' ? ( ) : ( )} {record.status}
)) ) : (

No hay registros de asistencia

)}
{/* Resumen por Clase */} Mis Clases Resumen de asistencia por materia
{data.classesOverview.length > 0 ? ( data.classesOverview.map((classItem) => (

{classItem.name}

{classItem.section} • Prof. {classItem.professor}

= 90 ? 'text-green-600' : classItem.attendance >= 80 ? 'text-yellow-600' : 'text-red-600' }`}> {classItem.attendance}%
= 90 ? 'bg-green-600' : classItem.attendance >= 80 ? 'bg-yellow-600' : 'bg-red-600' }`} style={{ width: `${classItem.attendance}%` }} >

{classItem.attendedClasses}/{classItem.totalClasses} clases asistidas

)) ) : (

No hay clases matriculadas

)}
) }