<?php

namespace App\Http\Controllers\Api;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use  App\Models\PersonaAutorizada;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use App\Services\PeriodoService;

class RegistroAcademico extends Controller
{

     protected $nombrePeriodoActivo;

   public function __construct(PeriodoService $periodoService)
{
    try {
        $this->nombrePeriodoActivo = $periodoService->obtenerPeriodoActivoNombre();
    } catch (\Exception $e) {
        $this->nombrePeriodoActivo = null;
    }
}

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

    try {
        DB::beginTransaction();

        // Guardar personas autorizadas como JSON
        $personasJson = json_encode($request->personasAutorizadas ?? []);

        // Armar el array con TODOS los campos que vas a insertar
        $data = [
            'idEscuela' => 'COLEGIOABC',
            'idAlumno' => $request->idAlumno ?? '',
            'FiDI_Nombre1' => $request->primerNombre ?? '',
            'FiDI_Nombre2' => $request->segundoNombre ?? null,
            'FiDI_ApellidoPaterno' => $request->apellidoPaterno ?? '',
            'FiDI_ApellidoMaterno' => $request->apellidoMaterno ?? '',
            'FiDI_CURP' => $request->curp ?? '',
            'FiDI_Sexo' => $request->sexo ?? '',
            'FiDI_Edad' => $request->edad ?? '',
            'FiDI_NacCiudad' => $request->ciudadNacimiento ?? '',
            'FiDI_NacEstado' => $request->estado ?? '',
            'FiDI_NacFechaDia' => $request->diaNacimiento ?? '',
            'FiDI_NacFechaMes' => $request->mesNacimiento ?? '',
            'FiDI_NacFechaAnio' => $request->añoNacimiento ?? '',
            'FiDI_Domicilio' => $request->domicilio ?? '',
            'FiDI_Telefono' => $request->telefonoCasa ?? '',
            'FiDI_InstProce' => $request->institucionProcedencia ?? '',
            'FiDI_MotivoCambio' => $request->motivoCambio ?? '',
            // Padres
            'FiDI_PadNombre1' => $request->padrePrimerNombre ?? '',
            'FiDI_PadNombre2' => $request->padreSegundoNombre ?? null,
            'FiDI_PadApellidoPaterno' => $request->padreApellidoPaterno ?? '',
            'FiDI_PadApellidoMaterno' => $request->padreApellidoMaterno ?? '',
            'FiDI_PadCURP' => $request->padreCurp ?? '',
            'FiDI_PadNacionalidad' => $request->padreNacionalidad ?? '',
            'FiDI_PadEstadoCivil' => $request->padreEstadoCivil ?? '',
            'FiDI_PadNacFechaDia' => $request->padreDiaNacimiento ?? '',
            'FiDI_PadNacFechaMes' => $request->padreMesNacimiento ?? '',
            'FiDI_PadNacFechaAnio' => $request->padreAñoNacimiento ?? '',
            'FiDI_PadDomicilio' => $request->padreDomicilio ?? '',
            'FiDI_PadCP' => $request->padreCPDomicilio ?? '',
            'FiDI_PadEscolaridad' => $request->padreEscolaridad ?? '',
            'FiDI_PadOcupacion' => $request->padreOcupacion ?? '',
            'FiDI_PadLugTrabajo' => $request->padreLugarTrabajo ?? '',
            'FiDI_PadTelTrabajo' => $request->padreTelefonoTrabajo ?? '',
            'FiDI_PadTelTrabajoExt' => $request->padreExtension ?? '',
            'FiDI_PadCelular' => $request->padreCelular ?? '',
            'FiDI_PadCorreo' => $request->padreCorreo ?? '',
            // Madres
            'FiDI_MadNombre1' => $request->madrePrimerNombre ?? '',
            'FiDI_MadNombre2' => $request->madreSegundoNombre ?? null,
            'FiDI_MadApellidoPaterno' => $request->madreApellidoPaterno ?? '',
            'FiDI_MadApellidoMaterno' => $request->madreApellidoMaterno ?? '',
            'FiDI_MadCURP' => $request->madreCurp ?? '',
            'FiDI_MadNacionalidad' => $request->madreNacionalidad ?? '',
            'FiDI_MadEstadoCivil' => $request->madreEstadoCivil ?? '',
            'FiDI_MadNacFechaDia' => $request->madreDiaNacimiento ?? '',
            'FiDI_MadNacFechaMes' => $request->madreMesNacimiento ?? '',
            'FiDI_MadNacFechaAnio' => $request->madreAñoNacimiento ?? '',
            'FiDI_MadDomicilio' => $request->madreDomicilio ?? '',
            'FiDI_MadCP' => $request->madreCPDomicilio ?? '',
            'FiDI_MadEscolaridad' => $request->madreEscolaridad ?? '',
            'FiDI_MadOcupacion' => $request->madreOcupacion ?? '',
            'FiDI_MadLugTrabajo' => $request->madreLugarTrabajo ?? '',
            'FiDI_MadTelTrabajo' => $request->madreTelefonoTrabajo ?? '',
            'FiDI_MadTelTrabajoExt' => $request->madreExtension ?? '',
            'FiDI_MadCelular' => $request->madreCelular ?? '',
            'FiDI_MadCorreo' => $request->madreCorreo ?? '',
            // Autorizaciones
            'FiDI_RetirarseSolo' => $request->AutorizarAlum ?? 'No',
            'FiDI_RecogerMadre' => $request->MadreFam ?? 'No',
            'FiDI_RecogerPadre' => $request->PadreFam ?? 'No',
            // personas autorizadas (EXCLUIDO de la validación)
            'personasAutorizadas' => $personasJson,
            // Padecimientos
            'CedA_TipoSangre' => $request->tipoSangre ?? '',
            'CedA_AlergiaAspirina' => $request->aspirina ?? '',
            'CedA_AlergiaPenicilina' => $request->penicilina ?? '',
            'CedA_AlergiaOtro' => $request->otrosMedicamentos ?? '',
            'CedA_PadPaperas' => $request->paperas ?? '',
            'CedA_PadSarampio' => $request->sarampion ?? '',
            'CedA_PadRubeola' => $request->rubeola ?? '',
            'CedA_PadEscarlatina' => $request->escarlatina ?? '',
            'CedA_PadTosferina' => $request->tosferina ?? '',
            'CedA_PadTifoidea' => $request->tifoidea ?? '',
            'CedA_PadHepatitis' => $request->hepatitis ?? '',
            'CedA_PadVaricela' => $request->varicela ?? '',
            'CedA_PadBronquitis' => $request->bronquitis ?? '',
            'CedA_PadApendicitis' => $request->apendicitis ?? '',
            'CedA_PadMeningitis' => $request->meninguitis ?? '',
            'CedA_PadDesmayos' => $request->desmayos ?? '',
            'CedA_PadCovid19' => $request->covid ?? '',
            'CedA_PadGarganta' => $request->garganta ?? '',
            'CedA_PadEstomago' => $request->estomago ?? '',
            'CedA_PadCatarro' => $request->catarro ?? '',
            'CedA_PadDiarrea' => $request->diarrea ?? '',
            'CedA_PadDolorCabeza' => $request->dolorCabeza ?? '',
            'CedA_PadFiebreAlta' => $request->fiebreAlta ?? '',
            'CedA_PadComezon' => $request->comezonFrecuente ?? '',
            'CedA_PadMareos' => $request->mareos ?? '',
            'CedA_DiabeticoPrecauciones' => $request->diabetes ?? '',
            'CedA_AsmaticoPrecauciones' => $request->asmatico ?? '',
            'CedA_EpilepticoPrecauciones' => $request->epileptico ?? '',
            'CedA_EnfermedadEnPiel' => $request->enfermedadPiel ?? '',
            // Antecedentes
            'CedA_ProbEmbarazo' => $request->problemasEmbarazo ?? '',
            'CedA_ProbParto' => $request->problemasParto ?? '',
            'CedA_PesoNacimiento' => $request->peso ?? '',
            'CedA_AlturaNacimiento' => $request->talla1 ?? '',
            'CedA_PesoActual' => $request->pesoActual ?? '',
            'CedA_AlturaActual' => $request->tallaActual ?? '',
            'CedA_EsfinteresDiurno' => $request->edad1 ?? '',
            'CedA_EsfinteresNocturno' => $request->edad2 ?? '',
            'CedA_Gateo' => $request->gateo ?? '',
            'CedA_GateoEdad' => $request->edadGateo ?? '',
            'CedA_EdadHablo' => $request->edadHablo ?? '',
            'CedA_EdadCamino' => $request->edadCamino ?? '',
            'CedA_EnfermedadesPadecidas' => $request->enfermedades ?? '',
            'CedA_EnfermedadesAlergiasActuales' => $request->alergias ?? '',
            'CedA_TratamientoMedicoActual' => $request->tratamientoMedico ?? '',
            'CedA_UsaLentes' => $request->lentes ?? '',
            'CedA_PiePlano' => $request->piePlano ?? '',
            'CedA_Ortopedico' => $request->zapatoOrtopedico ?? '',
            'CedA_ProbAprendizaje' => $request->problemasAprendizaje ?? '',
            'CedA_RelPareja' => $request->relacionPareja ?? '',
            'CedA_ProblemasFamiliares' => $request->problemasFamilia ?? '',
            'CedA_HijoAfectado' => $request->afectacionProblemas ?? '',
            'CedA_TratPsicologico' => $request->tratamientoPsicologico ?? '',
            'CedA_LoQueDesagradaFamilia' => $request->desagradaFamilia ?? '',
            'CedA_LoQueAgradaFamilia' => $request->agradaFamilia ?? '',
            'CedA_HogarNoGustan' => $request->actividadDesagrada ?? '',
            'CedA_HogarGustan' => $request->actividadAgrada ?? '',
            'CedA_Defectos' => $request->defectos ?? '',
            'CedA_Virtudes' => $request->virtudes ?? '',
            'CedA_Futuro' => $request->futuro ?? '',
            'CedA_Comentario' => $request->comentarios ?? '',
            'usuarioRegistro' => $request->usuarioRegistro ?? '',
        ];

        // Validación automática: si alguna propiedad (excepto personasAutorizadas) está vacía => incompleto
        $incompleto = false;
        foreach ($data as $key => $val) {
            if ($key === 'personasAutorizadas') continue;
            if (is_null($val)) { $incompleto = true; break; }
            if (is_string($val) && trim($val) === '') { $incompleto = true; break; }
        }

        $data['completado'] = $incompleto ? 0 : 1;

        // Insert en un solo paso
        $idRegistro = DB::table('registroacademico')->insertGetId($data);

        DB::commit();

        $message = 'Registro exitoso';
        $status = 200;
    } catch (\Exception $e) {
        DB::rollBack();
        $message = $e->getMessage();
        $status = 500;
    }

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



public function ActualizarRegistroAca(Request $request, $id)
{
  $id = base64_decode($id);
    $message = '';
    $status = 0;
    $usuario = $request->usuario ?? 'sistema';

    try {
        DB::beginTransaction();

        // Buscar registro
        $registroExistente = DB::table('registroacademico')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('idAlumno', $id)
            ->first();

        if (!$registroExistente) {
            return response()->json(['mensaje' => 'Registro no encontrado'], 404);
        }

        // Manejo de personas autorizadas
        $personasJson = $registroExistente->personasAutorizadas;
        if (!empty($request->personasAutorizadas)) {
            $personasExistentes = json_decode($registroExistente->personasAutorizadas, true) ?? [];
            $personasJson = json_encode(array_merge($personasExistentes, $request->personasAutorizadas));
        }

        // Construimos el array de actualización
        $datosUpdate = [
            'idEscuela' => 'COLEGIOABC',
            'idAlumno' => $request->idAlumno ?? '',
            'FiDI_Nombre1' => $request->primerNombre ?? '',
            'FiDI_Nombre2' => $request->segundoNombre ?? null,
            'FiDI_ApellidoPaterno' => $request->apellidoPaterno ?? '',
            'FiDI_ApellidoMaterno' => $request->apellidoMaterno ?? '',
            'FiDI_CURP' => $request->curp ?? '',
            'FiDI_Sexo' => $request->sexo ?? '',
            'FiDI_Edad' => $request->edad ?? '',
            'FiDI_NacCiudad' => $request->ciudadNacimiento ?? '',
            'FiDI_NacEstado' => $request->estado ?? '',
            'FiDI_NacFechaDia' => $request->diaNacimiento ?? '',
            'FiDI_NacFechaMes' => $request->mesNacimiento ?? '',
            'FiDI_NacFechaAnio' => $request->añoNacimiento ?? '',
            'FiDI_Domicilio' => $request->domicilio ?? '',
            'FiDI_Telefono' => $request->telefonoCasa ?? '',
            'FiDI_InstProce' => $request->institucionProcedencia ?? '',
            'FiDI_MotivoCambio' => $request->motivoCambio ?? '',
            // Padres
            'FiDI_PadNombre1' => $request->padrePrimerNombre ?? '',
            'FiDI_PadNombre2' => $request->padreSegundoNombre ?? null,
            'FiDI_PadApellidoPaterno' => $request->padreApellidoPaterno ?? '',
            'FiDI_PadApellidoMaterno' => $request->padreApellidoMaterno ?? '',
            'FiDI_PadCURP' => $request->padreCurp ?? '',
            'FiDI_PadNacionalidad' => $request->padreNacionalidad ?? '',
            'FiDI_PadEstadoCivil' => $request->padreEstadoCivil ?? '',
            'FiDI_PadNacFechaDia' => $request->padreDiaNacimiento ?? '',
            'FiDI_PadNacFechaMes' => $request->padreMesNacimiento ?? '',
            'FiDI_PadNacFechaAnio' => $request->padreAñoNacimiento ?? '',
            'FiDI_PadDomicilio' => $request->padreDomicilio ?? '',
            'FiDI_PadCP' => $request->padreCPDomicilio ?? '',
            'FiDI_PadEscolaridad' => $request->padreEscolaridad ?? '',
            'FiDI_PadOcupacion' => $request->padreOcupacion ?? '',
            'FiDI_PadLugTrabajo' => $request->padreLugarTrabajo ?? '',
            'FiDI_PadTelTrabajo' => $request->padreTelefonoTrabajo ?? '',
            'FiDI_PadTelTrabajoExt' => $request->padreExtension ?? '',
            'FiDI_PadCelular' => $request->padreCelular ?? '',
            'FiDI_PadCorreo' => $request->padreCorreo ?? '',
            // Madres
            'FiDI_MadNombre1' => $request->madrePrimerNombre ?? '',
            'FiDI_MadNombre2' => $request->madreSegundoNombre ?? null,
            'FiDI_MadApellidoPaterno' => $request->madreApellidoPaterno ?? '',
            'FiDI_MadApellidoMaterno' => $request->madreApellidoMaterno ?? '',
            'FiDI_MadCURP' => $request->madreCurp ?? '',
            'FiDI_MadNacionalidad' => $request->madreNacionalidad ?? '',
            'FiDI_MadEstadoCivil' => $request->madreEstadoCivil ?? '',
            'FiDI_MadNacFechaDia' => $request->madreDiaNacimiento ?? '',
            'FiDI_MadNacFechaMes' => $request->madreMesNacimiento ?? '',
            'FiDI_MadNacFechaAnio' => $request->madreAñoNacimiento ?? '',
            'FiDI_MadDomicilio' => $request->madreDomicilio ?? '',
            'FiDI_MadCP' => $request->madreCPDomicilio ?? '',
            'FiDI_MadEscolaridad' => $request->madreEscolaridad ?? '',
            'FiDI_MadOcupacion' => $request->madreOcupacion ?? '',
            'FiDI_MadLugTrabajo' => $request->madreLugarTrabajo ?? '',
            'FiDI_MadTelTrabajo' => $request->madreTelefonoTrabajo ?? '',
            'FiDI_MadTelTrabajoExt' => $request->madreExtension ?? '',
            'FiDI_MadCelular' => $request->madreCelular ?? '',
            'FiDI_MadCorreo' => $request->madreCorreo ?? '',
            // Autorizaciones
            'FiDI_RetirarseSolo' => $request->AutorizarAlum ?? 'No',
            'FiDI_RecogerMadre' => $request->MadreFam ?? 'No',
            'FiDI_RecogerPadre' => $request->PadreFam ?? 'No',
            // personas autorizadas
            'personasAutorizadas' => $personasJson,
            // ejemplo: aquí irían todos los campos médicos y antecedentes...
             'CedA_TipoSangre' => $request->tipoSangre ?? '',
                'CedA_AlergiaAspirina' => $request->aspirina ?? '',
                'CedA_AlergiaPenicilina' => $request->penicilina ?? '',
                'CedA_AlergiaOtro' => $request->otrosMedicamentos ?? '',
                'CedA_PadPaperas' => $request->paperas ?? '',
                'CedA_PadSarampio' => $request->sarampion ?? '',
                'CedA_PadRubeola' => $request->rubeola ?? '',
                'CedA_PadEscarlatina' => $request->escarlatina ?? '',
                'CedA_PadTosferina' => $request->tosferina ?? '',
                'CedA_PadTifoidea' => $request->tifoidea ?? '',
                'CedA_PadHepatitis' => $request->hepatitis ?? '',
                'CedA_PadVaricela' => $request->varicela ?? '',
                'CedA_PadBronquitis' => $request->bronquitis ?? '',
                'CedA_PadApendicitis' => $request->apendicitis ?? '',
                'CedA_PadMeningitis' => $request->meninguitis ?? '',
                'CedA_PadDesmayos' => $request->desmayos ?? '',
                'CedA_PadCovid19' => $request->covid ?? '',
                'CedA_PadGarganta' => $request->garganta ?? '',
                'CedA_PadEstomago' => $request->estomago ?? '',
                'CedA_PadCatarro' => $request->catarro ?? '',
                'CedA_PadDiarrea' => $request->diarrea ?? '',
                'CedA_PadDolorCabeza' => $request->dolorCabeza ?? '',
                'CedA_PadFiebreAlta' => $request->fiebreAlta ?? '',
                'CedA_PadComezon' => $request->comezonFrecuente ?? '',
                'CedA_PadMareos' => $request->mareos ?? '',
                'CedA_DiabeticoPrecauciones' => $request->diabetes ?? '',
                'CedA_AsmaticoPrecauciones' => $request->asmatico ?? '',
                'CedA_EpilepticoPrecauciones' => $request->epileptico ?? '',
                'CedA_EnfermedadEnPiel' => $request->enfermedadPiel ?? '',
                'CedA_ProbEmbarazo' => $request->problemasEmbarazo ?? '',
                'CedA_ProbParto' => $request->problemasParto ?? '',
                'CedA_PesoNacimiento' => $request->peso ?? '',
                'CedA_AlturaNacimiento' => $request->talla1 ?? '',
                'CedA_PesoActual' => $request->pesoActual ?? '',
                'CedA_AlturaActual' => $request->tallaActual ?? '',
                'CedA_EsfinteresDiurno' => $request->edad1 ?? '',
                'CedA_EsfinteresNocturno' => $request->edad2 ?? '',
                'CedA_Gateo' => $request->gateo ?? '',
                'CedA_GateoEdad' => $request->edadGateo ?? '',
                'CedA_EdadHablo' => $request->edadHablo ?? '',
                'CedA_EdadCamino' => $request->edadCamino ?? '',
                'CedA_EnfermedadesPadecidas' => $request->enfermedades ?? '',
                'CedA_EnfermedadesAlergiasActuales' => $request->alergias ?? '',
                'CedA_TratamientoMedicoActual' => $request->tratamientoMedico ?? '',
                'CedA_UsaLentes' => $request->lentes ?? '',
                'CedA_PiePlano' => $request->piePlano ?? '',
                'CedA_Ortopedico' => $request->zapatoOrtopedico ?? '',
                'CedA_ProbAprendizaje' => $request->problemasAprendizaje ?? '',
                'CedA_RelPareja' => $request->relacionPareja ?? '',
                'CedA_ProblemasFamiliares' => $request->problemasFamilia ?? '',
                'CedA_HijoAfectado' => $request->afectacionProblemas ?? '',
                'CedA_TratPsicologico' => $request->tratamientoPsicologico ?? '',
                'CedA_LoQueDesagradaFamilia' => $request->desagradaFamilia ?? '',
                'CedA_LoQueAgradaFamilia' => $request->agradaFamilia ?? '',
                'CedA_HogarNoGustan' => $request->actividadDesagrada ?? '',
                'CedA_HogarGustan' => $request->actividadAgrada ?? '',
                'CedA_Defectos' => $request->defectos ?? '',
                'CedA_Virtudes' => $request->virtudes ?? '',
                'CedA_Futuro' => $request->futuro ?? '',
                'CedA_Comentario' => $request->comentarios ?? '',
            'usuarioRegistro' => $usuario,
        ];

        // Verificar si está completo
        $incompleto = false;
        foreach ($datosUpdate as $key => $val) {
            if ($key === 'personasAutorizadas') continue;
            if (is_null($val)) { $incompleto = true; break; }
            if (is_string($val) && trim($val) === '') { $incompleto = true; break; }
        }
        $datosUpdate['completado'] = $incompleto ? 0 : 1;

        // Actualizar
        DB::table('registroacademico')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('idAlumno', $id)
            ->update($datosUpdate);

        DB::commit();

        return response()->json([
            'mensaje' => 'Registro actualizado correctamente',
            'completado' => $datosUpdate['completado']
        ], 200);

    } catch (\Exception $e) {
        DB::rollBack();
        return response()->json([
            'mensaje' => 'Error al actualizar el registro',
            'error' => $e->getMessage()
        ], 500);
    }
}

