/// <reference path="../../../util/ArrayUtils.ts" />
/// <reference path="../../ITouchpoint.ts" />
/// <reference path="../IProvisioningResult.ts" />
/// <reference path="../IOrderInformation.ts" />
/// <reference path="./IConstructorArgument.ts" />
var econda;
(function (econda) {
    var tpm;
    (function (tpm) {
        var provisioning;
        (function (provisioning) {
            var partials;
            (function (partials) {
                /**
                 * Use only touchpoints from current session.
                 *
                 * @class econda.tpm.provisioning.partials.OnlyCurrentSession
                 */
                var ComputeProvisioningRecord = (function () {
                    function ComputeProvisioningRecord(data) {
                        this._touchpoints = [];
                        this._order = null;
                        this._keyName = null;
                        this._touchpoints = data.touchpoints;
                        this._order = data.order;
                        this._keyName = data.keyName || 'name';
                    }
                    ComputeProvisioningRecord.prototype.apply = function (keyName) {
                        var cmp = this;
                        if (typeof keyName === 'string') {
                            this._keyName = keyName;
                        }
                        var tmp;
                        tmp = this._getTargets();
                        tmp._ = { order: cmp._order };
                        var normalizedTmp = ComputeProvisioningRecord._getNormalizedResult(tmp);
                        this._addValuesForCalculatedShares(normalizedTmp);
                        return normalizedTmp;
                    };
                    ComputeProvisioningRecord.prototype._getTargets = function () {
                        var keyName = this._keyName;
                        var targets = { _: null };
                        for (var n = 0; n < this._touchpoints.length; n++) {
                            if (typeof this._touchpoints[n].share !== 'undefined' && this._touchpoints[n].share > 0) {
                                ComputeProvisioningRecord._addTouchpoint(targets, this._touchpoints[n], keyName);
                            }
                        }
                        return targets;
                    };
                    /**
                     * Input: Reference of result with share properties normalized
                     * @param tempResult
                     * @private
                     */
                    ComputeProvisioningRecord.prototype._addValuesForCalculatedShares = function (tempResult) {
                        var order = this._order || { value: 1 };
                        var orderValue = order.value || 1;
                        for (var targetName in tempResult) {
                            if (tempResult.hasOwnProperty(targetName) && targetName !== '_') {
                                var currentTarget = tempResult[targetName];
                                currentTarget.value = +((currentTarget.share * orderValue).toFixed(2));
                            }
                        }
                        return tempResult;
                    };
                    ComputeProvisioningRecord._addTouchpoint = function (provisioningResult, touchpoint, keyName) {
                        var targetKey = touchpoint[keyName] || 'unknown';
                        if (typeof provisioningResult[targetKey] === 'undefined') {
                            provisioningResult[targetKey] = {
                                share: 0,
                                touchpoints: []
                            };
                        }
                        var target = provisioningResult[targetKey];
                        target.share = target.share + touchpoint.share;
                        target.touchpoints.push(touchpoint);
                    };
                    ComputeProvisioningRecord._getNormalizedResult = function (tempResult) {
                        var sumShares = 0;
                        for (var targetName in tempResult) {
                            if (tempResult.hasOwnProperty(targetName) && targetName !== '_') {
                                sumShares += tempResult[targetName].share;
                            }
                        }
                        var f = 1 / sumShares;
                        for (var targetName in tempResult) {
                            if (tempResult.hasOwnProperty(targetName) && targetName !== '_') {
                                tempResult[targetName].share = tempResult[targetName].share * f;
                            }
                        }
                        return tempResult;
                    };
                    ComputeProvisioningRecord.FUNCTION_NAME = 'computeProvisioningRecord';
                    return ComputeProvisioningRecord;
                }());
                partials.ComputeProvisioningRecord = ComputeProvisioningRecord;
            })(partials = provisioning.partials || (provisioning.partials = {}));
        })(provisioning = tpm.provisioning || (tpm.provisioning = {}));
    })(tpm = econda.tpm || (econda.tpm = {}));
})(econda || (econda = {}));