// by commy2
#include "script_component.hpp"

// fixes laser when being captured. Needed, because the selectionPosition of the right hand is used
[QEGVAR(captives,setHandcuffed), {if (_this select 1) then {(_this select 0) action ["GunLightOff", _this select 0]};}] call CBA_fnc_addEventHandler;

if (!hasInterface) exitWith {};

GVAR(nearUnits) = [];
GVAR(index) = -1;
GVAR(laserClassesCache) = [] call CBA_fnc_createNamespace;
GVAR(redLaserUnits) = [];
GVAR(greenLaserUnits) = [];

["CBA_settingsInitialized", {
    // If not enabled, dont't add draw eventhandler or PFEH (for performance)
    if (!GVAR(enabled)) exitWith {
        ["CBA_attachmentSwitched", {
            params ["_unit", "_prevItem", "_newItem", "_currWeaponType"];
            TRACE_4("CBA_attachmentSwitched eh",_unit,_prevItem,_newItem,_currWeaponType);
            if ((getNumber (configFile >> "CfgWeapons" >> _newItem >> "ACE_laserpointer")) > 0) then {
                TRACE_1("removing ACE_laserpointer",getNumber (configFile >> "CfgWeapons" >> _newItem >> "ACE_laserpointer"));
                [1, "prev"] call CBA_accessory_fnc_switchAttachment;
            };
        }] call CBA_fnc_addEventHandler;
    };

    [{
        private _oldNearUnits = GVAR(nearUnits);
        GVAR(nearUnits) = call FUNC(getNearUnits);

        // remove units that moved away
        {
            GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _x);
            GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _x);
        } forEach (_oldNearUnits - GVAR(nearUnits));
    }, 5, []] call CBA_fnc_addPerFrameHandler;


    private _fnc_processUnit = {
        params ["_unit"];

        private _weapon = currentWeapon _unit;
        if (!(_unit isFlashlightOn _weapon)) exitWith {
            GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
            GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
        };

        private _laser = [(_unit weaponAccessories _weapon) select 1] param [0, ""];
        if (_laser isEqualTo "") exitWith {
            GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
            GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
        };

        private _laserID = GVAR(laserClassesCache) getVariable _laser;

        if (isNil "_laserID") then {
            _laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer");
            GVAR(laserClassesCache) setVariable [_laser, _laserID];
        };
        TRACE_3("",_weapon,_laser,_laserID);

        if (_laserID isEqualTo 1) exitWith {
            GVAR(redLaserUnits) pushBackUnique _unit;
            GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
        };

        if (_laserID isEqualTo 2) exitWith {
            GVAR(greenLaserUnits) pushBackUnique _unit;
            GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
        };
    };

    // custom scheduler
    [{
        params ["_fnc_processUnit"];

        ACE_player call _fnc_processUnit;

        GVAR(index) = GVAR(index) + 1;
        private _unit = GVAR(nearUnits) param [GVAR(index), objNull];

        if (isNull _unit) exitWith {
            GVAR(index) = -1;
        };

        _unit call _fnc_processUnit;
    }, 0.1, _fnc_processUnit] call CBA_fnc_addPerFrameHandler;

    addMissionEventHandler ["Draw3D", {call FUNC(onDraw)}];
}] call CBA_fnc_addEventHandler;