    public function getOneRegistro($id){
        $id = base64_decode($id);
        $registro = DB::table('registroacademico')
        ->where('idEscuela', 'COLEGIOABC')
        ->where('idAlumno', $id)
        ->get();
        return response()->json([
            'mensaje' => 'Registro encontrado',
            'registro' => $registro
        ]);
    }

    public function getAll(){
        $registro = DB::table('registroacademico')
        ->where('idEscuela', 'COLEGIOABC')
        ->get();
        return response()->json([
            'mensaje' => 'Registro encontrado',
            'registro' => $registro
        ]);
    }

    public function getAllAd(){
        $registro = DB::table('registroadministrativo')
        ->where('idEscuela', 'COLEGIOABC')
        ->get();
        return response()->json([
            'mensaje' => 'Registro encontrado',
            'registro' => $registro
        ]);
    }

public function registroAdministrativo(Request $request)
{
    $message = '';
    $status = 0;
    $rutaS3 = null;
    $uuidArchivo = Str::uuid()->toString();
    $carpetaBase = config('custom.s3_carpeta_base');

    try {
        $periodoService = new PeriodoService();
        $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre();

        $request->validate([
            'idAlumno' => 'required',
            'usuarioRegistro' => 'required',
        ]);

        // Normalizar el valor de 'factura'
        $requiereFactura = strtolower(trim($request->factura ?? 'no')) === 'sí' || strtolower(trim($request->factura ?? 'no')) === 'si' ? 'Sí' : 'No';

        // Validación y carga del archivo si se requiere factura
        if ($requiereFactura === 'Sí' && $request->hasFile('constanciaFiscal')) {
            $archivo = $request->file('constanciaFiscal');

            if (!$archivo->isValid()) {
                throw new \Exception('Archivo inválido');
            }

            if (!$carpetaPeriodo) {
                throw new \Exception('No hay un período activo configurado. No se puede subir archivos.');
            }

            $originalName = $archivo->getClientOriginalName();

            if (strlen($originalName) > 250) {
                throw new \Exception('El nombre del archivo excede los 250 caracteres permitidos.');
            }

            if (!preg_match('/^[a-zA-Z0-9\s._\-\(\)ñÑáéíóúÁÉÍÓÚ]+$/u', $originalName)) {
                throw new \Exception('El nombre del archivo contiene caracteres no permitidos.');
            }

            if ($archivo->getClientMimeType() !== 'application/pdf') {
                throw new \Exception('Solo se permiten archivos PDF.');
            }

            if ($archivo->getSize() > 5 * 1024 * 1024) {
                throw new \Exception('El archivo no puede ser mayor a 5MB.');
            }

            $nombreArchivo = $uuidArchivo . '-' . $request->idAlumno . '-' . $originalName;
            $rutaS3 = $carpetaBase . '/' . $carpetaPeriodo . '/constancias_fiscales/' . $nombreArchivo;

            Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');
        }

        // Si no se requiere factura o no se subió archivo, se asigna 'NA'
        if ($requiereFactura === 'No' || !$rutaS3) {
            $rutaS3 = 'NA';
        }

        $registro = [
            'idEscuela' => $request->idEscuela ?? 'COLEGIOABC',
            'idAlumno' => $request->idAlumno,
            'RegA_MesInscripcion' => $request->mesInscripcion ?? '',
            'RegA_GradoCursar' => $request->gradoCursar ?? '',
            'RegA_BecaCurso' => $request->becaCurso ?? '',
            'RegA_BecaPorcentaje' => $request->becaPorcentaje ?? '',
            'RegA_PlanPagos' => $request->planPago ?? '',
            'RegA_RequiereFactura' => $requiereFactura,
            'RegA_MetodoPago' => $requiereFactura === 'No' ? 'NA' : ($request->metodoPago ?? $request->metedoPago ?? ''),
            'RegA_RfcFactura' => $requiereFactura === 'No' ? 'NA' : ($request->RFCFactura ?? ''),
            'RegA_NombreFactura' => $requiereFactura === 'No' ? 'NA' : ($request->razonSocial ?? ''),
            'RegA_DireccionFactura' => $requiereFactura === 'No' ? 'NA' : ($request->domicilioFactura ?? 'NA'),
            'RegA_CorreoFactura' => $requiereFactura === 'No' ? 'NA' : ($request->correoFactura ?? 'NA'),
            'RegA_ConstanciaFiscal' => $rutaS3,
            'RegA_Modalidad' => 'Presencial',
            'usuarioRegistro' => $request->usuarioRegistro,
            'created_at' => now(),
            'updated_at' => now(),
        ];

        $insertado = DB::table('registroadministrativo')->insert($registro);

        if (!$insertado) {
            throw new \Exception('No se pudo insertar el registro en la base de datos');
        }

        $message = 'Registro exitoso';
        $status = 200;
    } catch (\Exception $e) {
        if ($rutaS3 && $rutaS3 !== 'NA' && Storage::disk('s3')->exists($rutaS3)) {
            Storage::disk('s3')->delete($rutaS3);
        }

        $message = 'Error: ' . $e->getMessage();
        $status = 500;
    }

    return response()->json([
        'mensaje' => $message,
        'archivo' => $rutaS3,
        'uuid' => $rutaS3 && $rutaS3 !== 'NA' ? $uuidArchivo : null,
    ], $status);
}



public function eliminarArchivo(Request $request)
{
    try {
        $request->validate([
            'rutaArchivo' => 'required|string'
        ]);

        $ruta = $request->input('rutaArchivo');

        // Buscar el registro que contiene esta ruta
        $registro = DB::table('registroadministrativo')
            ->where('RegA_ConstanciaFiscal', $ruta)
            ->first();

        if (!$registro) {
            return response()->json(['mensaje' => 'Registro no encontrado con esa ruta'], 404);
        }

        if (Storage::disk('s3')->exists($ruta)) {
            Storage::disk('s3')->delete($ruta);
        }

        DB::table('registroadministrativo')
            ->where('RegA_ConstanciaFiscal', $ruta)
            ->update([
                'RegA_ConstanciaFiscal' => null,
                'updated_at' => now()
            ]);

        return response()->json(['mensaje' => 'Archivo eliminado correctamente'], 200);

    } catch (\Exception $e) {
        return response()->json([
            'mensaje' => 'Error al eliminar archivo',
            'error' => $e->getMessage()
        ], 500);
    }
}
public function editarRegistroAdmin(Request $request, $id)
{
    $message = '';
    $status = 0;
    $rutaS3 = '';
    $uuidArchivo = Str::uuid()->toString();
    $carpetaBase = config('custom.s3_carpeta_base');

    try {
        $idAlumno = base64_decode($id);

        $registroExistente = DB::table('registroadministrativo')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('idAlumno', $idAlumno)
            ->first();

        if (!$registroExistente) {
            return response()->json(['mensaje' => 'Registro no encontrado'], 404);
        }

        $datosActualizar = ['updated_at' => now()];

        if ($request->hasFile('constanciaFiscal')) {
            $periodoService = new PeriodoService();
            $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre();

            if (!$carpetaPeriodo) {
                throw new \Exception('No hay un período activo configurado. No se puede subir archivos.');
            }

            $archivo = $request->file('constanciaFiscal');

            if (!$archivo->isValid()) {
                throw new \Exception('Archivo inválido');
            }

            $originalName = $archivo->getClientOriginalName();

            if (strlen($originalName) > 250) {
                throw new \Exception('El nombre del archivo excede los 250 caracteres permitidos.');
            }

            if (!preg_match('/^[a-zA-Z0-9\s._\-\(\)ñÑáéíóúÁÉÍÓÚ]+$/u', $originalName)) {
                throw new \Exception('El nombre del archivo contiene caracteres no permitidos.');
            }

            if ($archivo->getClientMimeType() !== 'application/pdf') {
                throw new \Exception('Solo se permiten archivos PDF.');
            }

            if ($archivo->getSize() > 5 * 1024 * 1024) {
                throw new \Exception('El archivo no puede ser mayor a 5MB.');
            }

            $nombreArchivo = $uuidArchivo . '-' . $idAlumno . '-' . $originalName;

            $rutaS3 =  $carpetaBase . '/' .$carpetaPeriodo . '/constancias_fiscales/' . $nombreArchivo;

            Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');

            $datosActualizar['RegA_ConstanciaFiscal'] = $rutaS3;
        }

        $camposMapeo = [
            'mesInscripcion' => 'RegA_MesInscripcion',
            'gradoCursar' => 'RegA_GradoCursar',
            'becaCurso' => 'RegA_BecaCurso',
            'becaPorcentaje' => 'RegA_BecaPorcentaje',
            'planPago' => 'RegA_PlanPagos',
            'factura' => 'RegA_RequiereFactura',
            'metedoPago' => 'RegA_MetodoPago',
            'RFCFactura' => 'RegA_RfcFactura',
            'razonSocial' => 'RegA_NombreFactura',
            'domicilioFactura' => 'RegA_DireccionFactura',
            'correoFactura' => 'RegA_CorreoFactura',
            'usuarioRegistro' => 'usuarioRegistro',
        ];

        foreach ($camposMapeo as $campoRequest => $campoBD) {
            if ($request->has($campoRequest)) {
                $valor = $request->input($campoRequest);
                if ($valor !== null && $valor !== '') {
                    $datosActualizar[$campoBD] = $valor;
                }
            }
        }

        if ($request->has('idEscuela')) {
            $datosActualizar['idEscuela'] = $request->input('idEscuela');
        }

        if (!isset($datosActualizar['RegA_ConstanciaFiscal']) && empty($registroExistente->RegA_ConstanciaFiscal)) {
            $datosActualizar['RegA_ConstanciaFiscal'] = 'NA';
        }

        DB::table('registroadministrativo')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('idAlumno', $idAlumno)
            ->update($datosActualizar);

        $message = 'Actualización exitosa';
        $status = 200;
    } catch (\Exception $e) {
        if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) {
            Storage::disk('s3')->delete($rutaS3);
        }

        $message = 'Error interno: ' . $e->getMessage();
        $status = 500;
    }

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


