<?php

namespace App\Http\Controllers\Api;

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

class AlumnosController extends Controller
{
    public function getAlumnos()
    {
        $alumnos = DB::table('usuarios')
            ->leftJoin('vista_usuarios_grupos1', 'usuarios.idUsuario', '=', 'vista_usuarios_grupos1.idUsuario')
            ->leftJoin('alumno_relacionado', 'usuarios.idUsuario', '=', 'alumno_relacionado.idUsuario')
            ->select(
                DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', COALESCE(usuarios.apellidoPaterno, ''),
             ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombreAlumno"),
                'usuarios.grado',
                'usuarios.idUsuario',
                'usuarios.estatus',
                'usuarios.tipoUsuario',
                'vista_usuarios_grupos1.idGrupo',
                'vista_usuarios_grupos1.nombreGrupo',
                'alumno_relacionado.idPadre',
                'alumno_relacionado.nombrePadre'
            )
            ->where('usuarios.idEscuela', 'COLEGIOABC')
            ->where('usuarios.tipoUsuario', 'AL')
            ->where('usuarios.estatus', 'Activo')
            ->get();

        $alumnos = $alumnos->groupBy('idUsuario')->map(function ($group) {
            $first = $group->first();

            $nombrePadres = $group->map(function ($item) {
                return [
                    'idPadre' => $item->idpadre,
                    'nombrePadre' => $item->nombrePadre,
                ];
            })->unique()->values()->filter(function ($item) {
                return $item['idPadre'] !== null && $item['nombrePadre'] !== null;
            })->all();

            $nombreGrupos = $group->map(function ($item) {
                return [
                    'idGrupo' => $item->idGrupo,
                    'nombreGrupo' => $item->nombreGrupo
                ];
            })->unique()->values()->filter(function ($item) {
                return $item['idGrupo'] !== null && $item['nombreGrupo'] !== null;
            })->all();

            return [
                'nombreAlumno' => $first->nombreAlumno,
                'grado' => $first->grado,
                'idUsuario' => $first->idUsuario,
                'tipoUsuario' => $first->tipoUsuario,
                'nombreGrupos' => empty($nombreGrupos) ? [] : array_values($nombreGrupos),
                'nombrePadres' => empty($nombrePadres) ? [] : array_values($nombrePadres)
            ];
        })->values();

        return response()->json([
            'alumnos' => $alumnos
        ], 200);

    }

    public function RelacionAlumnosGrupo(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $relacion = DB::table('grupos_usuarios')->updateOrInsert([
                'idEscuela' => 'COLEGIOABC',
                'idUsuario' => $request->id,
                'idGrupo' => $request->idGrupo,
                'estado' => 'Activo'
            ]);
            $message = 'Relación creada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al crear la relación: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function RelacionAlumnosPadre(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $relacion = DB::table('usuarios_padres')->updateOrInsert([
                'idEscuela' => 'COLEGIOABC',
                'idUsuario' => $request->id,
                'idPadre' => $request->idPadre,
                'estado' => 'Activo'
            ]);
            $message = 'Relación creada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al crear la relación: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function getPadres()
    {
        $padres = DB::table('usuarios')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('tipoUsuario', 'PF')
            ->select(DB::raw("CONCAT(COALESCE(primerNombre, ''), ' ', COALESCE(segundoNombre, ''), ' ', COALESCE(apellidoPaterno, ''), ' ', COALESCE(apellidoMaterno, '')) AS nombrePadre"),
            'idUsuario')
            ->get();

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

    public function eliminarGrupo(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $relacion = DB::table('grupos_usuarios')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idUsuario', $request->id)
                ->where('idGrupo', $request->idGrupo)
                ->delete();
            $message = 'Relación eliminada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al eliminar la relación: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function eliminarPadre(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $relacion = DB::table('usuarios_padres')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idUsuario', $request->id)
                ->where('idPadre', $request->idPadre)
                ->delete();
            $message = 'Relación eliminada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = 'Error al eliminar la relación: ' . $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function alumnosRegistro(){
        $data = DB::table('usuarios')
            ->leftJoin('registroacademico', 'usuarios.idUsuario', '=', 'registroacademico.idAlumno')
            ->leftJoin('usuarios as u2', 'u2.idUsuario', '=', 'registroacademico.usuarioRegistro')
            ->select(
                DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', COALESCE(usuarios.apellidoPaterno, ''), ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombreCompleto"),
                DB::raw("CONCAT(COALESCE(u2.primerNombre, ''), ' ', COALESCE(u2.segundoNombre, ''), ' ', COALESCE(u2.apellidoPaterno, ''), ' ', COALESCE(u2.apellidoMaterno, '')) AS nombrePadre"),
                'usuarios.idUsuario',
                'registroacademico.*'
            )
            ->where('usuarios.tipoUsuario', 'AL')
            ->get()

            // return response()->json([
            //     'data' => $data
            // ], 200);
            ->map(function($item) {
                $hasEmptyField = collect($item)->some(function($value) {
                    return $value === null || $value === '';
                });

                $nombrePadre = DB::table('usuarios')
                ->select(
                    DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', COALESCE(usuarios.apellidoPaterno, ''), ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombrePadre")
                )
                ->where('usuarios.idUsuario', $item->usuarioRegistro)
                ->first();


                return [
                    'idUsuario' => $item->idUsuario,
                    'quienRegistra' => $item->nombrePadre,
                    'ultActualizacion' => $item->lastUpdate,
                    'nombreCompleto' => $item->nombreCompleto,
                    'registroAcCompleto' => !$hasEmptyField
                ];
            });

            $dataAd = DB::table('usuarios')
            ->select(
                'usuarios.idUsuario',
                'registroadministrativo.*'
            )
            ->leftJoin('registroadministrativo', 'usuarios.idUsuario', '=', 'registroadministrativo.idAlumno')
            ->where('usuarios.tipoUsuario', 'AL')
            ->get()
            ->map(function($item) {
                $hasEmptyField = collect($item)->some(function($value) {
                    return $value === null || $value === '';
                });
                return [
                    'idUsuario' => $item->idUsuario,
                    'registroAcCompleto' => !$hasEmptyField
                ];
            });

            $completo = $dataAd->map(function($item) use ($data) {
                $registroAcCompleto = $data->firstWhere('idUsuario', $item['idUsuario']);
                return [
                    'idUsuario' => $item['idUsuario'],
                    'quienRegistra' => $registroAcCompleto['quienRegistra'],
                    'ultActualizacion' => $registroAcCompleto['ultActualizacion'],
                    'nombreCompleto' => $registroAcCompleto['nombreCompleto'],
                    'registroAcCompleto' => $registroAcCompleto['registroAcCompleto'],
                    'registroAdCompleto' => $item['registroAcCompleto']
                ];
            });

            $completo = $completo->toArray();

            foreach ($completo as &$item) {
                if (trim($item['quienRegistra']) === '') {
                    $item['quienRegistra'] = 'No Aplica';
                }

                if ($item['ultActualizacion'] === null) {
                    $item['ultActualizacion'] = 'No Aplica';
                }

                $item['registroAcCompleto'] = $item['registroAcCompleto'] ? 'Sí' : 'No';
                $item['registroAdCompleto'] = $item['registroAdCompleto'] ? 'Sí' : 'No';
            }


        return response()->json([
            'data' => $completo
        ], 200);
    }



}
