/// <reference path="../../base/BaseClass.ts" />
/// <reference path="../ITouchpoint.ts" />
/// <reference path="./partials/ForOrder.ts" />
/// <reference path="./partials/OnlyCurrentSession.ts" />
/// <reference path="./partials/ProvisionFirst.ts" />
/// <reference path="./partials/ProvisionLast.ts" />
/// <reference path="./partials/ComputeProvisioningRecord.ts" />
/// <reference path="./partials/WithTouchpoints.ts" />
var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var econda;
(function (econda) {
    var tpm;
    (function (tpm) {
        var provisioning;
        (function (provisioning) {
            var Provisioner = (function (_super) {
                __extends(Provisioner, _super);
                function Provisioner(cfg) {
                    if (cfg === void 0) { cfg = null; }
                    _super.call(this);
                    this._keyName = 'name';
                    this._order = { value: 0 };
                    this.touchpoints = [];
                    this._provisioners = {};
                    if (cfg instanceof Provisioner) {
                        return cfg;
                    }
                    else {
                        this.initConfig(cfg);
                    }
                    this._addPartials();
                }
                Provisioner.prototype.setKeyName = function (name) {
                    this._keyName = name;
                };
                Provisioner.prototype.getKeyName = function () {
                    return this._keyName;
                };
                Provisioner.prototype.getOrder = function () {
                    return this._order;
                };
                Provisioner.prototype.setOrder = function (data) {
                    this._order = data;
                };
                Provisioner.prototype.setTouchpoints = function (touchpoints) {
                    this.touchpoints.splice(0, this.touchpoints.length);
                    this.touchpoints.push.apply(this.touchpoints, touchpoints);
                };
                /**
                 * Create and return new provisioner instance
                 * @returns {econda.tpm.provisioning.Provisioner}
                 * @constructor
                 */
                Provisioner.Create = function () {
                    return new Provisioner();
                };
                Provisioner.prototype._addPartials = function () {
                    var cmp = this;
                    var data = {
                        touchpoints: cmp.touchpoints,
                        order: cmp._order,
                        keyName: cmp._keyName
                    };
                    for (var p in econda.tpm.provisioning.partials) {
                        if (econda.tpm.provisioning.partials.hasOwnProperty(p)) {
                            var instance = new econda.tpm.provisioning.partials[p](data);
                            var dynamicFunction = (function () {
                                var localInstance = instance;
                                var applyFunction = instance.apply;
                                return function () {
                                    var ret = applyFunction.apply(localInstance, arguments);
                                    if (typeof ret === 'undefined' || !ret) {
                                        ret = this;
                                    }
                                    return ret;
                                };
                            })();
                            this._provisioners[p] = instance;
                            this[econda.tpm.provisioning.partials[p]['FUNCTION_NAME']] = dynamicFunction;
                        }
                    }
                };
                return Provisioner;
            }(econda.base.BaseClass));
            provisioning.Provisioner = Provisioner;
        })(provisioning = tpm.provisioning || (tpm.provisioning = {}));
    })(tpm = econda.tpm || (econda.tpm = {}));
})(econda || (econda = {}));
// add shortcut function to create new provisioner
econda['provisioner'] = econda.tpm.provisioning.Provisioner.Create;