<?php
class Sucursal
{
    public $codempresa;
    public $codsucursal;
    public $nombreSucursal;

    function __construct()
    {
    }

    public static function obtenerTodosPorEmpresa(int $codempresa): object
    {
        if ($codempresa == CODEMPRESA) {
            $db = obtenerConexion();
            $query = "SELECT sucursales.codempresa,
                sucursales.codsucursal,
                sucursales.nomsucursal nombreSucursal 
            FROM [" . DB_NET . "].dbo.gen_sucursal sucursales
            WHERE codempresa = :codempresa
            AND sucursales.nomsucursal not like '%SEFICORP%'
            AND sucursales.nomsucursal not like '%CREINSA%'
            AND sucursales.nomsucursal not like '%DONACIONES%'
            AND sucursales.nomsucursal not like '%METAPAN%'
            AND sucursales.nomsucursal not like '%OTRAS CUENTAS%'
            AND sucursales.nomsucursal not like '%SAN MIGUEL 2%'";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':codempresa', $codempresa, 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 {
            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 '
                ];
            }

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

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

            $url = $urlApi . '/GENERAL/sucursales/?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) {
                // curl_close($ch);
                return (object)[
                    'status' => 500,
                    'message' => 'No es posible comunicarse con la empresa ',
                    'details' => 'Error: ' . curl_error($ch)
                ];
            }

            $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

            if ($httpcode != 200) {
                // curl_close($ch);
                return (object)[
                    'status' => 500,
                    'message' => 'No es posible comunicarse con la empresa, 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 obtenerPorUsuarioModulo($usuario, $configuracion, $db): object
    {
        $query = "SELECT config.id,
            config.codsucursal,
            config.nombreSucursal
        FROM sistema.config_sucursalesUsuario 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 obtenerTodasPorUsuarioModulo($usuario, $idConfiguracion, $codempresa): object
    {
        $solicitud = self::obtenerTodosPorEmpresa($codempresa);

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

        $db = obtenerConexion();

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

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

        $sucursalesAsignadas = $solicitudAsignadas->data;

        $codsucursales = array_values(array_map(function ($sucursal) {
            return $sucursal->codsucursal;
        }, $sucursalesAsignadas));

        if (in_array('0', $codsucursales)) {
            $codsucursales = array_column($solicitud->data, 'codsucursal');
        }

        $sucursales = array_values(array_filter($solicitud->data, function ($sucursal) use ($codsucursales) {
            return in_array($sucursal->codsucursal, $codsucursales);
        }));

        $sucursales = array_values(array_map(function ($sucursal) use ($sucursalesAsignadas) {
            $idConfiguracion = $sucursalesAsignadas[array_search($sucursal->codsucursal, array_column($sucursalesAsignadas, 'codsucursal'))]->id;

            $sucursal->idConfiguracion = $idConfiguracion;
            return $sucursal;
        }, $sucursales));

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

    public static function guardarAsignacionUsuarioEmpresaModulo($idConfiguracion, $idAsignacion, $codsucursal, $nombreSucursal, $usuario, $db): object
    {
        $respuesta = null;
        $idGuardado = null;

        $query = "EXEC sistema.sp_guardarSucursalUsuarioModulo :idConfiguracion, :idAsignacion, :codsucursal, :nombreSucursal, :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(':codsucursal', $codsucursal, PDO::PARAM_INT);
        $stmt->bindParam(':nombreSucursal', $nombreSucursal, 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, 100);

        try {
            $stmt->execute();

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

    public static function limpiarAsignacionesPorUsuarioEmpresaModulo($idConfiguracion, $usuario, $asignacionesValidas = [], $db): object
    {
        $strAsignaciones = count($asignacionesValidas) > 0 ? implode(',', $asignacionesValidas) : '0';
        $query = "EXEC sistema.sp_limpiarSucursalUsuarioModulo :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)[
                'message' => 'success',
                'status' => 200,
            ];
        } catch (PDOException $e) {
            return (object)[
                'message' => $e->getMessage(),
                'status' => 500,
            ];
        }
    }
}
