#include "script_component.hpp"

ADDON = false;

PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;

#include "initSettings.inc.sqf"

// restore gunbag info after respawn
["CAManBase", "respawn", {
    [{
        params ["_unit", "_corpse"];

        private _newBackpack = backpackContainer _unit;
        private _oldBackpack = backpackContainer _corpse;

        if (typeOf _newBackpack isNotEqualTo typeOf _oldBackpack) exitWith {};

        private _state = _oldBackpack getVariable [QGVAR(gunbagWeapon), []];

        if (_state isNotEqualTo []) then {
            _newBackpack setVariable [QGVAR(gunbagWeapon), _state, true];
        };
    }, _this] call CBA_fnc_execNextFrame;
}] call CBA_fnc_addClassEventHandler;

[QEGVAR(arsenal,loadoutVerified), {
    params ["_loadout", "_extendedInfo", "", "", "_missingExtendedInfo"];
    private _gunbagInfo = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []];
    if (_gunbagInfo isEqualTo []) exitWith {};

    private _weapon = (_gunbagInfo select 0) call EFUNC(arsenal,baseWeapon);
    if !(_weapon in EGVAR(arsenal,virtualItemsFlat)) exitWith {
        _missingExtendedInfo pushBack [QGVAR(gunbagWeapon), _weapon];
        _extendedInfo deleteAt QGVAR(gunbagWeapon);
    };
    private _missingItems = [];
    private _attachments = _gunbagInfo select 1;
    {
        if (_x != "" && {!(_x call EFUNC(arsenal,baseWeapon) in EGVAR(arsenal,virtualItemsFlat))}) then {
            _missingItems pushBack _x;
            _attachments set [_forEachIndex, ""];
        };
    } forEach _attachments;
    private _magazines = _gunbagInfo select 2;
    {
        private _class = _x param [0, ""];
        if (_class != "" && {!(_class in EGVAR(arsenal,virtualItemsFlat))}) then {
            _missingItems pushBack _class;
            _magazines set [_forEachIndex, ["", 0]];
        };
    } forEach _magazines;
    if (_missingItems isNotEqualTo []) then {
        _missingExtendedInfo pushBack [QGVAR(gunbagWeapon), _missingItems];
    };
}] call CBA_fnc_addEventHandler;

["CBA_loadoutSet", {
    params ["_unit", "_loadout", "_extendedInfo"];
    private _gunbagWeapon = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []];
    if (_gunbagWeapon isNotEqualTo []) then {
        (backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true];
    };
}] call CBA_fnc_addEventHandler;

["CBA_loadoutGet", {
    params ["_unit", "_loadout", "_extendedInfo"];
    private _gunbagWeapon = (backpackContainer _unit) getVariable [QGVAR(gunbagWeapon), []];
    if (_gunbagWeapon isNotEqualTo []) then {
        _extendedInfo set [QGVAR(gunbagWeapon), _gunbagWeapon];
    };
}] call CBA_fnc_addEventHandler;

ADDON = true;