/*
THIS INFRAGISTICS ULTIMATE SOFTWARE LICENSE  AGREEMENT ("AGREEMENT") LOCATED HERE:
https://www.infragistics.com/legal/license/igultimate-la
https://www.infragistics.com/legal/license/igultimate-eula
GOVERNS THE LICENSING, INSTALLATION AND USE OF INFRAGISTICS SOFTWARE. BY DOWNLOADING AND/OR INSTALLING AND USING INFRAGISTICS SOFTWARE:  you are indicating that you have read and understand this Agreement, and agree to be legally bound by it on behalf of the yourself and your company.
*/
import { __extends, __values } from "tslib";
import { Base, IList_$type, runOn, String_$type, EnumUtil, fromEnum, typeCast, Array_$type, markType } from "./type";
import { IDataSourceLocalDataProvider_$type } from "./IDataSourceLocalDataProvider";
import { IDataSourceSchema_$type } from "./IDataSourceSchema";
import { DataSourceSchemaPropertyType_$type } from "./DataSourceSchemaPropertyType";
import { DefaultDataSourceSchema } from "./DefaultDataSourceSchema";
import { SortDescriptionCollection } from "./SortDescriptionCollection";
import { FilterExpressionCollection } from "./FilterExpressionCollection";
import { SummaryDescriptionCollection } from "./SummaryDescriptionCollection";
import { Dictionary$2 } from "./Dictionary$2";
import { FastReflectionHelper } from "./FastReflectionHelper";
import { HashSet$1 } from "./HashSet$1";
import { DataSourceDataProviderSchemaChangedEventArgs } from "./DataSourceDataProviderSchemaChangedEventArgs";
import { List$1 } from "./List$1";
import { stringStartsWith } from "./string";
/**
 * @hidden
 */
