<?php
require_once __DIR__ . '/../app.php';
!class_exists("Empresa") && require_once __DIR__ . '/../Models/empresaModel.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 'obtenerTodos':
            $respuesta = Empresa::obtenerTodos();
            break;
        case 'obtenerRubros':
            $idEmpresa = isset($_GET['id']) ? base64_decode($_GET['id']) : 0;
            $respuesta = Empresa::obtenerRubros($idEmpresa);
            break;
        case 'obtenerModulos':
            $idEmpresa = isset($_GET['id']) ? base64_decode($_GET['id']) : 0;
            $respuesta = Empresa::obtenerModulos($idEmpresa);
            break;
        case 'obtenerPorModulo':
            $modulo = isset($_GET['idModulo']) ? base64_decode($_GET['idModulo']) : 0;

            if ($modulo == 0 && isset($_GET['aid'])) {
                $idApartado = intval(base64_decode(urldecode($_GET['aid'])));
                !class_exists('Modulo') && require_once __DIR__ . '/../Models/moduloModel.php';

                $solicitud = Modulo::obtenerPorApartado($idApartado);

                if ($solicitud->status != 200 || empty($solicitud->data)) {
                    $respuesta->status = 404;
                    $respuesta->message = "No se encontró el módulo";
                    break;
                }

                $modulo = $solicitud->data->id;
                $contenedorModulo = $solicitud->data->contenedor;
            }
            $respuesta = Empresa::obtenerPorModulo($modulo);
            break;
        case 'obtenerPorUsuarioModulo':
            $usuario = isset($_GET['idUsuario']) ? intval(base64_decode(urldecode($_GET['idUsuario']))) : 0;
            $idModulo = isset($_GET['idModulo']) ? intval($_GET['idModulo']) : 0;
            $idSuperior = isset($_GET['idSuperior']) ? intval($_GET['idSuperior']) : 0;
            if ($usuario == 0) $usuario = $idUsuarioActual;
            $rubros = isset($_GET['rubros']) && !empty($_GET["rubros"]) ? explode('@@@', urldecode($_GET['rubros'])) : [];

            if ($idModulo == 0 && isset($_GET['aid'])) {
                $idApartado = isset($_GET['aid']) ? intval(base64_decode(urldecode($_GET['aid']))) : 0;
                !class_exists('Modulo') && require_once __DIR__ . '/../models/moduloModel.php';

                $solicitudModulo = Modulo::obtenerPorApartado($idApartado);

                if ($solicitudModulo->status != 200 || empty($solicitudModulo->data)) {
                    $respuesta->status = 404;
                    $respuesta->message = "No se encontró el módulo";
                    break;
                }

                $idModulo = $solicitudModulo->data->id;
            }

            $respuesta = Empresa::obtenerTodasPorUsuarioModulo($usuario, $idModulo, $idSuperior, $rubros);
            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) {
        case "guardar":
            if (!App::validarRoot()) {
                $respuesta->status = 401;
                $respuesta->message = "No tienes permiso para realizar esta acción";
                break;
            }

            $empresa = new Empresa();
            $empresa->id = $input['id'];
            $empresa->nombreEmpresa = trim($input['nombreEmpresa']);
            $empresa->principal = $input['principal'];
            $empresa->codempresa = $input['codempresa'];
            $empresa->urlApi = $input['urlApi'];
            $empresa->apiKey = $input['apiKey'];
            $empresa->rubros = $input['rubros'];
            $empresa->modulos = $input['modulos'];

            $db = obtenerConexion();

            try {
                $db->beginTransaction();

                $respuesta = $empresa->guardar($idUsuarioActual, $db);

                if ($respuesta->status != 200 || ($respuesta->status == 200 && $respuesta->message != "success")) {
                    $db->rollBack();
                    break;
                }

                $db->commit();
            } catch (PDOException $e) {
                $db->rollBack();
                $respuesta->status = 500;
                $respuesta->message = $e->getMessage();
                break;
            }
            break;
        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);
