<?php

namespace App\Http\Controllers\Api;

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


class MateriaController extends Controller
{

    public function findOne($id)
    {
        $id = base64_decode($id);
        $materia = DB::table('materias')->where('idMateria', $id)->first();
        return response()->json($materia, 200);
    }

    public function mostrar()
    {
        $materia = DB::table('vista_materias_grados_grupos')
            ->where('idEscuela', 'COLEGIOABC')
            ->orderBy('estado', 'asc')
            ->get();
        return response()->json($materia, 200);
    }

    public function materiasHabilitadas()
    {
        $materia = DB::table('vista_materias_grados_grupos')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('estado', 'Activo')
            ->get();
        return response()->json($materia, 200);
    }

    public function crear(Request $request)
    {
        try {
            $existsInMaterias = DB::table('materias')
                ->where('nombreMateria', $request->nombreMateria)
                ->where('estado', 'Activo')
                ->exists();

            if ($existsInMaterias) {
                $existsInMaterias = DB::table('materias')
                    ->where('nombreMateria', $request->nombreMateria)
                    ->where('idGradoGrupoRelacionado', $request->idGradoGrupoRelacionado)
                    ->where('estado', 'Activo')
                    ->exists();
                return response()->json(
                    ['mensaje' => 'Esta materia ya ha sido registrada en el grado o grupo seleccionado.'],
                    500
                );
            }


            DB::table('materias')->insert([
                'idEscuela' => 'COLEGIOABC',
                'idMateria' => $request->idMateria,
                'estado' => 'Activo',
                'categoria' => $request->categoria,
                'nombreMateria' => $request->nombreMateria,
                'colorCurso' => $request->colorCurso,
                'idGradoGrupoRelacionado' => $request->idGradoGrupoRelacionado,
                'imagenCurso' => $request->null,
                'afectaBoleta' => $request->afectaBoleta,
                'materiaAcademica' => $request->materiaAcademica,
                'mostrarMateria' => $request->mostrarMateria,
                'idUsuario' => '',
            ]);




            return response()->json(['mensaje' => 'Materia creada exitosamente', 'existe' => $existsInMaterias], 201);
        } catch (\Exception $e) {
            if ($e instanceof \PDOException && $e->errorInfo[1] == 1062) {
                return response()->json(['mensaje' => 'Esta materia ya ha sido registrada', "error" => $e->getMessage()], 500);
            }
            return response()->json(['mensaje' => 'Error al crear la materia: ' . $e->getMessage()], 500);
        }
    }

    public function actualizar(Request $request)
    {
        try {
            DB::table('materias')
                ->updateOrInsert(
                    ['idMateria' => $request->id],
                    [
                        'idMateria' => $request->id,
                        'categoria' => $request->categoria,
                        'nombreMateria' => $request->nombreMateria,
                        'colorCurso' => $request->colorCurso,
                        'idGradoGrupoRelacionado' => $request->idGradoGrupoRelacionado,
                        'imagenCurso' => $request->null,
                        'afectaBoleta' => $request->afectaBoleta,
                        'materiaAcademica' => $request->materiaAcademica,
                        'mostrarMateria' => $request->mostrarMateria,
                    ]
                );
            return response()->json(['mensaje' => 'Materia actualizada exitosamente'], 201);
        } catch (\Exception $e) {

            return response()->json(['mensaje' => 'Error al actualizar la materia: ' . $e->getMessage()], 500);
        }
    }


    public function eliminar($id)
    {
        $id = base64_decode($id);
        try {

            $existsInMateriasProfesores = DB::table('materias_profesores')
                ->where('idMateria', $id)
                ->count();

            if ($existsInMateriasProfesores > 0) {
                return response()->json(['mensaje' => 'No se puede eliminar la materia porque está asociada a otros registros.'], 400);
            }

            DB::table('materias')
                ->updateOrInsert(
                    ['idMateria' => $id],
                    ['estado' => 'Eliminado']
                );
            return response()->json(['mensaje' => 'Materia eliminada exitosamente'], 201);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al eliminar la materia: ' . $e->getMessage()], 500);
        }

    }

