<?php
require_once __DIR__ . '/../app.php';
!class_exists("Modulo") && require_once __DIR__ . '/../Models/moduloModel.php';
!class_exists("Apartado") && require_once __DIR__ . '/../Models/apartadoModel.php';

header("Content-Type: application/json; charset=utf-8");

$respuesta = (object)[];

App::verificarSesion();

$idUsuarioActual = App::obtenerIdUsuario();

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    $accion = isset($_GET['accion']) ? $_GET['accion'] : null;

    switch ($accion) {
        case 'obtenerMenu':
            $db = obtenerConexion();

            $query = "EXEC sistema.sp_obtenerMenu :usuario;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':usuario', $idUsuarioActual, PDO::PARAM_INT);

            try {
                $stmt->execute();

                $datos = $stmt->fetchAll(PDO::FETCH_OBJ);

                $modulosPermitidos = array_filter($datos, function ($item) {
                    return $item->tipoContenedor == 'modulo';
                });

                $apartadosPermitidos = array_filter($datos, function ($item) {
                    return $item->tipoContenedor == 'apartado';
                });

                $modulosPermitidos = array_map(function ($item) {
                    return $item->contenedor;
                }, $modulosPermitidos);

                $apartadosPermitidos = array_map(function ($item) {
                    return $item->contenedor;
                }, $apartadosPermitidos);

                $solicitudModulos = Modulo::obtenerTodos();
                $modulos = $solicitudModulos->status == 200 ? $solicitudModulos->data : [];

                $modulos = array_filter($modulos, function ($item) {
                    return $item->mantenimiento == 0;
                });

                foreach ($modulos as $keyModulo => $modulo) {
                    $modulo->incluir = in_array($modulo->id, $modulosPermitidos);

                    $solicitudApartados = Apartado::obtenerPorModulo($modulo->id);
                    $apartadosOriginales = $solicitudApartados->status == 200 ? $solicitudApartados->data : [];
                    $apartados = $solicitudApartados->status == 200 ? $solicitudApartados->data : [];

                    $apartados = array_filter($apartados, function ($item) {
                        return $item->mantenimiento == 0;
                    });

                    foreach ($apartados as $keyApartadoN1 => $apartadoN1) {
                        $apartadoN1->incluir = in_array($apartadoN1->id, $apartadosPermitidos) ? true : $modulo->incluir;

                        $subApartadosN1 = $apartadoN1->subApartados;

                        $subApartadosN1 = array_filter($subApartadosN1, function ($item) {
                            return $item->mantenimiento == 0;
                        });

                        foreach ($subApartadosN1 as $keyApartadoN2 => $apartadoN2) {
                            $apartadoN2->incluir = in_array($apartadoN2->id, $apartadosPermitidos) ? true : $apartadoN1->incluir;

                            $subApartadosN2 = $apartadoN2->subApartados;

                            $subApartadosN2 = array_filter($subApartadosN2, function ($item) {
                                return $item->mantenimiento == 0;
                            });

                            foreach ($subApartadosN2 as $keyApartadoN3 => $apartadoN3) {
                                $apartadoN3->incluir = in_array($apartadoN3->id, $apartadosPermitidos) ? true : $apartadoN2->incluir;

                                $subApartadosN3 = $apartadoN3->subApartados;

                                $subApartadosN3 = array_filter($subApartadosN3, function ($item) {
                                    return $item->mantenimiento == 0;
                                });

                                foreach ($subApartadosN3 as $keyApartadoN4 => $apartadoN4) {
                                    $apartadoN4->incluir = in_array($apartadoN4->id, $apartadosPermitidos) ? true : $apartadoN3->incluir;

                                    if (!$apartadoN4->incluir) {
                                        unset($subApartadosN3[$keyApartadoN4]);
                                        continue;
                                    }
                                }

                                $apartadoN3->subApartados = $subApartadosN3;

                                if (!$apartadoN3->incluir && count($subApartadosN3) > 0) $apartadoN3->incluir = true;

                                if (!$apartadoN3->incluir || (count($apartadoN3->subApartados) > 0 && count($subApartadosN3) == 0)) {
                                    unset($subApartadosN2[$keyApartadoN3]);
                                    continue;
                                }
                            }

                            $apartadoN2->subApartados = $subApartadosN2;

                            if (!$apartadoN2->incluir && count($subApartadosN2) > 0) $apartadoN2->incluir = true;

                            if (!$apartadoN2->incluir || (count($apartadoN2->subApartados) > 0 && count($subApartadosN2) == 0)) {
                                unset($subApartadosN1[$keyApartadoN2]);
                                continue;
                            }
                        }

                        $apartadoN1->subApartados = $subApartadosN1;

                        if (!$apartadoN1->incluir && count($subApartadosN1) > 0) $apartadoN1->incluir = true;

                        if (!$apartadoN1->incluir || (count($apartadoN1->subApartados) > 0 && count($subApartadosN1) == 0)) {
                            unset($apartados[$keyApartadoN1]);
                            continue;
                        }
                    }

                    $modulo->apartados = $apartados;

                    if (!$modulo->incluir && count($apartados) > 0) $modulo->incluir = true;

                    if (!$modulo->incluir || (count($apartadosOriginales) > 0 && count($apartados) == 0)) {
                        unset($modulos[$keyModulo]);
                        continue;
                    }
                }

                $respuesta->status = 200;
                $respuesta->data = array_values($modulos);
                // $respuesta->data = $datos;
            } catch (PDOException $e) {
                $respuesta->status = 500;
                $respuesta->message = $e->getMessage();
            }
            break;
        default:
            $respuesta->status = 400;
            $respuesta->message = "Acción no válida";
            break;
    }
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    !empty($_POST) && $input = $_POST;
    $accion = isset($input['accion']) ? $input['accion'] : null;

    switch ($accion) {
        default:
            $respuesta->status = 400;
            $respuesta->message = 'Acción no válida';
            break;
    }
}

$httpCode = isset($respuesta->status) ? $respuesta->status : 500;
http_response_code($httpCode);
echo json_encode($respuesta);
