<?php

namespace App\Http\Controllers\Api;

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

class ProfesoresController extends Controller
{
    public function mostrarProfesores()
    {
        $profesores = DB::table('usuarios')
            ->leftJoin('vista_usuarios_materias', 'usuarios.idUsuario', '=', 'vista_usuarios_materias.idProfesor')
            ->select(
                DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', 
       COALESCE(usuarios.apellidoPaterno, ''), ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombreProfesor"),
                'usuarios.idUsuario',
                'usuarios.estatus',
                'usuarios.tipoUsuario',
                'vista_usuarios_materias.idMateria',
                'vista_usuarios_materias.idGradoGrupoRelacionado',
                'vista_usuarios_materias.colorCurso',
                'vista_usuarios_materias.nombreMateria',
                'vista_usuarios_materias.gradoGrupo',
            )
            ->where('usuarios.idEscuela', 'COLEGIOABC')
            ->where('usuarios.tipoUsuario', 'PR')
            ->where('usuarios.estatus', 'Activo')
            ->get();

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

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

            $nombreGrupos = $group->map(function ($item) {
                return [
                    'idGradoGrupoRelacionado' => $item->idGradoGrupoRelacionado,
                    'nombreGrupo' => $item->gradoGrupo,
                    'idMateria' => $item->idMateria,
                    'nombreMateria' => $item->nombreMateria,
                    'colorMateria' => $item->colorCurso
                ];
            })->values()->filter(function ($item) {
                return $item['idGradoGrupoRelacionado'] !== null && $item['nombreGrupo'] !== null;
            })->all();

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

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

    }

    public function RelacionarProfesor(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $profesores = DB::table('materias_profesores')->updateOrInsert([
                'idEscuela' => 'COLEGIOABC',
                'idProfesor' => $request->id,
                'idMateria' => $request->idMateria,
                'idGrupo' => $request->idGrupo,
            ]);
            $message = 'Relación creada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function eliminarRelacion(Request $request)
    {
        $message = '';
        $status = 0;
        try {
            $profesores = DB::table('materias_profesores')
                ->where('idEscuela', 'COLEGIOABC')
                ->where('idProfesor', $request->id)
                ->where('idMateria', $request->idMateria)
                ->where('idGrupo', $request->idGrupo)
                ->delete();
            $message = 'Relación eliminada exitosamente';
            $status = 200;
        } catch (\Exception $e) {
            $message = $e->getMessage();
            $status = 500;
        }
        return response()->json(['mensaje' => $message], $status);
    }

    public function getMaterias()
    {
        $materia = DB::table('vista_materias_grados_grupos')
            ->select(
                DB::raw("CONCAT(COALESCE(nombreGrado, ''), COALESCE(nombreGrupo, '')) AS nombreGradoGrupo"),
                'idMateria',
                'nombreMateria',
                'colorCurso',
                'idGradoGrupoRelacionado'
            )
            ->where('idEscuela', 'COLEGIOABC')
            ->where('estado', 'Activo')
            ->get();

        $materia = $materia->groupBy('nombreMateria')->map(function ($group) {
            $fist = $group->first();

            $nombreMaterias = $group->map(function ($item) {
                return [
                    'idMateria' => $item->idMateria,
                    'gradoGrupo' => $item->nombreGradoGrupo,
                    'idGradoGrupo' => $item->idGradoGrupoRelacionado,
                ];
            })->values()->all();
            return [
                'nombreMateria' => $fist->nombreMateria,
                'colorMateria' => $fist->colorCurso,
                'gradoGrupo' => $nombreMaterias,
            ];
        })->values();

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

    function getGrupos($id)
    {
        // $id = base64_decode($id);
        $grupos = DB::table('materias_profesores')
            ->select('idGrupo')
            ->where('idProfesor', $id)
            ->groupBy('idGrupo')
            ->get();

        foreach ($grupos as $grupo) {
            $grupo->nombreGrupo = DB::table('grupos')
                ->select('nombreGrupo')
                ->where('idGrupo', $grupo->idGrupo)
                ->first()->nombreGrupo ?? $grupo->idGrupo;
        }


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

