<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class RegistroCalicaciones extends Controller
{
    public function getCalificaciones()
    {
        $calificaciones = DB::table('boletas_calificaciones')
            ->leftJoin('usuarios', 'usuarios.idUsuario', '=', 'boletas_calificaciones.idAlumnoBoletaCalificaciones')
            ->leftJoin('vista_materias_grados_grupos', 'vista_materias_grados_grupos.idMateria', '=', 'boletas_calificaciones.idMateriaBoletaCalificaciones')
            ->leftJoin('boletas_periodos', 'boletas_periodos.idPeriodo', '=', 'boletas_calificaciones.idPeriodoBoletaCalificaciones')
            ->select(
                DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', COALESCE(usuarios.apellidoPaterno, ''),
    ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombreAlumno"),
                DB::raw("CONCAT(COALESCE(vista_materias_grados_grupos.nombreGrado, ''), ' ', COALESCE(vista_materias_grados_grupos.nombreGrupo, '')) AS gradoGrupo"),
                'vista_materias_grados_grupos.idGradoGrupoRelacionado',
                'vista_materias_grados_grupos.nombreMateria',
                'boletas_periodos.nombrePeriodo',
                'boletas_calificaciones.*'
            )
            ->get();

        foreach ($calificaciones as $registro) {
            $registro->materiaGradoGrupo = $registro->nombreMateria . ' - ' . $registro->gradoGrupo;
        }

        return response()->json($calificaciones, 200);
    }

    // ------------------------------------------------------------------------------------

    public function registrarCalificacion(Request $request)
    {
        $message = '';
        $status = 0;

        try {
            // Verificar si ya existe una calificación para este alumno, materia y periodo
            $existente = DB::table('boletas_calificaciones')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idAlumnoBoletaCalificaciones', $request->alumno)
                ->where('idMateriaBoletaCalificaciones', $request->materia)
                ->where('idPeriodoBoletaCalificaciones', $request->periodo)
                ->where('estado', 'Activo')
                ->first();

            if ($existente) {
                // Actualizar la calificación existente
                DB::table('boletas_calificaciones')
                    ->where('id', $existente->id)
                    ->update([
                        'calificacion' => $request->calificacion,
                        'usuarioRegistro' => $request->usuarioRegistro
                    ]);

                $message = 'Calificación actualizada exitosamente';
                $status = 200;
            } else {
                // Insertar nueva calificación
                DB::table('boletas_calificaciones')->insert([
                    'idEscuela' => 'COLEGIOABC',
                    'idAlumnoBoletaCalificaciones' => $request->alumno,
                    'idMateriaBoletaCalificaciones' => $request->materia,
                    'idPeriodoBoletaCalificaciones' => $request->periodo,
                    'calificacion' => $request->calificacion,
                    'usuarioRegistro' => $request->usuarioRegistro,
                    'estado' => 'Activo',
                ]);

                $message = 'Registro de calificación exitoso';
                $status = 200;
            }
        } catch (\Exception $e) {
            $message = 'Error al procesar la calificación: ' . $e->getMessage();
            $status = 500;
        }

        return response()->json(['mensaje' => $message], $status);
    }

    // Nuevo método para carga masiva
    public function registrarCalificacionesMasivas(Request $request)
    {
        $respuestas = [];
        $status = 200;

        try {
            $datos = $request->all();
            $usuarioRegistro = $request->header('usuario'); // O como lo estés recibiendo

            foreach ($datos as $calificacion) {
                $response = $this->registrarCalificacionIndividual($calificacion, $usuarioRegistro);
                $respuestas[] = $response;
            }

            $message = 'Proceso de carga masiva completado';
        } catch (\Exception $e) {
            $message = 'Error en carga masiva: ' . $e->getMessage();
            $status = 500;
        }

        return response()->json(['mensaje' => $message, 'detalles' => $respuestas], $status);
    }

    private function registrarCalificacionIndividual($calificacion, $usuarioRegistro)
    {
        try {
            // Verificar si ya existe
            $existente = DB::table('boletas_calificaciones')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idAlumnoBoletaCalificaciones', $calificacion['alumnoId'])
                ->where('idMateriaBoletaCalificaciones', $calificacion['materiaId'])
                ->where('idPeriodoBoletaCalificaciones', $calificacion['periodoId'])
                ->where('estado', 'Activo')
                ->first();

            if ($existente) {
                // Actualizar
                DB::table('boletas_calificaciones')
                    ->where('id', $existente->id)
                    ->update([
                        'calificacion' => $calificacion['calificacion'],
                        'usuarioRegistro' => 'JUAN'
                    ]);

                return [
                    'alumno' => $calificacion['alumnoId'],
                    'materia' => $calificacion['materiaId'],
                    'periodo' => $calificacion['periodoId'],
                    'mensaje' => 'Actualizado',
                    'status' => 200
                ];
            } else {
                // Insertar
                DB::table('boletas_calificaciones')->insert([
                    'idEscuela' => 'COLEGIOABC',
                    'idAlumnoBoletaCalificaciones' => $calificacion['alumnoId'],
                    'idMateriaBoletaCalificaciones' => $calificacion['materiaId'],
                    'idPeriodoBoletaCalificaciones' => $calificacion['periodoId'],
                    'calificacion' => $calificacion['calificacion'],
                    'usuarioRegistro' => 'JUAN',
                    'estado' => 'Activo',
                ]);

                return [
                    'alumno' => $calificacion['alumnoId'],
                    'materia' => $calificacion['materiaId'],
                    'periodo' => $calificacion['periodoId'],
                    'mensaje' => 'Registrado',
                    'status' => 200
                ];
            }
        } catch (\Exception $e) {
            return [
                'alumno' => $calificacion['alumnoId'],
                'materia' => $calificacion['materiaId'],
                'periodo' => $calificacion['periodoId'],
                'mensaje' => 'Error: ' . $e->getMessage(),
                'status' => 500
            ];
        }
    }
    // ----------------------------------------------------------------
    public function editarCalificacion(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $registro = DB::table('boletas_calificaciones')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idAlumnoBoletaCalificaciones', $request->alumnos)
                ->where('idMateriaBoletaCalificaciones', $request->materias)
                ->where('idPeriodoBoletaCalificaciones', $request->periodo)
                ->update([
                    'calificacion' => $request->calificacion,
                    'usuarioRegistro' => $request->usuarioRegistro,
                ]);
            $message = 'Registro de calficiacion actualizado';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al editar el registro: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function eliminarEstado(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $registro = DB::table('boletas_calificaciones')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idAlumnoBoletaCalificaciones', $request->alumnos)
                ->where('idMateriaBoletaCalificaciones', $request->materias)
                ->where('idPeriodoBoletaCalificaciones', $request->periodo)
                ->update([
                    'estado' => 'Eliminado',
                ]);
            $message = 'Registro eliminado correctamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al eliminar el registro: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function habilitarEstado(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $registro = DB::table('boletas_calificaciones')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idAlumnoBoletaCalificaciones', $request->alumnos)
                ->where('idMateriaBoletaCalificaciones', $request->materias)
                ->where('idPeriodoBoletaCalificaciones', $request->periodo)
                ->update([
                    'estado' => 'Activo',
                ]);
            $message = 'Registro habilitado correctamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al habilitar el registro: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }


    public function getPeriodos()
    {
        $periodoBoleta = DB::table('boletas_periodos')
            ->where('estado', 'Activo')
            ->select('idPeriodo', 'nombrePeriodo')
            ->get();
        return response()->json($periodoBoleta, 200);
    }


    public function getCalificacionesMateria(Request $request)
    {
        $idGradoGrupo = $request->idGradoGrupo;
        $idMateria = $request->idMateria;

        // Determinar si el parámetro es un grupo o un grado
        $esGrupo = DB::table('grupos_usuarios')
            ->where('idGrupo', $idGradoGrupo)
            ->exists();

        $calificaciones = DB::table('grupos_usuarios as g')
            ->join('usuarios as u', function ($join) {
                $join->on('g.idEscuela', '=', 'u.idEscuela')
                    ->on('g.idUsuario', '=', 'u.idUsuario')
                    ->where('u.tipoUsuario', '=', 'AL')
                    ->where('u.estatus', '=', 'Activo');
            })
            ->join('materias as m', function ($join) use ($idMateria, $idGradoGrupo, $esGrupo) {
                $join->on('m.idEscuela', '=', 'g.idEscuela')
                    ->where('m.idMateria', '=', $idMateria)
                    ->where('m.estado', '=', 'Activo')
                    ->where('m.idGradoGrupoRelacionado', $idGradoGrupo);
            })
            ->leftJoin('boletas_calificaciones as b', function ($join) use ($idMateria) {
                $join->on('b.idEscuela', '=', 'g.idEscuela')
                    ->on('b.idAlumnoBoletaCalificaciones', '=', 'g.idUsuario')
                    ->where('b.idMateriaBoletaCalificaciones', '=', $idMateria)
                    ->where('b.estado', '=', 'Activo');
            })
            ->when($esGrupo, function ($query) use ($idGradoGrupo) {
                // Si es un grupo, filtrar por grupo
                $query->where('g.idGrupo', $idGradoGrupo);
            }, function ($query) use ($idGradoGrupo) {
                // Si es un grado, filtrar por grado
                $query->where('u.grado', $idGradoGrupo);
            })
            ->where('g.estado', 'Activo')
            ->select([
                'g.idEscuela',
                'g.idGrupo',
                'g.idUsuario',
                'u.primerNombre',
                'u.segundoNombre',
                'u.apellidoPaterno',
                'u.apellidoMaterno',
                'u.grado',
                'm.idMateria',
                'm.nombreMateria',
                'm.idGradoGrupoRelacionado',
                'b.idPeriodoBoletaCalificaciones',
                'b.calificacion'
            ])
            ->orderBy('u.apellidoPaterno')
            ->orderBy('u.apellidoMaterno')
            ->orderBy('u.primerNombre')
            ->get();

        return response()->json($calificaciones, 200);
    }

}
