<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Curso;
use Carbon\Carbon;
use App\Models\Alumno;
use App\Models\CursoAlumno;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class CursoAlumnoController extends Controller
{

    public function index($alumno_id)
    {
        try {
            $courses = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('ciclos', 'ciclos.id', '=', 'cursos.ciclo_id')
                ->leftJoin('area_de_formacion', 'area_de_formacion.id', '=', 'cursos.area_de_formacion_id')
                ->leftJoin('modulos_formativos', 'modulos_formativos.id', '=', 'cursos.modulo_formativo_id')
                ->leftJoin('estados', 'estados.id', '=', 'cursos.estado_id')
                ->leftJoin('carreras', 'carreras.id', '=', 'cursos.carrera_id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id') // Nuevo join
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->select(
                    'cursos.*',
                    'ciclos.nombre as ciclo_nombre',
                    'area_de_formacion.nombre as area_de_formacion_nombre',
                    'modulos_formativos.nombre as modulo_formativo_nombre',
                    'carreras.nombres as carrera_nombre',
                    'estados.nombre as estado_nombre',
                    'alumnos.id as alumno_id',
                    'curso_alumno.estado_id as estado_id',
                    'estado_curso_alumno.color',
                    DB::raw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) as estadoCursoAlumno")
                )
                ->get();

            // Calcular créditos y horas aprobados
            $creditosAprobados = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'APROBADO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'APROBADO'");
                })
                ->sum('cursos.cantidad_de_creditos');

            $horasAprobadas = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'APROBADO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'APROBADO'");
                })
                ->sum('cursos.cantidad_de_horas');

            $creditosEnproceso = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'EN PROCESO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'EN PROCESO'");
                })
                ->sum('cursos.cantidad_de_creditos');

            $horasEnproceso = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'EN PROCESO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'EN PROCESO'");
                })
                ->sum('cursos.cantidad_de_horas');

            $creditosPendientes = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'PENDIENTE')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'PENDIENTE'");
                })
                ->sum('cursos.cantidad_de_creditos');

            $horasPendientes = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'PENDIENTE')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'PENDIENTE'");
                })
                ->sum('cursos.cantidad_de_horas');

            $creditosDesaprobados = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'DESAPROBADO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'DESAPROBADO'");
                })
                ->sum('cursos.cantidad_de_creditos');

            $horasDesaprobadas = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
                ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
                ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->where(function ($query) {
                    $query->where('estado_curso_alumno.nombre', 'DESAPROBADO')
                        ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'DESAPROBADO'");
                })
                ->sum('cursos.cantidad_de_horas');

            $totalCreditos = $creditosAprobados + $creditosEnproceso + $creditosPendientes + $creditosDesaprobados;
            $totalHoras = $horasAprobadas + $horasEnproceso + $horasPendientes + $horasDesaprobadas;

            if ($totalCreditos > 0) {
                $PorcentajeAprobados = round(($creditosAprobados * 100 / $totalCreditos), 2);
                $PorcentajeEnproceso = round(($creditosEnproceso * 100 / $totalCreditos), 2);
                $PorcentajePendientes = round(($creditosPendientes * 100 / $totalCreditos), 2);
                $PorcentajeDesaprobados = round(($creditosDesaprobados * 100 / $totalCreditos), 2);
            } else {
                $PorcentajeAprobados = 0;
                $PorcentajeEnproceso = 0;
                $PorcentajePendientes = 0;
                $PorcentajeDesaprobados = 0;
            }

            return response()->json([
                'cursos' => $courses,
                'estadisticas' => [
                    'creditos_aprobados' => $creditosAprobados,
                    'creditos_en_proceso' => $creditosEnproceso,
                    'creditos_pendientes' => $creditosPendientes,
                    'creditos_desaprobados' => $creditosDesaprobados,
                    'horas_aprobadas' => $horasAprobadas,
                    'horas_en_proceso' => $horasEnproceso,
                    'horas_pendientes' => $horasPendientes,
                    'horas_desaprobadas' => $horasDesaprobadas,
                    'porcentaje_aprobados' => $PorcentajeAprobados,
                    'porcentaje_en_proceso' => $PorcentajeEnproceso,
                    'porcentaje_pendientes' => $PorcentajePendientes,
                    'porcentaje_desaprobados' => $PorcentajeDesaprobados,
                    'total_creditos' => $totalCreditos,
                    'total_horas' => $totalHoras
                ],
                'totalHoras' => [
                    'horas_aprobadas' => $horasAprobadas,
                    'horas_en_proceso' => $horasEnproceso,
                    'horas_pendientes' => $horasPendientes,
                    'horas_desaprobadas' => $horasDesaprobadas,

                ]

            ]);
            // return response()->json($courses);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }

    public function indexByPlan($alumnoId)
    {


        $cursos = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('ciclos', 'ciclos.id', '=', 'cursos.ciclo_id')
            ->leftJoin('area_de_formacion', 'area_de_formacion.id', '=', 'cursos.area_de_formacion_id')
            ->leftJoin('modulos_formativos', 'modulos_formativos.id', '=', 'cursos.modulo_formativo_id')
            ->leftJoin('estados', 'estados.id', '=', 'cursos.estado_id')
            ->leftJoin('carreras', 'carreras.id', '=', 'cursos.carrera_id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id') // Nuevo join
            ->join('promociones as p', 'alumnos.promocion_id', '=', 'p.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->select(
                'cursos.*',
                'ciclos.nombre as ciclo_nombre',
                'area_de_formacion.nombre as area_de_formacion_nombre',
                'modulos_formativos.nombre as modulo_formativo_nombre',
                'carreras.nombres as carrera_nombre',
                'estados.nombre as estado_nombre',
                'alumnos.id as alumno_id',
                'curso_alumno.estado_id as estado_id',
                'estado_curso_alumno.color',
                'p.nombre_promocion as nombre_promocion',
                DB::raw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) as estadoCursoAlumno")
            )
            ->get();

        // Calcular créditos y horas aprobados
        $creditosAprobados = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'APROBADO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'APROBADO'");
            })
            ->sum('cursos.cantidad_de_creditos');

        $horasAprobadas = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'APROBADO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'APROBADO'");
            })
            ->sum('cursos.cantidad_de_horas');

        $creditosEnproceso = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'EN PROCESO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'EN PROCESO'");
            })
            ->sum('cursos.cantidad_de_creditos');

        $horasEnproceso = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'EN PROCESO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'EN PROCESO'");
            })
            ->sum('cursos.cantidad_de_horas');

        $creditosPendientes = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'PENDIENTE')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'PENDIENTE'");
            })
            ->sum('cursos.cantidad_de_creditos');

        $horasPendientes = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'PENDIENTE')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'PENDIENTE'");
            })
            ->sum('cursos.cantidad_de_horas');

        $creditosDesaprobados = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'DESAPROBADO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'DESAPROBADO'");
            })
            ->sum('cursos.cantidad_de_creditos');

        $horasDesaprobadas = Curso::leftJoin('curso_alumno', 'curso_alumno.curso_id', '=', 'cursos.id')
            ->leftJoin('alumnos', 'alumnos.id', '=', 'curso_alumno.alumno_id')
            ->leftJoin('estado_curso_alumno', 'curso_alumno.estado_curso_id', '=', 'estado_curso_alumno.id')
            ->where('curso_alumno.alumno_id', $alumnoId)
            ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
            ->where(function ($query) {
                $query->where('estado_curso_alumno.nombre', 'DESAPROBADO')
                    ->orWhereRaw("IF(estado_curso_alumno.nombre IS NULL, 'PENDIENTE', estado_curso_alumno.nombre) = 'DESAPROBADO'");
            })
            ->sum('cursos.cantidad_de_horas');

        $totalCreditos = $creditosAprobados + $creditosEnproceso + $creditosPendientes + $creditosDesaprobados;
        $totalHoras = $horasAprobadas + $horasEnproceso + $horasPendientes + $horasDesaprobadas;

        if ($totalCreditos > 0) {
            $PorcentajeAprobados = round(($creditosAprobados * 100 / $totalCreditos), 2);
            $PorcentajeEnproceso = round(($creditosEnproceso * 100 / $totalCreditos), 2);
            $PorcentajePendientes = round(($creditosPendientes * 100 / $totalCreditos), 2);
            $PorcentajeDesaprobados = round(($creditosDesaprobados * 100 / $totalCreditos), 2);
        } else {
            $PorcentajeAprobados = 0;
            $PorcentajeEnproceso = 0;
            $PorcentajePendientes = 0;
            $PorcentajeDesaprobados = 0;
        }

        return response()->json([
            'cursos' => $cursos,
            'estadisticas' => [
                'creditos_aprobados' => $creditosAprobados,
                'creditos_en_proceso' => $creditosEnproceso,
                'creditos_pendientes' => $creditosPendientes,
                'creditos_desaprobados' => $creditosDesaprobados,
                'horas_aprobadas' => $horasAprobadas,
                'horas_en_proceso' => $horasEnproceso,
                'horas_pendientes' => $horasPendientes,
                'horas_desaprobadas' => $horasDesaprobadas,
                'porcentaje_aprobados' => $PorcentajeAprobados,
                'porcentaje_en_proceso' => $PorcentajeEnproceso,
                'porcentaje_pendientes' => $PorcentajePendientes,
                'porcentaje_desaprobados' => $PorcentajeDesaprobados,
                'total_creditos' => $totalCreditos,
                'total_horas' => $totalHoras
            ],
            'totalHoras' => [
                'horas_aprobadas' => $horasAprobadas,
                'horas_en_proceso' => $horasEnproceso,
                'horas_pendientes' => $horasPendientes,
                'horas_desaprobadas' => $horasDesaprobadas,

            ]
        ]);
    }
    public function indexByAlumno($alumno_id)
    {
        try {
            $courses = Curso::leftJoin('carreras', 'carreras.id', '=', 'cursos.carrera_id')
                ->leftJoin('alumnos', 'alumnos.carrera_id', '=', 'carreras.id') // Relación directa con la carrera del alumno
                ->leftJoin('plan_de_estudios', 'plan_de_estudios.id', '=', 'cursos.estado_id') // Relación con el plan de estudios
                ->leftJoin('ciclos', 'ciclos.id', '=', 'cursos.ciclo_id') // Relación con ciclos
                ->leftJoin('modulos_formativos', 'modulos_formativos.id', '=', 'cursos.modulo_formativo_id')
                ->leftJoin('area_de_formacion', 'area_de_formacion.id', '=', 'cursos.area_de_formacion_id')
                ->where('alumnos.id', $alumno_id)
                ->where('alumnos.estadoAlumno', '!=', 'RETIRADO')
                ->select(
                    'cursos.*',
                    'carreras.nombres as carrera_nombre', // Nombre de la carrera
                    'plan_de_estudios.nombre as plan_estudio_nombre', // Nombre del plan de estudio
                    'ciclos.nombre as ciclo_nombre', // Nombre del ciclo
                    'modulos_formativos.nombre as modulo_formativo_nombre', // Nombre del módulo (Competencia)
                    'modulos_formativos.nombre as competencia_nombre', // Alias para Competencia
                    'area_de_formacion.nombre as area_de_formacion_nombre', // Nombre del área de formación
                    'alumnos.id as alumno_id' // ID del alumno
                )
                ->get();

            return response()->json($courses);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }

    // Corregir el método updateCursoEstado en CursoAlumnoController.php

    public function updateCursoEstado(Request $request)
    {
        $rules = [
            'cursoId' => 'required|integer',
            'estadoId' => 'required|integer',
            'alumnoId' => 'required|integer',
        ];

        $validator = Validator::make($request->all(), $rules);

        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 422);
        }

        $validatedData = $validator->validated();

        // Encuentra el curso alumno que corresponde
        $cursoAlumno = CursoAlumno::where('curso_id', $validatedData['cursoId'])
            ->where('alumno_id', $validatedData['alumnoId'])
            ->first();

        if ($cursoAlumno) {
            // Mapear estado_id a estado_curso_id correspondiente
            $estadoCursoId = null;

            switch ($validatedData['estadoId']) {
                case 1: // PENDIENTE
                    $estadoCurso = DB::table('estado_curso_alumno')->where('nombre', 'PENDIENTE')->first();
                    $estadoCursoId = $estadoCurso ? $estadoCurso->id : null;
                    break;
                case 2: // EN PROCESO
                    $estadoCurso = DB::table('estado_curso_alumno')->where('nombre', 'EN PROCESO')->first();
                    $estadoCursoId = $estadoCurso ? $estadoCurso->id : null;
                    break;
                case 3: // APROBADO
                    $estadoCurso = DB::table('estado_curso_alumno')->where('nombre', 'APROBADO')->first();
                    $estadoCursoId = $estadoCurso ? $estadoCurso->id : null;
                    break;
                case 4: // DESAPROBADO
                    $estadoCurso = DB::table('estado_curso_alumno')->where('nombre', 'DESAPROBADO')->first();
                    $estadoCursoId = $estadoCurso ? $estadoCurso->id : null;
                    break;
                case 5: // OBSERVADO (si existe)
                    $estadoCurso = DB::table('estado_curso_alumno')->where('nombre', 'OBSERVADO')->first();
                    $estadoCursoId = $estadoCurso ? $estadoCurso->id : null;
                    break;
                case 6: // FINALIZADO
                    // Para FINALIZADO, mantener el estado_curso_id actual si ya está APROBADO/DESAPROBADO
                    // Si no, no permitir el cambio (esto se maneja en el frontend)
                    $estadoCursoId = $cursoAlumno->estado_curso_id;
                    break;
            }

            // Actualizar los campos
            $cursoAlumno->estado_id = $validatedData['estadoId'];

            // Solo actualizar estado_curso_id si se encontró un mapeo válido
            if ($estadoCursoId !== null) {
                $cursoAlumno->estado_curso_id = $estadoCursoId;
            }

            $cursoAlumno->save();

            return response()->json(['message' => 'Estado actualizado con éxito.'], 200);
        } else {
            return response()->json(['message' => 'Curso o alumno no encontrados.'], 404);
        }
    }






    // Método para asignar un curso a un alumno
    public function assign(Request $request)
    {
        try {
            $this->validate($request, [
                'curso_id' => 'required|integer|exists:cursos,id',
                'alumno_id' => 'required|integer|exists:alumnos,id',
            ]);

            $curso = Curso::findOrFail($request->curso_id);
            $curso->alumno_id = $request->alumno_id;
            $curso->save();

            return response()->json($curso, 200);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }

    // Agregar este método a tu CursoAlumnoController.php

    /**
     * Actualizar estados de cursos cuando un alumno cambie de ciclo
     * Los cursos del ciclo actual se ponen estado_id = 2 (EN PROCESO)
     */
    public function actualizarEstadosCursosPorCiclo(Request $request)
    {
        DB::beginTransaction();
        try {
            $this->validate($request, [
                'alumno_id' => 'required|integer|exists:alumnos,id',
                'ciclo_id' => 'required|integer|exists:ciclos,id'
            ]);

            $alumno_id = $request->input('alumno_id');
            $ciclo_id = $request->input('ciclo_id');

            // Actualizar todos los cursos del ciclo actual del alumno a estado_id = 2 (EN PROCESO)
            $cursosActualizados = DB::table('curso_alumno')
                ->join('cursos', 'cursos.id', '=', 'curso_alumno.curso_id')
                ->where('curso_alumno.alumno_id', $alumno_id)
                ->where('cursos.ciclo_id', $ciclo_id)
                ->update([
                    'curso_alumno.estado_id' => 2, // 2 = EN PROCESO
                    'curso_alumno.updated_at' => Carbon::now()
                ]);

            DB::commit();

            return response()->json([
                'message' => 'Estados de cursos actualizados exitosamente',
                'status' => 'success',
                'data' => [
                    'cursos_actualizados' => $cursosActualizados,
                    'ciclo_id' => $ciclo_id,
                    'estado_aplicado' => 'EN PROCESO (estado_id = 2)'
                ]
            ], 200);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'message' => 'Error al actualizar estados de cursos: ' . $e->getMessage(),
                'status' => 'error'
            ], 500);
        }
    }
}
