<?php
require_once __DIR__ . '/../../../code/app.php';
!class_exists("OtroIngreso") && require_once __DIR__ . '/../Models/otroIngresoModel.php';

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

$respuesta = (object)[];

$permisos = App::verificarAcceso();

$idUsuarioActual = App::obtenerIdUsuario();

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

    switch ($accion) {
        case 'obtenerProcesosPorTipoPlanillaAnio':
            $codtipoplanilla = isset($_GET['codtipoplanilla']) ? intval($_GET['codtipoplanilla']) : 0;
            $anio = isset($_GET['anio']) ? intval($_GET['anio']) : date("Y");

            $respuesta = OtroIngreso::obtenerProcesosPorTipoPlanillaAnio($codtipoplanilla, $anio);
            break;
        case 'obtenerPorProcesoMasivo':
            $id = isset($_GET['id']) ? intval($_GET['id']) : 0;

            $respuesta = OtroIngreso::obtenerPorProcesoMasivo($id);
            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 'verificarArchivo':

            $url = $_FILES['archivo']['tmp_name'];

            $modeloDatos = [
                'codempleado' => (object)['tipo' => 'string', 'longitud' => 15, 'nulo' => false, 'obligatorio' => true, 'nombre' => 'codempleado'],
                'tipoPlanilla' => (object)['tipo' => 'int', 'longitud' => null, 'nulo' => false, 'obligatorio' => true, 'nombre' => 'tipoPlanilla'],
                'concepto' => (object)['tipo' => 'string', 'longitud' => 300, 'nulo' => false, 'obligatorio' => true, 'nombre' => 'concepto'],
                'tipoIngreso' => (object)['tipo' => 'int', 'longitud' => null, 'nulo' => false, 'obligatorio' => true, 'nombre' => 'tipoIngreso'],
                'monto' => (object)['tipo' => 'float', 'longitud' => null, 'nulo' => false, 'obligatorio' => true, 'nombre' => 'monto'],
            ];

            $verificacion = validarDatosExcel($url, $modeloDatos);

            $datos = [];

            if ($verificacion->status == 200) {
                $datos = $verificacion->data;

                if (count($datos) > 0) {
                    $codempleados = array_column($datos, 'codempleado');
                    $codempleados = array_unique($codempleados);

                    !class_exists('Empleado') && require_once __DIR__ . '/../Models/empleadoModel.php';

                    $solicitudEmpleados = Empleado::obtenerMultiples($codempleados);

                    $empleados = $solicitudEmpleados->status == 200 ? $solicitudEmpleados->data : [];

                    foreach ($datos as $key => $row) {
                        $codempleado = $row->codempleado;
                        $empleado = array_filter($empleados, function ($empleado) use ($codempleado) {
                            return $empleado->codempleado == $codempleado;
                        });

                        $datos[$key]->nombreEmpleado = count($empleado) > 0 ? array_values($empleado)[0]->nombreCompleto : null;
                        $datos[$key]->salario = count($empleado) > 0 ? array_values($empleado)[0]->salario : 0;
                    }
                }
            }

            $respuesta->status = $verificacion->status;
            $respuesta->message = $verificacion->message;
            $respuesta->data = $datos;
            break;
        case 'guardarMasivo':
            $db = obtenerConexion();

            try {
                $id = isset($input['id']) && $input["id"] > 0 ? $input['id'] : 0;
                $otrosIngresos = isset($input['otrosIngresos']) ? $input['otrosIngresos'] : [];

                $codtipoplanilla = 0;

                $db->beginTransaction();
                if (count($otrosIngresos) == 0) {
                    throw new Exception("vacio");
                }

                $codtipoplanilla = isset($otrosIngresos[0]['tipoPlanilla']) ? $otrosIngresos[0]['tipoPlanilla'] : 0;

                $respuestaSP = null;
                $idProceso = null;

                $ip = obtenerIPActual();

                $fechaProyeccion = date("Y-m-d", strtotime('15-' . $input['mesPago']));

                if ($input['quincenaPago'] == 2) {
                    $fechaProyeccion = date("Y-m-d", strtotime('-1 day', strtotime('+1 month', strtotime('01-' . $input['mesPago']))));
                }

                $query = "EXEC rrhh.sp_guardarProcesoOtrosIngresos :id,:codtipoplanilla,:mesPago,:quincenaPago,:fechaProyeccion,:ip,:usuario,:respuesta,:idProceso;";
                $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
                $stmt->bindParam(':id', $id, PDO::PARAM_INT);
                $stmt->bindParam(':codtipoplanilla', $codtipoplanilla, PDO::PARAM_INT);
                $stmt->bindParam(':mesPago', $input['mesPago'], PDO::PARAM_STR);
                $stmt->bindParam(':quincenaPago', $input['quincenaPago'], PDO::PARAM_INT);
                $stmt->bindParam(':fechaProyeccion', $fechaProyeccion, PDO::PARAM_STR);
                $stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
                $stmt->bindParam(':usuario', $idUsuarioActual, PDO::PARAM_INT);
                $stmt->bindParam(':respuesta', $respuestaSP, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
                $stmt->bindParam(':idProceso', $idProceso, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

                $stmt->execute();

                if ($respuestaSP != 'success') {
                    throw new Exception(!empty($respuestaSP) ? $respuestaSP : "Error al guardar el proceso");
                }

                $encabezadoSql = "INSERT INTO [" . DB_NET . "].dbo.pla_otros_ingresos(codempresa,codsucursaltransa,codtipoplanilla,codempleado,codtipoingreso,descripcioningreso,valoringreso,codautoriza,fechaautoriza,idProcesoCarga,fechaProyeccion) VALUES";

                $fechaAutorizacion = date("Y-m-d H:i:s");

                $arrOtrosIngresos = [];
                $username = App::obtenerUsername();

                foreach ($otrosIngresos as $key => $OI) {
                    $agregadoSql = "(" . CODEMPRESA . ",1," . $OI["tipoPlanilla"] . ",'" . $OI["codempleado"] . "'," . $OI["tipoIngreso"] . ",'" . $OI["concepto"] . "'," . $OI["monto"] . ",'" . $username . "',getdate()," . $idProceso . ",'" . $fechaProyeccion . "')";

                    if ((strlen(implode(",", $arrOtrosIngresos)) + strlen($encabezadoSql) + strlen($agregadoSql)) > 8000) {
                        $query = $encabezadoSql . implode(",", $arrOtrosIngresos);
                        $stmt = $db->prepare($query);
                        $stmt->execute();
                        $arrOtrosIngresos = [];
                    }

                    $arrOtrosIngresos[] = $agregadoSql;
                }

                if (count($arrOtrosIngresos) > 0) {
                    $query = $encabezadoSql . implode(",", $arrOtrosIngresos);
                    $stmt = $db->prepare($query);
                    $stmt->execute();
                }

                $db->commit();

                $respuesta->status = 200;
                $respuesta->message = 'success';
                $respuesta->data = (object)[
                    'id' => $id,
                ];
            } catch (PDOException $e) {
                $db->rollBack();
                $respuesta->status = 500;
                $respuesta->message = $e->getMessage();
            } catch (Exception $e) {
                $db->rollBack();
                $respuesta->status = 500;
                $respuesta->message = $e->getMessage();
            }
            break;
        case 'eliminarProcesoCarga':
            $db = obtenerConexion();

            $respuestaSP = null;
            $ip = obtenerIPActual();

            $query = "EXEC rrhh.sp_eliminarMasivoOtrosIngresos :id,:usuario,:ip,:respuesta;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':id', $input['id'], PDO::PARAM_INT);
            $stmt->bindParam(':usuario', $idUsuarioActual, PDO::PARAM_INT);
            $stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
            $stmt->bindParam(':respuesta', $respuestaSP, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

            if ($respuestaSP != 'success') {
                $respuesta->status = 500;
                $respuesta->message = !empty($respuestaSP) ? $respuestaSP : "Error al eliminar el proceso";
                break;
            }

            $respuesta->status = 200;
            $respuesta->message = 'success';
            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);
