#include "..\script_component.hpp"
/*
 * Author: NouberNou and esteldunedain
 * Compile the self action menu from config for an object's class
 *
 * Arguments:
 * 0: Object or class name <OBJECT> or <STRING>
 *
 * Return Value:
 * None
 *
 * Example:
 * [bob] call ACE_interact_menu_fnc_compileMenuSelfAction
 *
 * Public: No
 */

params ["_target"];

private _objectType = if (_target isEqualType objNull) then {
    typeOf _target
} else {
    _target call EFUNC(common,getConfigName)
};

// Exit if the action menu is already compiled for this class
if (_objectType in GVAR(actSelfNamespace)) exitWith {};

private _recurseFnc = {
    params ["_actionsCfg"];

    private _actions = [];

    {
        private _entryCfg = _x;
        if (isClass _entryCfg) then {
            private _displayName = getText (_entryCfg >> "displayName");

            private _icon = if (isArray (_entryCfg >> "icon")) then {
                getArray (_entryCfg >> "icon");
            } else {
                [getText (_entryCfg >> "icon"), "#FFFFFF"];
            };
            private _statement = compile (getText (_entryCfg >> "statement"));

            private _condition = getText (_entryCfg >> "condition");

            // Add canInteract (including exceptions) and canInteractWith to condition
            private _canInteractCondition = format [QUOTE([ARR_3(ACE_player,_target,%1)] call EFUNC(common,canInteractWith)), getArray (_entryCfg >> "exceptions")];
            private _conditionFormatPattern = ["%1 && {%2}", "%2"] select (_condition isEqualTo "" || {_condition == "true"});
            _condition = compile format [_conditionFormatPattern, _condition, _canInteractCondition];

            private _insertChildren = compile (getText (_entryCfg >> "insertChildren"));
            private _modifierFunction = compile (getText (_entryCfg >> "modifierFunction"));

            private _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
            private _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
            private _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0;
            private _runOnHover = true;
            if (isText (_entryCfg >> "runOnHover")) then {
                _runOnHover = compile getText (_entryCfg >> "runOnHover");
            } else {
                _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0;
            };

            private _children = [_entryCfg] call _recurseFnc;

            private _entry = [
                        [
                            configName _entryCfg,
                            _displayName,
                            _icon,
                            _statement,
                            _condition,
                            _insertChildren,
                            [],
                            [0,0,0],
                            10, //distace
                            [_showDisabled,_enableInside,_canCollapse,_runOnHover, true],
                            _modifierFunction
                        ],
                        _children
                    ];
            _actions pushBack _entry;
        };
    } forEach (configProperties [_actionsCfg, "isClass _x", true]);
    _actions
};

private _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions";

private _baseDisplayName = "";
private _baseIcon = "";
if (_objectType isKindOf "CAManBase") then {
    _baseDisplayName = localize LSTRING(SelfActionsRoot);
    _baseIcon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
} else {
    _baseDisplayName = getText (configFile >> "CfgVehicles" >> _objectType >> "displayName");
    //Alt would be to just use a static text, if veh names end up being too long:
    // _baseDisplayName = localize LSTRING(VehicleActionsRoot);

    //Pull the icon from the vehicle's config:
    _baseIcon = getText (configFile >> "CfgVehicles" >> _objectType >> "Icon");
    //icon could be a CfgVehicleIcons
    if isText (configFile >> "CfgVehicleIcons" >> _baseIcon) then {
        _baseIcon = getText (configFile >> "CfgVehicleIcons" >> _baseIcon);
    };
};

TRACE_1("Building ACE_SelfActions",_objectType);
// Create a master action to base on self action
private _actions = [
        [
            [
                "ACE_SelfActions",
                _baseDisplayName,
                _baseIcon,
                {
                    // Dummy statement so it's not collapsed when there's no available actions
                    true
                },
                {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotHandcuffed", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)},
                {},
                {},
                "Spine3",
                10,
                [false,true,false,false,false]
            ],
            [_actionsCfg] call _recurseFnc
        ]
    ];

GVAR(ActSelfNamespace) set [_objectType, _actions];