    public function getOneRegistroAdmi($id){
        $id = base64_decode($id);
        $registro = DB::table('registroadministrativo')
        ->where('idEscuela', 'COLEGIOABC')
        ->where('idAlumno', $id)
        ->get();
        return response()->json(['registro'=>$registro]);
    }

   public function getAllMetoPago(){
        $metodoPago = DB::table('config_metodopago')
        ->where('idEscuela', 'COLEGIOABC')
        ->get();
        return response()->json(['metodoPago'=>$metodoPago]);
    }

   public function getAllPlanPago(){
        $planPago = DB::table('config_planpago')
        ->where('idEscuela', 'COLEGIOABC')
        ->get();
        return response()->json(['planPago'=>$planPago]);
    }

  public function  getAllPorcentajeBeca(){
        $porcentajeBeca = DB::table('config_porcentajebeca')
        ->where('idEscuela', 'COLEGIOABC')
        ->get();
        return response()->json(['porcentajeBeca'=>$porcentajeBeca]);
    }

    public function findOne($id)
    {
        $id = base64_decode($id);
        $usuario = DB::table('usuarios')
            ->where('idUsuario', $id)
            ->select(
                DB::raw("CONCAT(COALESCE(primerNombre, ''), ' ', COALESCE(segundoNombre, ''), ' ', COALESCE(apellidoPaterno, ''), ' ', COALESCE(apellidoMaterno, '')) AS nombreUsuario"),
                'idUsuario',
                'grado'
            )
            ->get();
        return response()->json($usuario, 200);
    }

