<?php

namespace App\Http\Controllers\Api;

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


class UserController extends Controller
{

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

    public function mostrar()
    {
        $usuario = DB::table('usuarios')
            ->where('idEscuela', 'COLEGIOABC')
            ->orderByRaw("FIELD(estatus, 'Activo', 'Inactivo', 'Eliminado')")
            ->select(
                DB::raw("CONCAT(COALESCE(primerNombre, ''), ' ', COALESCE(segundoNombre, ''), ' ', COALESCE(apellidoPaterno, ''), ' ', COALESCE(apellidoMaterno, '')) AS nombreUsuario"),
                'usuarios.*'
            )
            ->get();

        foreach($usuario as $item) {
            if(isset($item->tipoUsuario)){
            $tipoUsuario = null;
            if($item->tipoUsuario == 'AL'){
                $tipoUsuario = 'Alumno';
            }else if($item->tipoUsuario == 'PF'){
                $tipoUsuario = 'Padre de Familia';
            }else if($item->tipoUsuario == 'PR'){
                $tipoUsuario = 'Profesor';
            }else if($item->tipoUsuario == 'AD'){
                $tipoUsuario = 'Administrador';
            }
            $item->NombreUsuario = $tipoUsuario;
            }
        }
        return response()->json($usuario, 200);
    }


    public function register(Request $request)
    {
        $registerUserData = $request->validate([
            'idUsuario' => 'required|string|max:50|unique:usuarios,idUsuario',
            'tipoUsuario' => 'required|in:AL,PR,PF,AD,SU',
            'primerNombre' => 'required|string|max:50',
            'segundoNombre' => 'nullable|string|max:50',
            'apellidoPaterno' => 'required|string|max:50',
            'apellidoMaterno' => 'nullable|string|max:50',
            'alias' => 'nullable|string|max:50',
            'contrasenaHash' => 'nullable|string',
            'correo' => 'nullable|email|max:100|unique:usuarios,correo',
            'grado' => 'nullable|string|max:50',
        ]);

        // Establecer una contraseña por defecto si no se proporciona
        $password = $registerUserData['contrasenaHash'] ?? '12345';
        $hashedPassword = Hash::make($password);

        $user = User::create([
            'idEscuela' => 'COLEGIOABC',
            'idUsuario' => $registerUserData['idUsuario'],
            'tipoUsuario' => $registerUserData['tipoUsuario'],
            'primerNombre' => $registerUserData['primerNombre'],
            'segundoNombre' => $registerUserData['segundoNombre'],
            'apellidoPaterno' => $registerUserData['apellidoPaterno'],
            'apellidoMaterno' => $registerUserData['apellidoMaterno'],
            'alias' => $registerUserData['alias'],
            'contrasenaHash' => $hashedPassword,
            'correo' => $registerUserData['correo'],
            'grado' => $registerUserData['grado'] ?? 'NA',
        ]);


        

        return response()->json([
            'status' => true,
            'mensaje' => 'Usuario creado',
        ], 201);
    }


    public function usuariosHabilitados()
    {
        $usuario = DB::table('usuarios')
            ->where('idEscuela', 'COLEGIOABC')
            ->where('estatus', 'Activo')
            ->get();
        return response()->json($usuario, 200);
    }

    public function actualizar(Request $request)
    {
        try {
            DB::table('usuarios')
                ->updateOrInsert(
                    ['idUsuario' => $request->id],
                    [
                        'idUsuario' => $request->idUsuario,
                        'estatus' => $request->estatus,
                        'tipoUsuario' => $request->tipoUsuario,
                        'validado' => $request->validado,
                        'primerNombre' => $request->primerNombre,
                        'segundoNombre' => $request->segundoNombre,
                        'apellidoPaterno' => $request->apellidoPaterno,
                        'apellidoMaterno' => $request->apellidoMaterno,
                        'alias' => $request->alias,
                        'correo' => $request->correo,
                        'grado' => $request->grado ?? 'NA',
                    ]
                );
            return response()->json(['mensaje' => 'Usuario actualizado exitosamente'], 201);
        } catch (\Exception $e) {

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


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

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

            $existInGruposUsuarios = DB::table('grupos_usuarios')
                ->where('idUsuario', $id)
                ->count();

            if ($existsInMateriasProfesores > 0 || $existInGruposUsuarios > 0) {
                return response()->json([
                    'mensaje' => 'No se puede eliminar el usuario porque está asociado a otros registros.',
                    'count1' => $existsInMateriasProfesores,
                    'count2' => $existInGruposUsuarios
                ], 400);
            }

            DB::table('usuarios')
                ->updateOrInsert(
                    ['idUsuario' => $id],
                    ['estatus' => 'Eliminado']
                );
            return response()->json(['mensaje' => 'Usuario eliminado exitosamente'], 201);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al eliminar el nivel: ' . $e->getMessage()], 500);
        }

    }

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

            $usuario = DB::table('usuarios')->where('idUsuario', $id)->first();

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

            if ($existsInGrados) {
                return response()->json(['mensaje' => 'No se puede habilitar el usuario'], 400);
            }
            DB::table('usuarios')
                ->updateOrInsert(
                    ['idUsuario' => $id],
                    ['estatus' => 'Activo']
                );

            return response()->json(['mensaje' => 'Usuario habilitado exitosamente'], 201);
        } catch (\Exception $e) {

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

    }


}
