/*

milsim_fnc_addMedicalOverlayPFH

Author: IndigoFox

Description:
    Affects players with medical permissions. Will see a 3D colored dot over nearby (5-10m)
	unconscious players who are not in a vehicle
	which indicates their current ACE Triage Card status.
	Designed to increase efficiency of CCPs.

*/

// Force setting if CBA doesn't work?
if (isNil "milsim_client_medState3D_enabled") then {
	milsim_client_medState3D_enabled = true;
};
if (isNil "milsim_client_medState3D_drawRange") then {
	milsim_client_medState3D_drawRange = 10;
};

// List of units to draw icons for
milsim_client_medState3D_drawTargets = []; 

// ACE Triage colors, for consistency across UIs and functions
// #define TRIAGE_COLOR_NONE      0.5, 0.5, 0.5, 0.1
// #define TRIAGE_COLOR_MINIMAL   0, 0.5, 0, 0.9
// #define TRIAGE_COLOR_DELAYED   1, 0.84, 0, 0.9
// #define TRIAGE_COLOR_IMMEDIATE 1, 0, 0, 0.9
// #define TRIAGE_COLOR_DECEASED  0, 0, 0, 0.9

// ACE Triage colors, for consistency across UIs and functions
milsim_client_medState3D_colors = [
	[0, 0.5, 0, 0.9], // TRIAGE_COLOR_MINIMAL
	[1, 0.84, 0, 0.9], // TRIAGE_COLOR_DELAYED
	[1, 0, 0, 0.9], // TRIAGE_COLOR_IMMEDIATE
	[0.15, 0.15, 0.15, 0.9], // TRIAGE_COLOR_DECEASED
	[0.5, 0.5, 0.5, 0] // TRIAGE_COLOR_NONE
];

// Per-frame handler to draw icons
// cleanup
if (!isNil "milsim_client_medState3D_pfh") then {
	[milsim_client_medState3D_pfh] call CBA_fnc_removePerFrameHandler;
};
// add pfh
milsim_client_medState3D_pfh =	[{
	// if disabled, skip processing
	if (!milsim_client_medState3D_enabled) exitWith {false};
	// if no targets, skip processing
	if (count milsim_client_medState3D_drawTargets == 0) exitWith {false};
	if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
	{
		// distance within 10 meters
		if (player distance _x > milsim_client_medState3D_drawRange) then {continue};
		// check unit not null, not conscious, and not in a vehicle
		if (
			!(_x getVariable ["ACE_isUnconscious", false]) ||
			!isNull (objectParent _x)
		) then {continue};

		// color based on triage level
		private _triageLevel = _x getVariable ["ace_medical_triageLevel", -1];
		if (_triageLevel == -1) then {continue};
		private _color = milsim_client_medState3D_colors select (
			(_x getVariable ["ace_medical_triageLevel", -1]) -1
		);
		// draw position, slightly above the prone unit
		private _drawPos = (visiblePosition _x) vectorAdd [0, 0, 0.5];
		// draw icon
		drawIcon3D [
			"\A3\ui_f\data\map\markers\military\dot_CA.paa", // icon texture
			_color, // color
			_drawPos, // position AGL
			1, // width
			1, // height
			0 // angle
			// further params optional, omitted
		];
	} forEach milsim_client_medState3D_drawTargets;
}, 0, []] call CBA_fnc_addPerFrameHandler;

// subroutine to gather nearest 50 units every 5 seconds and store in milsim_client_medState3D_drawTargets
// cleanup
if (!isNil "milsim_client_medState3D_drawTargetsPfh") then {
	[milsim_client_medState3D_drawTargetsPfh] call CBA_fnc_removePerFrameHandler;
};
// add pfh
milsim_client_medState3D_drawTargetsPfh = [{
	milsim_client_medState3D_drawTargets = (
		(allUnits + allDeadMen) select {
			_x isKindOf "CAManBase" && 
			player distance _x < 50 &&
			!isNull _x &&
			player isNotEqualTo _x
		}
	);
}, 5, false] call CBA_fnc_addPerFrameHandler;