    public function habilitar($id)
    {
        $id = base64_decode($id);
        try {

            $materia = DB::table('materias')->where('idMateria', $id)->first();

            $existsInGrados = DB::table('grados')
                ->where('nombreGrado', $materia->idGradoGrupoRelacionado)
                ->where('estado', 'Eliminado')
                ->exists();

            $existsInCategoriasMaterias = DB::table('materias_categorias')
                ->where('categoria', $materia->categoria)
                ->where('estado', 'Eliminado')
                ->exists();

            if (!$existsInGrados) {
                $existsInGrupos = DB::table('grupos')
                    ->where('idGrupo', $materia->idGradoGrupoRelacionado)
                    ->where('estado', 'Eliminado')
                    ->exists();

                if ($existsInGrupos || $existsInCategoriasMaterias) {
                    return response()->json(['mensaje' => 'No se puede habilitar la materia'], 400);
                }
            }

            //code...
            DB::table('materias')
                ->updateOrInsert(
                    ['idMateria' => $id],
                    ['estado' => 'Activo']
                );

            return response()->json(['mensaje' => 'Materia eliminada exitosamente'], 201);
        } catch (\Exception $e) {
            //throw $th;
            return response()->json(['mensaje' => 'Error al habilitar la materia: ' . $e->getMessage()], 500);
        }

    }

    public function getProfes($id)
    {
        $profes = DB::table('materias_profesores')
            ->select(
                DB::raw("CONCAT(COALESCE(usuarios.primerNombre, ''), ' ', COALESCE(usuarios.segundoNombre, ''), ' ', COALESCE(usuarios.apellidoPaterno, ''), ' ', COALESCE(usuarios.apellidoMaterno, '')) AS nombreCompleto"),
                'idProfesor',
            )
            ->where('materias_profesores.idMateria', $id)
            ->leftJoin('usuarios', 'usuarios.idUsuario', '=', 'materias_profesores.idProfesor')
            ->get();

        $materia = DB::table('materias')
            ->select('nombreMateria', 'colorCurso')
            ->where('idMateria', $id)->first();

        $anuncios = DB::table('cursos_anuncios')
            ->where('idMateria', $id)
            ->where('estado', 'Activo')
            ->get();

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

    public function crearAnuncio(Request $request)
    {
        try {
            //code...
            DB::table('cursos_anuncios')->insert([
                'idEscuela' => 'COLEGIOABC',
                'idMateria' => $request->idMateria,
                'estado' => 'Activo',
                'fechaCreacion' => $request->fechaCreacion,
                'tituloAnuncio' => $request->titulo,
                'descripcion' => $request->contenido,
                'fechaPublicacion' => $request->fechaPublicacion,
                'fechaCaducidad' => $request->fechaCaducidad,
                'idUsuario' => $request->idUsuario,
            ]);




            return response()->json(['mensaje' => 'Anuncio creado exitosamente', 201]);
        } catch (\Exception $e) {
            //throw $th;
            return response()->json(['mensaje' => 'Error al crear el anuncio: ' . $e->getMessage()], 500);

        }
    }

    public function editarAnuncio(Request $request)
    {
        try {
            DB::table('cursos_anuncios')
                ->updateOrInsert(
                    ['idAnuncio' => $request->id],
                    [
                        'tituloAnuncio' => $request->titulo,
                        'descripcion' => $request->contenido,
                        'fechaPublicacion' => $request->fechaPublicacion,
                        'fechaCaducidad' => $request->fechaCaducidad,
                    ]
                );
            return response()->json(['mensaje' => 'Anuncio actualizado exitosamente'], 201);
        } catch (\Exception $e) {

            return response()->json(['mensaje' => 'Error al actualizar el anuncio: ' . $e->getMessage()], 500);
        }
    }

    public function eliminarAnuncio($id){
        try {
            
            DB::table('cursos_anuncios')
            ->updateOrInsert(
                ['idAnuncio' => $id],
                ['estado' => 'Eliminado']
            );
        return response()->json(['mensaje' => 'Anuncio eliminado exitosamente'], 201);
    } catch (\Exception $e) {
        return response()->json(['mensaje' => 'Error al eliminar el anuncio: ' . $e->getMessage()], 500);
    }
    }



}
