<?php
class Proyecto
{
    public $codempresa;
    public $codsucursal;
    public $codproyecto;
    public $nombreProyecto;

    function __construct()
    {
    }

    public static function obtenerPorUsuarioModulo($usuario, $configuracion, $db): object
    {
        $query = "SELECT config.id,
            config.codproyecto,
            config.nombreProyecto
        FROM sistema.config_proyectosUsuario config 
        WHERE config.estado = 1 AND config.idUsuario = :usuario AND config.idConfig = :configuracion;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':configuracion', $configuracion, PDO::PARAM_INT);

        try {
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_OBJ);

            return (object)[
                'status' => 200,
                'data' => $data
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerTodosPorEmpresaSucursal($codempresa, $codsucursal): object
    {
        if ($codempresa == CODEMPRESA) {
            $db = obtenerConexion();

            $query = "SELECT proyectos.codempresa,
                proyectos.codsucursal,
                proyectos.codproyecto,
                proyectos.nomproyecto nombreProyecto
            FROM [" . DB_NET . "].dbo.gen_proyecto proyectos
            WHERE codempresa = :codempresa AND codsucursal = :codsucursal";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':codempresa', $codempresa, PDO::PARAM_INT);
            $stmt->bindParam(':codsucursal', $codsucursal, PDO::PARAM_INT);

            try {
                $stmt->execute();
                $data = $stmt->fetchAll(PDO::FETCH_OBJ);

                return (object)[
                    'status' => 200,
                    'data' => $data
                ];
            } catch (PDOException $e) {
                return (object)[
                    'status' => 500,
                    'message' => $e->getMessage()
                ];
            }
        } else {
            !class_exists('Empresa') && require_once __DIR__ . '/empresaModel.php';
            $requestEmpresa = Empresa::obtenerPorCodempresa($codempresa);

            if ($requestEmpresa->status != 200 || empty($requestEmpresa->data)) {
                return (object)[
                    'status' => 500,
                    'message' => 'No se encontró el vínculo con la empresa'
                ];
            }

            $datosEmpresa = $requestEmpresa->data;

            if (!isset($datosEmpresa->urlApi) || (empty($datosEmpresa->urlApi) || empty($datosEmpresa->apiKey))) {
                return (object)[
                    'status' => 500,
                    'message' => 'No es posible comunicarse con la empresa ' . $datosEmpresa->nombreEmpresa
                ];
            }

            $urlApi = $datosEmpresa->urlApi;
            $apiKey = $datosEmpresa->apiKey;

            if (substr($urlApi, -1) == '/') {
                $urlApi = substr($urlApi, 0, -1);
            }

            $url = $urlApi . '/GENERAL/proyectos-por-sucursal/' . $codsucursal . '/?key=' . urlencode($apiKey);

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            $output = curl_exec($ch);

            if ($output === false) {
                return (object)[
                    'status' => 500,
                    'message' => 'No es posible comunicarse con la empresa ' . $datosEmpresa->nombreEmpresa,
                    'details' => 'Error: ' . curl_error($ch)
                ];
            }

            $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

            if ($httpcode != 200) {
                return (object)[
                    'status' => 500,
                    'message' => 'No es posible comunicarse con la empresa ' . $datosEmpresa->nombreEmpresa . ', Error: ' . $output
                ];
            }

            curl_close($ch);

            $response = json_decode($output);

            $data = isset($response->data) ? $response->data : [];

            $mensaje = isset($response->message) ? $response->message : 'success';

            return (object)['status' => $httpcode, 'data' => $data, 'message' => $mensaje];
        }
    }

    public static function guardarAsignacionUsuarioSucursalEmpresaModulo($idConfiguracion, $idAsignacion, $codproyecto, $nombreProyecto, $usuario, $db): object
    {
        $respuesta = null;
        $idGuardado = null;

        $query = "EXEC sistema.sp_guardarProyectoUsuarioModulo :idConfiguracion,:idAsignacion,:codproyecto,:nombreProyecto,:usuario,:respuesta,:idGuardado;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':idConfiguracion', $idConfiguracion, PDO::PARAM_INT);
        $stmt->bindParam(':idAsignacion', $idAsignacion, PDO::PARAM_INT);
        $stmt->bindParam(':codproyecto', $codproyecto, PDO::PARAM_INT);
        $stmt->bindParam(':nombreProyecto', $nombreProyecto, PDO::PARAM_STR);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
        $stmt->bindParam(':idGuardado', $idGuardado, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

        try {
            $stmt->execute();

            return (object)[
                'id' => $idGuardado,
                'respuesta' => $respuesta,
                'status' => 200,
            ];
        } catch (PDOException $e) {
            return (object)[
                'message' => $e->getMessage(),
                'status' => 500,
            ];
        }
    }

    public static function limpiarAsignacionesPorUsuarioSucursalEmpresaModulo($idConfiguracion, $usuario, $asignacionesValidas = [], $db): object
    {
        $strAsignaciones = count($asignacionesValidas) > 0 ? implode(',', $asignacionesValidas) : '0';
        $query = "EXEC sistema.sp_limpiarProyectoUsuarioModulo :usuario,:idConfiguracion,:asignacionesValidas;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':idConfiguracion', $idConfiguracion, PDO::PARAM_INT);
        $stmt->bindParam(':asignacionesValidas', $strAsignaciones, PDO::PARAM_STR);

        try {
            $stmt->execute();

            return (object)[
                'status' => 200,
                'message' => 'success'
            ];
        } catch (PDOException $e) {
            return (object)[
                'message' => $e->getMessage(),
                'status' => 500,
            ];
        }
    }

    public static function obtenerTodosPorUsuarioModulo($usuario, $idConfiguracion, $codempresa, $codsucursal): object
    {
        $solicitud = self::obtenerTodosPorEmpresaSucursal($codempresa, $codsucursal);

        if ($solicitud->status != 200) {
            return $solicitud;
        }

        $db = obtenerConexion();

        $solicitudAsignaciones = self::obtenerPorUsuarioModulo($usuario, $idConfiguracion, $db);

        if ($solicitudAsignaciones->status != 200) {
            return $solicitudAsignaciones;
        }

        $proyectosAsignados = $solicitudAsignaciones->data;

        $codproyectos = array_values(array_map(function ($proyecto) {
            return $proyecto->codproyecto;
        }, $proyectosAsignados));

        if (in_array("0", $codproyectos)) {
            $codproyectos = array_column($solicitud->data, 'codproyecto');
        }

        $proyectos = array_values(array_filter($solicitud->data, function ($proyecto) use ($codproyectos) {
            return in_array($proyecto->codproyecto, $codproyectos);
        }));

        $proyectos = array_values(array_map(function ($proyecto) use ($proyectosAsignados) {
            $idConfiguracion = $proyectosAsignados[array_search($proyecto->codproyecto, array_column($proyectosAsignados, 'codproyecto'))]->id;

            $proyecto->idConfig = $idConfiguracion;

            return $proyecto;
        }, $proyectos));

        return (object)[
            'status' => 200,
            'data' => $proyectos
        ];
    }
}