    public function RecalcularCompletado()
{
    try {
        DB::beginTransaction();

        // Traer todos los registros
        $registros = DB::table('registroacademico')->get();

        foreach ($registros as $registro) {
            $data = (array) $registro;

            // Revisar campos (excluyendo los que no deben contar)
            $incompleto = false;
            foreach ($data as $key => $val) {
                if (in_array($key, ['id', 'idEscuela', 'idAlumno', 'personasAutorizadas', 'completado', 'usuarioRegistro'])) {
                    continue;
                }
                if (is_null($val)) {
                    $incompleto = true;
                    break;
                }
                if (is_string($val) && trim($val) === '') {
                    $incompleto = true;
                    break;
                }
            }

            $nuevoCompletado = $incompleto ? 0 : 1;

            // Solo actualizar si cambia
            if ($registro->completado != $nuevoCompletado) {
              DB::table('registroacademico')
    ->where('idEscuela', $registro->idEscuela)
    ->where('idAlumno', $registro->idAlumno)
    ->update(['completado' => $nuevoCompletado]);

            }
        }

        DB::commit();

        return response()->json([
            'mensaje' => 'Proceso finalizado con éxito',
            'total' => count($registros)
        ], 200);

    } catch (\Exception $e) {
        DB::rollBack();
        return response()->json(['mensaje' => $e->getMessage()], 500);
    }
}

}