var DataSourceLocalDataProvider = /** @class */ /*@__PURE__*/ (function (_super) {
    __extends(DataSourceLocalDataProvider, _super);
    function DataSourceLocalDataProvider() {
        var _this = _super.call(this) || this;
        _this.m = null;
        _this.l = null;
        _this.f = null;
        _this.n = null;
        _this.e = 0;
        _this.z = 5;
        _this.aa = null;
        _this.t = new Dictionary$2(String_$type, DataSourceSchemaPropertyType_$type, 0);
        _this.ac = null;
        _this.schemaChanged = null;
        _this.s = new Dictionary$2(String_$type, FastReflectionHelper.$, 0);
        _this.u = new HashSet$1(String_$type, 0);
        _this.i = null;
        _this.x = null;
        _this.q = false;
        _this.h = null;
        _this.g = null;
        _this.p = false;
        _this.a = null;
        _this.o = false;
        _this.m = new SortDescriptionCollection();
        _this.m.n(runOn(_this, _this.as));
        _this.l = new SortDescriptionCollection();
        _this.n = new SummaryDescriptionCollection();
        _this.f = new FilterExpressionCollection();
        return _this;
    }
    DataSourceLocalDataProvider.prototype.as = function (a, b) {
        this.queueAutoRefresh();
    };
    DataSourceLocalDataProvider.prototype.clone = function () {
        var a = new DataSourceLocalDataProvider();
        a.deferAutoRefresh = this.deferAutoRefresh;
        a.executionContext = this.executionContext;
        a.dataSource = this.dataSource;
        a.propertiesRequested = this.propertiesRequested;
        a.af = this.af;
        a.summaryScope = this.summaryScope;
        for (var b = 0; b < this.groupDescriptions.k.count; b++) {
            a.groupDescriptions.add(this.groupDescriptions.k.item(b));
        }
        for (var c = 0; c < this.sortDescriptions.k.count; c++) {
            a.sortDescriptions.add(this.sortDescriptions.k.item(c));
        }
        for (var d = 0; d < this.filterExpressions.k.count; d++) {
            a.filterExpressions.add(this.filterExpressions.k.item(d));
        }
        for (var e = 0; e < this.summaryDescriptions.k.count; e++) {
            a.summaryDescriptions.add(this.summaryDescriptions.k.item(e));
        }
        return a;
    };
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "dataSource", {
        get: function () {
            return this.aa;
        },
        set: function (a) {
            var b = this.aa;
            this.aa = a;
            if (b != this.aa) {
                this.am("ItemsSource", b, this.aa);
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "af", {
        get: function () {
            return this.ac;
        },
        set: function (a) {
            var b = this.ac;
            this.ac = a;
            if (b != this.ac) {
                this.am("SchemaHints", b, this.ac);
            }
        },
        enumerable: false,
        configurable: true
    });
    DataSourceLocalDataProvider.prototype.an = function () {
        if (this.ac == null) {
            return;
        }
        this.t.clear();
        var a = this.ac.split(',');
        for (var b = 0; b < a.length; b++) {
            var c = a[b].trim().split(':');
            if (c.length != 2) {
                continue;
            }
            var d = c[0];
            var e = this.c(c[1]);
            this.t.addItem(d, e);
        }
    };
    DataSourceLocalDataProvider.prototype.c = function (a) {
        var b = EnumUtil.parse(DataSourceSchemaPropertyType_$type, a, true);
        if (b != null) {
            return EnumUtil.getEnumValue(DataSourceSchemaPropertyType_$type, b);
        }
        return 11;
    };
    DataSourceLocalDataProvider.prototype.getItemAtIndex = function (a) {
        if (this.x == null) {
            return null;
        }
        if (this.q) {
            return this.x[a];
        }
        return this.x.item(a);
    };
    DataSourceLocalDataProvider.prototype.getItemValue = function (a, b) {
        this.aj();
        var c;
        var d = this.s.tryGetValue(b, c);
        c = d.p1;
        if (c == null && !this.u.contains(b)) {
            var e = b.split('.');
            var f = a;
            var g = true;
            for (var h = 0; h < e.length; h++) {
                f = f[e[h]];
                if ((f === undefined)) {
                    g = false;
                    break;
                }
            }
            if (g) {
                c = new FastReflectionHelper(false, b);
                this.s.addItem(b, c);
            }
            else {
                this.u.add_1(b);
            }
        }
        if (c == null) {
            return null;
        }
        var val_ = c.getPropertyValue(a);
        if ((val_ === undefined)) {
            return null;
        }
        return val_;
    };
    DataSourceLocalDataProvider.prototype.setItemValue = function (a, b, c) {
        this.aj();
        var d;
        var e = this.s.tryGetValue(b, d);
        d = e.p1;
        if (d == null) {
            return;
        }
        d.setPropertyValue(a, c);
    };
    DataSourceLocalDataProvider.prototype.removeItem = function (a) {
        if (this.x != null) {
            var b = this.x.indexOf(a);
            if (this.q) {
                this.x.splice(b, 1);
            }
            else {
                this.x.removeAt(b);
            }
            this.notifyRemoveItem(b, a);
        }
    };
    DataSourceLocalDataProvider.prototype.addItem = function (a) {
        if (this.x != null) {
            var b = this.actualCount;
            if (this.q) {
                this.x.splice(b, 0, a);
            }
            else {
                this.x.insert(b, a);
            }
            this.notifyInsertItem(this.actualCount - 1, a);
        }
    };
    DataSourceLocalDataProvider.prototype.aj = function () {
        if (this.i == null) {
            this.i = this.actualSchema;
            if (this.schemaChanged != null) {
                this.schemaChanged(this, new DataSourceDataProviderSchemaChangedEventArgs(this.i, this.actualCount));
            }
        }
    };
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "actualCount", {
        get: function () {
            if (this.x == null) {
                return 0;
            }
            if (this.q) {
                return (this.x.length);
            }
            return this.x.count;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "actualSchema", {
        get: function () {
            if (this.i == null) {
                if (this.x == null) {
                    this.i = new DefaultDataSourceSchema([], [], null, null, []);
                }
                else {
                    this.i = this.k();
                }
            }
            return this.i;
        },
        enumerable: false,
        configurable: true
    });
    DataSourceLocalDataProvider.prototype.k = function () {
        var a = this.ab();
        if (a == null) {
            return new DefaultDataSourceSchema([], [], null, null, []);
        }
        this.s.clear();
        this.u.clear();
        return this.j(a, null, 0);
    };
    DataSourceLocalDataProvider.prototype.j = function (a, b, c) {
        var e_1, _a;
        if (c >= this.z) {
            return null;
        }
        if (a == null) {
            return null;
        }
        if ((typeof a === 'function')) {
            return null;
        }
        if ((Array.isArray(a))) {
            return null;
        }
        var check_ = a;
        if ((check_ instanceof HTMLElement)) {
            return null;
        }
        var d = new List$1(String_$type, 0);
        var e = new HashSet$1(String_$type, 0);
        var f = new List$1(DataSourceSchemaPropertyType_$type, 0);
        var g = new List$1(List$1.$.specialize(String_$type), 0);
        var h = this.v(a);
        var i = new List$1(IDataSourceSchema_$type, 0);
        for (var j = 0; j < h.count; j++) {
            var k = h._inner[j];
            if (stringStartsWith(k, "_")) {
                continue;
            }
            if (k == "$hashCode" || k == "$type") {
                continue;
            }
            if (e.contains(k)) {
                continue;
            }
            else {
                var l = b == null ? k : b + "." + k;
                d.add(k);
                e.add_1(k);
                this.s.addItem(l, new FastReflectionHelper(false, l));
                if (this.t.containsKey(l)) {
                    f.add(this.t.item(l));
                    this.t.removeItem(l);
                }
                else {
                    f.add(this.b(a, k));
                }
                g.add(this.w(a, k));
                if (f._inner[f.count - 1] == 11) {
                    i.add(this.j(a[k], l, c + 1));
                }
                else {
                    i.add(null);
                }
            }
        }
        try {
            for (var _b = __values(fromEnum(this.t)), _c = _b.next(); !_c.done; _c = _b.next()) {
                var m = _c.value;
                var n = m.key.split('.');
                for (var o = 0; o < n.length; o++) {
                    if (e.contains(n[o])) {
                        continue;
                    }
                    else {
                        d.add(n[o]);
                        e.add_1(n[o]);
                        f.add(o == n.length - 1 ? m.value : 11);
                        g.add(new List$1(String_$type, 0));
                    }
                }
            }
        }
        catch (e_1_1) {
            e_1 = { error: e_1_1 };
        }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return))
                    _a.call(_b);
            }
            finally {
                if (e_1)
                    throw e_1.error;
            }
        }
        var p = new Array(g.count);
        for (var q = 0; q < g.count; q++) {
            p[q] = g._inner[q].toArray();
        }
        return new DefaultDataSourceSchema(d.toArray(), f.toArray(), null, p, i.toArray());
    };
    DataSourceLocalDataProvider.prototype.resolveSchemaPropertyType = function (a) {
        var b = a.split('.');
        if (b.length == 1) {
            for (var c = 0; c < this.actualSchema.propertyNames.length; c++) {
                if (this.actualSchema.propertyNames[c] == b[0]) {
                    return this.actualSchema.propertyTypes[c];
                }
            }
            return 11;
        }
        else {
            var d = this.ab();
            var e = this.getItemValue(d, a);
            if (e == null) {
                return 11;
            }
            else {
                return DataSourceLocalDataProvider.d(e);
            }
        }
    };
    DataSourceLocalDataProvider.prototype.ar = function (a) {
        this.i = a;
        if (this.schemaChanged != null) {
            this.schemaChanged(this, new DataSourceDataProviderSchemaChangedEventArgs(this.i, this.actualCount));
        }
    };
    DataSourceLocalDataProvider.prototype.v = function (schemaItem_) {
        var propertyKey_ = null;
        var ret_ = new List$1(String_$type, 0);
        var exclusions_ = {};
        for (propertyKey_ in schemaItem_) {
            if (!isNaN(propertyKey_)) {
                continue;
            }
            if (!exclusions_.hasOwnProperty(propertyKey_)) {
                ret_.add(propertyKey_);
            }
        }
        ;
        return ret_;
    };
    DataSourceLocalDataProvider.prototype.al = function (a, item_, propertyName_, b) {
        if ((item_.__dataIntents !== undefined)) {
            if ((item_.__dataIntents[propertyName_] !== undefined)) {
                this.ak(a, item_, propertyName_);
            }
            var selfName_ = "self." + propertyName_;
            if (!b && (item_.__dataIntents[selfName_] !== undefined)) {
                this.ak(a, item_, selfName_);
            }
            var selfName2_ = "self_" + propertyName_;
            if (!b && (item_.__dataIntents[selfName2_] !== undefined)) {
                this.ak(a, item_, selfName2_);
            }
        }
    };
    DataSourceLocalDataProvider.prototype.ak = function (a, item_, propertyName_) {
        var val_ = item_.__dataIntents[propertyName_];
        var b = typeCast(Array_$type, val_) !== null;
        if (!b) {
            b = (Array.isArray(val_));
        }
        if (b) {
            var c = val_;
            for (var d = 0; d < c.length; d++) {
                if (c[d] != null) {
                    a.add(c[d].toString());
                }
            }
        }
    };
    DataSourceLocalDataProvider.prototype.w = function (item_, propertyName_) {
        var a = new List$1(String_$type, 0);
        var list_ = this.x;
        var dataIntents_ = null;
        this.al(a, item_, propertyName_, false);
        this.al(a, list_, propertyName_, true);
        return a;
    };
    DataSourceLocalDataProvider.prototype.b = function (item_, propertyName_) {
        if (item_ == null) {
            return 11;
        }
        if ((item_[propertyName_] == undefined)) {
            return 11;
        }
        var value_ = item_[propertyName_];
        return DataSourceLocalDataProvider.d(value_);
    };
    DataSourceLocalDataProvider.d = function (value_) {
        if (value_ == null) {
            return 11;
        }
        if ((typeof value_ == 'number')) {
            return 5;
        }
        if ((typeof value_ == 'boolean')) {
            return 2;
        }
        if ((typeof value_ == 'string')) {
            return 0;
        }
        if ((typeof value_ == 'object')) {
            if ((value_ instanceof Date)) {
                return 8;
            }
        }
        return 11;
    };
    DataSourceLocalDataProvider.prototype.ab = function () {
        var a = 0;
        if (this.q) {
            a = (this.x.length);
        }
        else {
            a = this.x.count;
        }
        for (var b = 0; b < a; b++) {
            var c = void 0;
            if (this.q) {
                c = this.x[b];
            }
            else {
                c = this.x.item(b);
            }
            if (c != null) {
                return c;
            }
        }
        return null;
    };
    DataSourceLocalDataProvider.prototype.am = function (a, b, c) {
        this.ao(a, b, c);
    };
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "y", {
        get: function () {
            return this.x;
        },
        enumerable: false,
        configurable: true
    });
    DataSourceLocalDataProvider.prototype.ao = function (a, b, c) {
        switch (a) {
            case "ItemsSource":
                this.i = null;
                if (this.dataSource != null) {
                    this.q = false;
                    if (typeCast(Array_$type, this.dataSource) !== null) {
                        this.q = true;
                        this.x = this.dataSource;
                    }
                    else if (typeCast(IList_$type, this.dataSource) !== null) {
                        this.x = this.dataSource;
                    }
                    if (!this.q && this.x == null) {
                        var source_ = this.dataSource;
                        this.q = (Array.isArray(source_));
                        if (this.q) {
                            this.x = this.dataSource;
                        }
                    }
                }
                else {
                    this.x = null;
                }
                this.aj();
                break;
            case "DeferAutoRefresh":
                if (!c) {
                    this.queueAutoRefresh();
                }
                break;
            case "SchemaHints":
                this.i = null;
                this.an();
                this.aj();
                break;
        }
    };
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "executionContext", {
        get: function () {
            return this.h;
        },
        set: function (a) {
            this.h = a;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "r", {
        get: function () {
            return false;
        },
        enumerable: false,
        configurable: true
    });
    DataSourceLocalDataProvider.prototype.notifySetItem = function (a, b, c) {
        if (this.r) {
            if (this.q) {
                this.x[a] = c;
            }
            else {
                this.x.item(a, c);
            }
        }
        if (this.updateNotifier != null) {
            this.updateNotifier.notifySetItem(a, b, c);
        }
    };
    DataSourceLocalDataProvider.prototype.notifyClearItems = function () {
        if (this.r) {
            if (this.q) {
                this.x.length = 0;
            }
            else {
                this.x.clear();
            }
        }
        if (this.updateNotifier != null) {
            this.updateNotifier.notifyClearItems();
        }
    };
    DataSourceLocalDataProvider.prototype.notifyInsertItem = function (a, b) {
        if (this.r) {
            if (this.q) {
                this.x.splice(a, 0, b);
            }
            else {
                this.x.insert(a, b);
            }
        }
        var c = 0;
        if (this.q) {
            c = (this.x.length);
        }
        else {
            c = this.x.count;
        }
        if (this.x != null && c == 1 && (this.actualSchema == null || this.actualSchema.propertyNames.length == 0)) {
            this.i = null;
            this.aj();
        }
        if (this.updateNotifier != null) {
            this.updateNotifier.notifyInsertItem(a, b);
        }
    };
    DataSourceLocalDataProvider.prototype.notifyRemoveItem = function (a, b) {
        if (this.r) {
            if (this.q) {
                this.x.splice(a, 1);
            }
            else {
                this.x.remove(a);
            }
        }
        if (this.updateNotifier != null) {
            this.updateNotifier.notifyRemoveItem(a, b);
        }
    };
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "updateNotifier", {
        get: function () {
            return this.g;
        },
        set: function (a) {
            this.g = a;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "deferAutoRefresh", {
        get: function () {
            return this.p;
        },
        set: function (a) {
            var b = this.p;
            this.p = a;
            if (this.p != b) {
                this.am("DeferAutoRefresh", b, this.p);
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "isSortingSupported", {
        get: function () {
            return false;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "isFilteringSupported", {
        get: function () {
            return false;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "sortDescriptions", {
        get: function () {
            return this.m;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "filterExpressions", {
        get: function () {
            return this.f;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "summaryDescriptions", {
        get: function () {
            return this.n;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "summaryScope", {
        get: function () {
            return this.e;
        },
        set: function (a) {
            this.e = a;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "notifyUsingSourceIndexes", {
        get: function () {
            return true;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "propertiesRequested", {
        get: function () {
            return this.a;
        },
        set: function (a) {
            var b = this.a;
            this.a = a;
            if (b != this.a) {
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "isItemIndexLookupSupported", {
        get: function () {
            return true;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "isKeyIndexLookupSupported", {
        get: function () {
            return false;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "isGroupingSupported", {
        get: function () {
            return false;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(DataSourceLocalDataProvider.prototype, "groupDescriptions", {
        get: function () {
            return this.l;
        },
        enumerable: false,
        configurable: true
    });
    DataSourceLocalDataProvider.prototype.queueAutoRefresh = function () {
        if (this.deferAutoRefresh) {
            return;
        }
        if (this.o) {
            return;
        }
        if (this.executionContext != null) {
            this.o = true;
            this.executionContext.enqueueAction(runOn(this, this.ai));
        }
    };
    DataSourceLocalDataProvider.prototype.ai = function () {
        if (this.deferAutoRefresh) {
            this.o = false;
            return;
        }
        if (!this.o) {
            return;
        }
        this.o = false;
        this.ap();
    };
    DataSourceLocalDataProvider.prototype.ap = function () {
        this.aq();
    };
    DataSourceLocalDataProvider.prototype.aq = function () {
    };
    DataSourceLocalDataProvider.prototype.flushAutoRefresh = function () {
        this.ai();
    };
    DataSourceLocalDataProvider.prototype.refresh = function () {
        this.ap();
    };
    DataSourceLocalDataProvider.prototype.indexOfItem = function (a) {
        if (this.x == null) {
            return -1;
        }
        return this.x.indexOf(a);
    };
    DataSourceLocalDataProvider.prototype.indexOfKey = function (a) {
        return -1;
    };
    DataSourceLocalDataProvider.$t = markType(DataSourceLocalDataProvider, 'DataSourceLocalDataProvider', Base.$, [IDataSourceLocalDataProvider_$type]);
    return DataSourceLocalDataProvider;
}(Base));
export { DataSourceLocalDataProvider };
