/*
 * Author: commy2
 * Set the hitpoint damage and change the structural damage acordingly, requires local vehicle.
 *
 * Arguments:
 * 0: Local Vehicle to Damage <OBJECT>
 * 1: Selected hitpoint <STRING>
 * 2: Total Damage <NUMBER>
 *
 * Return Value:
 * None
 *
 * Example:
 * [vehicle, "hitpoint", 0.5] call ace_repair_fnc_setHitPointDamage
 *
 * Public: No
 */
#include "script_component.hpp"

params ["_vehicle", "_hitPoint", "_hitPointDamage"];
TRACE_3("params",_vehicle,_hitPoint,_hitPointDamage);

// can't execute all commands if the vehicle isn't local. exit here.
if !(local _vehicle) exitWith {};

// get all valid hitpoints
private ["_hitPoints", "_hitPointsWithSelections"];

_hitPoints = [_vehicle] call EFUNC(common,getHitpoints);
_hitPointsWithSelections = [_vehicle] call EFUNC(common,getHitpointsWithSelections) select 0;

// exit if the hitpoint is not valid
if !(_hitPoint in _hitPoints) exitWith {systemChat format["NOT A VALID HITPOINT: %1",_hitpoint]};

// save array with damage values of all hitpoints
private "_hitPointDamages";
_hitPointDamages = [];

{
    _hitPointDamages set [_forEachIndex, (_vehicle getHitPointDamage _x)];
} forEach _hitPoints;

// save structural damage and sum of hitpoint damages
private ["_damageOld", "_hitPointDamageSumOld"];

_damageOld = damage _vehicle;

_hitPointDamageSumOld = 0;
{
    if (!(_x in IGNORED_HITPOINTS) && {!isText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "HitPoints" >> _x >> "depends")}) then {
        _hitPointDamageSumOld = _hitPointDamageSumOld + (_hitPointDamages select (_hitPoints find _x));
    };
} forEach _hitPointsWithSelections;

// set new damage in array
_hitPointDamages set [_hitPoints find _hitPoint, _hitPointDamage];

// save sum of new hitpoint damages
private "_hitPointDamageSumNew";

_hitPointDamageSumNew = 0;
{
    if (!(_x in IGNORED_HITPOINTS) && {!isText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "HitPoints" >> _x >> "depends")}) then {
        _hitPointDamageSumNew = _hitPointDamageSumNew + (_hitPointDamages select (_hitPoints find _x));
    };
} forEach _hitPointsWithSelections;

// calculate new strctural damage
private "_damageNew";
_damageNew = _hitPointDamageSumNew / count _hitPoints;

if (_hitPointDamageSumOld > 0) then {
    _damageNew = _damageOld * (_hitPointDamageSumNew / _hitPointDamageSumOld);
};

// set new structural damage value
_vehicle setDamage _damageNew;

// set the new damage for that hit point

{
    _vehicle setHitPointDamage [_x, _hitPointDamages select _forEachIndex];
} forEach _hitPoints;

// normalize hitpoints
// [_vehicle] call FUNC(normalizeHitPoints);