#include "script_component.hpp"

// Exit on Headless as well
if (!hasInterface) exitWith {};

LOG(MSG_INIT);

// Calculate the maximum zoom allowed for this map
call FUNC(determineZoom);

GVAR(flashlights) = createHashMap;

["CBA_settingsInitialized", {
    if (isMultiplayer && {GVAR(DefaultChannel) != -1}) then {
        //Set the chat channel once the map has finished loading
        [{
            if ((isNull findDisplay 37) && {isNull findDisplay 52} && {isNull findDisplay 53} && {isNull findDisplay 12}) exitWith {};
            [_this select 1] call CBA_fnc_removePerFrameHandler;

            setCurrentChannel GVAR(DefaultChannel);
            if (currentChannel == GVAR(DefaultChannel)) then {
                // INFO_1("Channel Set - %1",currentChannel);
            } else {
                ERROR_2("Failed To Set Channel %1 (is %2)",GVAR(DefaultChannel),currentChannel);
            };
        }, 0, []] call CBA_fnc_addPerFrameHandler;
    };

    //illumination settings
    if (GVAR(mapIllumination)) then {
        ["loadout", {
            params ["_player", ""];
            private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]];
            _unitLight params ["_flashlight", "_glow"];
            if ((_flashlight != "") && {!(_flashlight in ([_player] call FUNC(getUnitFlashlights)))}) then {
                // remove the current glow if the unit suddenly lost it's flashlight
                if (!isNull _glow) then {
                    _glow = [_player, "", false] call FUNC(flashlightGlow);
                };
                _player setVariable [QGVAR(flashlight), ["", _glow], true];
            };
        }] call CBA_fnc_addPlayerEventHandler;

        if (GVAR(mapGlow)) then {
            ["visibleMap", {
                params ["_player", "_mapOn"];
                private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]];
                _unitLight params ["_flashlight", "_glow"];
                if (_mapOn) then {
                    if (_flashlight isNotEqualTo "" && {isNull _glow}) then {
                        [_player, _flashlight] call FUNC(flashlightGlow);
                        if ([_player, _flashlight] call FUNC(needPlaySound)) then {playSound QGVAR(flashlightClick)};
                    };
                } else {
                    if (!isNull _glow) then {
                        [_player, ""] call FUNC(flashlightGlow);
                        if ([_player, _flashlight] call FUNC(needPlaySound)) then {playSound QGVAR(flashlightClick)};
                    };
                };
            }] call CBA_fnc_addPlayerEventHandler;
        };
    };
}] call CBA_fnc_addEventHandler;

// hide clock on map if player has no watch
GVAR(hasWatch) = true;

["loadout", {
    params ["_unit"];
    if (isNull _unit) exitWith {
        GVAR(hasWatch) = true;
    };
    GVAR(hasWatch) = false;
    {
        if (_x isKindOf ["ItemWatch", configFile >> "CfgWeapons"]) exitWith {GVAR(hasWatch) = true;};
    } forEach (assignedItems _unit);
}, true] call CBA_fnc_addPlayerEventHandler;


// Vehicle map lighting:
GVAR(vehicleLightCondition) = {true};
GVAR(vehicleExteriorTurrets) = [];
GVAR(vehicleLightColor) = [1,1,1,0];

["vehicle", {
    params ["_unit", "_vehicle"];
    if ((isNull _vehicle) || {_unit == _vehicle}) exitWith {};
    private _cfg = configOf _vehicle;
    GVAR(vehicleExteriorTurrets) = getArray (_cfg >> QGVAR(vehicleExteriorTurrets));
    GVAR(vehicleLightColor) = [_cfg >> QGVAR(vehicleLightColor), "array", [1,1,1,0]] call CBA_fnc_getConfigEntry;

    // Handle vehicles with toggleable interior lights:
    private _vehicleLightCondition = getText (_cfg >> QGVAR(vehicleLightCondition));
    if (_vehicleLightCondition == "") then {
        private _userAction = toLowerANSI getText (_cfg >> "UserActions" >> "ToggleLight" >> "statement");
        if (
            false // isClass (_cfg >> "compartmentsLights")
            || {_userAction find "cabinlights_hide" > 0}
            || {_userAction find "cargolights_hide" > 0}
        ) then {
            _vehicleLightCondition = "false";
        };
    };

    GVAR(vehicleLightCondition) = if (_vehicleLightCondition != "") then {
        if (_vehicle isKindOf "Helicopter" || {_vehicle isKindOf "Plane"}) then {
            compile format ["(driver _vehicle == _unit) || {gunner _vehicle == _unit} || {%1}", _vehicleLightCondition];
        } else {
            compile _vehicleLightCondition
        };
    } else {
        switch (true) do {
            case (_vehicle isKindOf "Tank");
            case (_vehicle isKindOf "Wheeled_APC_F"): { {true} };
            case (_vehicle isKindOf "ParachuteBase"): { {false} };
            case (_vehicle isKindOf "Helicopter");
            case (_vehicle isKindOf "Plane"): { {(driver _vehicle == _unit) || {gunner _vehicle == _unit}} };
            default { {false} };
        };
    };
}, true] call CBA_fnc_addPlayerEventHandler;

// compartmentsLights work only when cameraView == "INTERNAL" so we switch it on map opening
["visibleMap", {
    params ["_player", "_mapOn"];
    if (_mapOn) then {
        if (!isClass (configOf vehicle _player >> "compartmentsLights") || {cameraView == "INTERNAL"}) exitWith {};
        GVAR(cameraViewLast) = cameraView;
        vehicle _player switchCamera "INTERNAL";
    } else {
        if (isNil QGVAR(cameraViewLast)) exitWith {};
        vehicle _player switchCamera GVAR(cameraViewLast);
        GVAR(cameraViewLast) = nil;
    };
}] call CBA_fnc_addPlayerEventHandler;