/*
 * Author: commy2
 *
 * Execute a function on a remote machine in mp.
 *
 * Argument:
 * 0: Function arguments (Array)
 * 1: Function to execute, has to be defined on the remote machine first (String)
 * 2: The function will be executed where this unit is local OR the mode were this function should be executed. (Object OR Number, optional default: 2)
 *     Mode 0: execute on this machine only
 *     Mode 1: execute on server
 *     Mode 2: execute on all clients + server
 *     Mode 3: execute on dedicated only
 *
 * Return value:
 * Nothing
 */
#include "script_component.hpp"

private ["_arguments", "_function", "_unit", "_id"];

GVAR(remoteFnc) = _this;

_arguments = _this select 0;
_function = call compile (_this select 1);
_unit = _this select 2;

if (isNil "_unit") then {
  _unit = 2;
};

["Remote", [_arguments, _this select 1, _unit], {format ["%1 call %2 to: %3", _this select 0, _this select 1, _this select 2]}, false] call FUNC(log);

if (typeName _unit == "SCALAR") exitWith {
  switch (_unit) do {
    case 0 : {
      _arguments call _function;
    };
    case 1 : {
      if (isServer) then {
        _arguments call _function;
      } else {
        publicVariableServer QGVAR(remoteFnc);
      };
    };
    case 2 : {
      _arguments call _function;

      GVAR(remoteFnc) set [2, 0];
      publicVariable QGVAR(remoteFnc);
    };
    case 3 : {
      if (isDedicated) then {
        _arguments call _function;
      } else {
        if (!isServer) then {publicVariableServer QGVAR(remoteFnc)};
      };
    };
  };
};

if (local _unit) then {
  _arguments call _function;
} else {
  if (isServer) then {
    _id = owner _unit;
    _id publicVariableClient QGVAR(remoteFnc);
  } else {
    publicVariableServer QGVAR(remoteFnc);
  };
};