#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);

[{
    if (isNull findDisplay 12) exitWith {};

    GVAR(lastStillPosition) = ((findDisplay 12) displayCtrl 51) ctrlMapScreenToWorld [0.5, 0.5];
    GVAR(lastStillTime) = ACE_time;
    GVAR(isShaking) = false;

    //map sizes are multiples of 1280
    GVAR(worldSize) = worldSize / 1280;
    GVAR(mousePos) = [0.5,0.5];

    //Allow panning the lastStillPosition while mapShake is active
    GVAR(rightMouseButtonLastPos) = [];
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}];
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", {
        if (GVAR(isShaking) && {(count GVAR(rightMouseButtonLastPos)) == 2}) then {
            private["_lastPos", "_newPos"];
            _lastPos = (_this select 0) ctrlMapScreenToWorld GVAR(rightMouseButtonLastPos);
            _newPos = (_this select 0) ctrlMapScreenToWorld (_this select [1,2]);
            GVAR(lastStillPosition) set [0, (GVAR(lastStillPosition) select 0) + (_lastPos select 0) - (_newPos select 0)];
            GVAR(lastStillPosition) set [1, (GVAR(lastStillPosition) select 1) + (_lastPos select 1) - (_newPos select 1)];
            GVAR(rightMouseButtonLastPos) = _this select [1,2];
            TRACE_3("Mouse Move",_lastPos,_newPos,GVAR(rightMouseButtonLastPos));
        };
    }];
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonDown", {
        if ((_this select 1) == 1) then {
            GVAR(rightMouseButtonLastPos) = _this select [2,2];
        };
    }];
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonUp", {
        if ((_this select 1) == 1) then {
            GVAR(rightMouseButtonLastPos) = [];
        };
    }];

    //get mouse position on map
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", {
        GVAR(mousePos) = (_this select 0) ctrlMapScreenToWorld [_this select 1, _this select 2];
    }];
    ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseHolding", {
        GVAR(mousePos) = (_this select 0) ctrlMapScreenToWorld [_this select 1, _this select 2];
    }];

    [_this select 1] call CBA_fnc_removePerFrameHandler;
}, 0] call CBA_fnc_addPerFrameHandler;

["SettingsInitialized", {
    // Start Blue Force Tracking if Enabled
    if (GVAR(BFT_Enabled)) then {
        GVAR(BFT_markers) = [];
        [FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler;
    };

    //illumination settings
    if (GVAR(mapIllumination)) then {
        GVAR(flashlightInUse) = "";
        GVAR(glow) = objNull;

        ["playerInventoryChanged", {
            _flashlights = [ACE_player] call FUNC(getUnitFlashlights);
            if ((GVAR(flashlightInUse) != "") && !(GVAR(flashlightInUse) in _flashlights)) then {
                GVAR(flashlightInUse) = "";
            };
        }] call EFUNC(common,addEventHandler);

        if (GVAR(mapGlow)) then {
            ["visibleMapChanged", {
                params ["_player", "_mapOn"];
                if (_mapOn) then {
                    if (!alive _player && !isNull GVAR(glow)) then {
                        GVAR(flashlightInUse) = "";
                    };
                    if (GVAR(flashlightInUse) != "") then {
                        if (isNull GVAR(glow)) then {
                            [GVAR(flashlightInUse)] call FUNC(flashlightGlow);
                        };
                    } else {
                        if (!isNull GVAR(glow)) then {
                            [""] call FUNC(flashlightGlow);
                        };
                    };
                } else {
                    if (!isNull GVAR(glow)) then {
                        [""] call FUNC(flashlightGlow);
                    };
                };
            }] call EFUNC(common,addEventHandler);
        };
    };
}] call EFUNC(common,addEventHandler);

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

["playerInventoryChanged", {
    if (isNull (_this select 0)) exitWith {
        GVAR(hasWatch) = true;
    };
    GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17);
}] call EFUNC(common,addEventHandler);