/*
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 } from "tslib";
import { HorizontalAnchoredCategorySeries } from "./HorizontalAnchoredCategorySeries";
import { DependencyProperty } from "igniteui-angular-core";
import { SplineType_$type } from "./SplineType";
import { AxisRange } from "./AxisRange";
import { Array_$type, typeCast, Point_$type, enumGetBox, markType, markDep } from "igniteui-angular-core";
import { List$1 } from "igniteui-angular-core";
import { Rect } from "igniteui-angular-core";
import { CategoryAxisBase } from "./CategoryAxisBase";
import { ISortingAxis_$type } from "./ISortingAxis";
import { CollisionAvoider } from "./CollisionAvoider";
import { AnchoredCategorySeriesView } from "./AnchoredCategorySeriesView";
import { ScalerParams } from "./ScalerParams";
import { SafeSortedReadOnlyDoubleCollection } from "./SafeSortedReadOnlyDoubleCollection";
import { Numeric } from "igniteui-angular-core";
import { ChartSelection } from "./ChartSelection";
import { PropertyMetadata } from "igniteui-angular-core";
import { truncate, isNaN_ } from "igniteui-angular-core";
import { Color } from "igniteui-angular-core";
/**
 * @hidden
 */
var SplineSeriesBase = /** @class */ /*@__PURE__*/ (function (_super) {
    __extends(SplineSeriesBase, _super);
    function SplineSeriesBase() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.ada = null;
        _this.adg = NaN;
        _this.adf = NaN;
        return _this;
    }
    SplineSeriesBase.prototype.jn = function () {
        if (!isNaN_(this.jm)) {
            return _super.prototype.jn.call(this);
        }
        return this.adb.du();
    };
    SplineSeriesBase.prototype.ct = function () {
        return new SplineSeriesBaseView(this);
    };
    SplineSeriesBase.prototype.q7 = function (a) {
        _super.prototype.q7.call(this, a);
        this.adb = a;
    };
    SplineSeriesBase.prototype.sc = function (a) {
        _super.prototype.sc.call(this, a);
        this.add = true;
    };
    SplineSeriesBase.prototype.ay = function (a) {
        if (!this.add || this.ada == null || this.ada.length == 0) {
            return _super.prototype.ay.call(this, a);
        }
        if (this.valueColumn == null || this.valueColumn.count == 0) {
            return null;
        }
        if (a == this.fetchXAxis()) {
            return new AxisRange(0, this.valueColumn.count - 1);
        }
        this.adn(this.adb);
        if (this.ada == null || this.ada.length == 0) {
            return null;
        }
        if (a == this.fetchYAxis()) {
            if (isNaN_(this.adj) || isNaN_(this.adk)) {
                return null;
            }
            return new AxisRange(this.adk, this.adj);
        }
        return null;
    };
    SplineSeriesBase.prototype.get_ex = function () {
        return true;
    };
    SplineSeriesBase.prototype.ac8 = function (a) {
        var _this = this;
        if (a.c9.d == 0) {
            return null;
        }
        var b = new List$1(Array_$type, 0);
        var c = a.ca;
        var d = a.b9;
        var e = this.getEffectiveViewport1(a);
        var f = 0;
        var g = 0;
        var h = 0;
        var i = this;
        var j = typeCast(CategoryAxisBase.$, i.fetchXAxis());
        var k = i.wt(this.cw);
        var l = i.dp;
        if (c.isEmpty || d.isEmpty || j == null || l == null || l.count == 0) {
            f = 0;
            return null;
        }
        var m = this.ie;
        var n = typeCast(ISortingAxis_$type, j);
        if (n == null || n.i$b == null) {
            var o = new ScalerParams(0, c, d, j.df, e);
            var p = 0;
            var q = j.o6 - 1;
            var r = Math.floor((q - p + 1) * m / k.width);
            f = truncate(Math.max(1, r));
            g = truncate(Math.max(0, Math.floor(p / f) - 1));
            h = truncate(Math.ceil(q / f));
        }
        else {
            g = 0;
            h = j.o6 - 1;
            f = 1;
        }
        if (n != null && n.i$b.count != this.dp.count) {
            return null;
        }
        this.adn(a);
        var s = truncate(Math.ceil(d.width / (h - g)));
        var t = new CollisionAvoider();
        if (n != null) {
            return this.ac9(a);
        }
        var u = function (v) { return v; };
        var v = function (w) { return _this.valueColumn.item(w); };
        var w = a;
        w.dp();
        for (var x = g; x <= h; ++x) {
            var y = null;
            if (f == 1) {
                if (x >= (this.valueColumn.count - 1)) {
                    break;
                }
                var z = u(x);
                var aa = v(x);
                var ab = u(x + 1);
                var ac = v(x + 1);
                var ad = ab - z;
                var ae = this.ada[x];
                var af = this.ada[x + 1];
                b.add([aa, ac]);
                for (var ag = 1; ag < s; ++ag) {
                    var ah = z + ad * ag / s;
                    var ai = (ab - ah) / ad;
                    var aj = (ah - z) / ad;
                    var ak = ai * aa + aj * ac + ((ai * ai * ai - ai) * ae + (aj * aj * aj - aj) * af) * (ad * ad) / 6;
                    b.add([ak, ak]);
                }
            }
            else {
                y = a.c9.getBucket(x);
                if (!isNaN_(y[0])) {
                    b.add([y[1], y[2]]);
                }
            }
        }
        w.dr();
        return b.toArray();
    };
    SplineSeriesBase.prototype.ac9 = function (a) {
        var _this = this;
        var b = typeCast(ISortingAxis_$type, this.acp);
        var c = this.getEffectiveViewport1(a);
        var d = a.ca;
        var e = a.b9;
        var f = new List$1(Array_$type, 0);
        if (b == null) {
            return null;
        }
        var g = this.acp;
        var h = 0;
        var i = 0;
        var j = 0;
        var k = this.ie;
        var l = this.wt(this.cw);
        if (b == null || b.i$b == null) {
            var m = new ScalerParams(0, d, e, g.df, c);
            var n = 0;
            var o = g.o6 - 1;
            var p = Math.floor((o - n + 1) * k / l.width);
            h = truncate(Math.max(1, p));
            i = truncate(Math.max(0, Math.floor(n / h) - 1));
            j = truncate(Math.ceil(o / h));
        }
        else {
            i = 0;
            j = g.o6 - 1;
            h = 1;
        }
        var q = function (r) { return r; };
        var r = function (s) { return _this.valueColumn.item(b.i$b._inner[s]); };
        var s = truncate(Math.ceil(e.width / (j - i)));
        var t = new CollisionAvoider();
        if (h <= 0 || (i <= 0 && j <= 0)) {
            return null;
        }
        for (var u = i; u < j + 1; ++u) {
            var v = null;
            var w = u * h;
            if (b != null && b.i$b != null && w >= 0 && w < b.i$b.count) {
                w = b.i$b._inner[w];
            }
            if (u >= (this.valueColumn.count - 1)) {
                break;
            }
            var x = q(u);
            var y = r(u);
            var z = q(u + 1);
            var aa = r(u + 1);
            var ab = z - x;
            var ac = this.ada[u];
            var ad = this.ada[u + 1];
            f.add([y, y]);
            for (var ae = 1; ae < s; ++ae) {
                var af = ae / s;
                var ag = x + ab * af;
                var ah = (z - ag) / ab;
                var ai = (ag - x) / ab;
                var aj = ah * y + ai * aa + ((ah * ah * ah - ah) * ac + (ai * ai * ai - ai) * ad) * (ab * ab) / 6;
                f.add([aj, aj]);
            }
        }
        return f.toArray();
    };
    SplineSeriesBase.prototype.ado = function (a, b, c, d, e, f) {
        var _this = this;
        var g = typeCast(ISortingAxis_$type, d);
        var h = this.getEffectiveViewport1(f);
        if (g == null) {
            return;
        }
        var i = new ScalerParams(0, b, c, d.df, h);
        var j = new ScalerParams(0, b, c, e.df, h);
        j.b = this.i0();
        var k = this.xq();
        var l = 0;
        var m = this.adi(d, b, c, h);
        var n = function (o) { return o; };
        var o = function (p) { return _this.valueColumn.item(g.i$b._inner[p]); };
        var p = this.zd.c9.f;
        var q = this.zd.c9.e;
        var r = truncate(Math.ceil(c.width / (p - q)));
        var s = new CollisionAvoider();
        var t = this.zd.c9.d;
        if (t <= 0 || (q <= 0 && p <= 0)) {
            this.zd.dc.count = l;
            return;
        }
        var u = 0;
        var v = 0;
        for (var w = q; w < p + 1; ++w) {
            var x = null;
            var y = w * t;
            if (g != null && g.i$b != null && y >= 0 && y < g.i$b.count) {
                y = g.i$b._inner[y];
            }
            if (w >= (this.valueColumn.count - 1)) {
                if (k && this.ade(a, a.h._inner[a.h.count - 1], s, Math.min(y, this.dp.count - 1), l, f, u - 1)) {
                    ++l;
                }
                break;
            }
            var z = n(w);
            var aa = o(w);
            var ab = n(w + 1);
            var ac = o(w + 1);
            var ad = ab - z;
            var ae = this.ada[w];
            var af = this.ada[w + 1];
            var ag = g.i$d(g.i$b._inner[w]);
            var ah = d.ft(ag, i) + m;
            var ai = e.ft(aa, j);
            a.h.add([ah, ai, ai]);
            u++;
            v = u;
            for (var aj = 1; aj < r; ++aj) {
                var ak = aj / r;
                var al = z + ad * ak;
                var am = (ab - al) / ad;
                var an = (al - z) / ad;
                var ao = am * aa + an * ac + ((am * am * am - am) * ae + (an * an * an - an) * af) * (ad * ad) / 6;
                var ap = g.i$d(g.i$b._inner[w]);
                var aq = g.i$d(g.i$b._inner[w + 1]);
                var ar = ap + (aq - ap) * ak;
                al = d.ft(ar, i) + m;
                ao = e.ft(ao, j);
                a.h.add([al, ao, ao]);
                u++;
            }
            if (k) {
                x = [ah, ai, ai];
            }
            if (k && this.ade(a, x, s, Math.min(y, this.dp.count - 1), l, f, v - 1)) {
                ++l;
            }
        }
        f.dc.count = l;
    };
    SplineSeriesBase.prototype.ade = function (a, b, c, d, e, f, g) {
        var h = b[0];
        var i = b[1];
        var j = new Rect(0, h - 5, i - 5, 11, 11);
        if (!isNaN_(h) && !isNaN_(i) && c.tryAdd(j)) {
            a.p.add({ $type: Point_$type, x: h, y: i });
            var k = f.dc.item(e);
            k.content.item = this.dp.item(d);
            k.al = g;
            k.ak = d;
            return true;
        }
        return false;
    };
    SplineSeriesBase.prototype.an = function (a, b, c, d, e, f) {
        if (a == null || a.dm || this.z5(this.cw) > 1 || this.z5(this.cw) == 0) {
            return _super.prototype.an.call(this, this.y2(), this.y4.h, this.z5(this.cw), this.z6(this.cw), e, f);
        }
        if (this.y4.h.count == 0) {
            return null;
        }
        var g = this.adb.c9.f;
        var h = this.cw.b9;
        var i = truncate(Math.ceil(h.width));
        if (g != d) {
            i = truncate(Math.ceil(h.width / (g - d)));
        }
        var j = -1;
        var k = -1;
        var l = this.it(e);
        var m = this.ke(e, f);
        var n = this.kc(e, f);
        var o = truncate(Math.floor(m / this.z5(this.cw)));
        var p = truncate(Math.floor(n / this.z5(this.cw)));
        j = o - this.z6(this.cw);
        k = p - this.z6(this.cw);
        var q = j * i;
        var r = k * i;
        var s = 0;
        if (m != n) {
            s = (l - m) / (n - m);
        }
        var t = truncate(Math.floor(q + s * (r - q)));
        j = t;
        k = t + 1;
        if (j < 0) {
            j = 0;
        }
        if (j > this.y4.h.count - 1) {
            j = this.y4.h.count - 1;
        }
        if (k < 0) {
            k = 0;
        }
        if (k > this.y4.h.count - 1) {
            k = this.y4.h.count - 1;
        }
        var u = this.y4.h._inner[j];
        var v = this.y4.h._inner[k];
        var w = new Array(2);
        w[0] = u;
        w[1] = v;
        return w;
    };
    SplineSeriesBase.prototype.aau = function (a, b) {
        var _this = this;
        _super.prototype.aau.call(this, a, b);
        if (a.h.count <= 1) {
            return;
        }
        if (b.c9.d == 0) {
            return;
        }
        var c = b.ca;
        var d = b.b9;
        var e = this.getEffectiveViewport1(b);
        var f = this.acp;
        var g = this.acv;
        var h = new ScalerParams(0, c, d, f.df, e);
        var i = ((function () {
            var $ret = new ScalerParams(0, c, d, g.df, e);
            $ret.b = _this.i0();
            return $ret;
        })());
        a.h.clear();
        a.p.clear();
        var j = this.xq();
        var k = 0;
        var l = typeCast(ISortingAxis_$type, this.acp);
        if (l != null && l.i$b.count != this.dp.count) {
            return;
        }
        var m = this.adi(f, c, d, e);
        var n = b.c9.d;
        this.adn(b);
        var o = b.c9.f;
        var p = b.c9.e;
        var q = truncate(Math.ceil(d.width / (o - p)));
        var r = new CollisionAvoider();
        if (l != null) {
            this.ado(a, c, d, f, g, b);
            return;
        }
        var s = function (t) { return t; };
        var t = function (u) { return _this.valueColumn.item(u); };
        var u = b;
        u.dp();
        var v = 0;
        var w = 0;
        for (var x = p; x <= o; ++x) {
            var y = null;
            if (n == 1) {
                if (x >= (this.valueColumn.count - 1)) {
                    if (j && this.ade(a, a.h._inner[a.h.count - 1], r, Math.min(x * n, this.dp.count - 1), k, b, v - 1)) {
                        ++k;
                    }
                    break;
                }
                var z = s(x);
                var aa = t(x);
                var ab = s(x + 1);
                var ac = t(x + 1);
                var ad = ab - z;
                var ae = this.ada[x];
                var af = this.ada[x + 1];
                var ag = f.ft(z, h) + m;
                var ah = g.ft(aa, i);
                a.h.add([ag, ah, ah]);
                v++;
                w = v;
                for (var ai = 1; ai < q; ++ai) {
                    var aj = z + ad * ai / q;
                    var ak = (ab - aj) / ad;
                    var al = (aj - z) / ad;
                    var am = ak * aa + al * ac + ((ak * ak * ak - ak) * ae + (al * al * al - al) * af) * (ad * ad) / 6;
                    aj = f.ft(aj, h) + m;
                    am = g.ft(am, i);
                    a.h.add([aj, am, am]);
                    v++;
                }
                if (j) {
                    y = b.c9.getBucket(x);
                    y[0] = (f.ft(y[0], h) + m);
                    y[1] = g.ft(y[1], i);
                    y[2] = g.ft(y[2], i);
                }
            }
            else {
                y = b.c9.getBucket(x);
                if (!isNaN_(y[0])) {
                    y[0] = (f.ft(y[0], h) + m);
                    y[1] = g.ft(y[1], i);
                    y[2] = g.ft(y[2], i);
                    a.h.add(y);
                    v++;
                    w = v;
                }
            }
            if (j && this.ade(a, y, r, Math.min(x * n, this.dp.count - 1), k, b, w - 1)) {
                ++k;
            }
        }
        u.dr();
        b.dc.count = k;
    };
    SplineSeriesBase.prototype.adn = function (a) {
        var _this = this;
        var b = a.c9.d;
        var c = function (d) { return d; };
        var d = function (e) { return _this.valueColumn.item(e); };
        if (b < 1 || this.valueColumn == null || this.valueColumn.count == 0) {
            return;
        }
        if ((this.ada == null || this.ada.length != this.valueColumn.count) && b == 1) {
            var e = this.adc == 0 ? NaN : 0;
            if (this.acp != null && typeCast(ISortingAxis_$type, this.acp) !== null && this.acp.i$b != null) {
                var f_1 = new SafeSortedReadOnlyDoubleCollection(1, this.valueColumn, this.acp.i$b, NaN);
                d = function (g) { return f_1.item(g); };
            }
            this.ada = Numeric.c(this.valueColumn.count, c, d, e, e);
            if (this.add) {
                var g = -1.7976931348623157E+308;
                var h = 1.7976931348623157E+308;
                var i = this.ac8(a);
                if (i == null) {
                    return;
                }
                for (var j = 0; j < i.length; j++) {
                    if (isNaN_(i[j][0]) || isNaN_(i[j][1])) {
                        continue;
                    }
                    if (i[j][1] > g) {
                        g = i[j][1];
                    }
                    if (i[j][0] < h) {
                        h = i[j][0];
                    }
                }
                this.adk = h;
                this.adj = g;
            }
        }
    };
    SplineSeriesBase.prototype.adh = function (a, b, c, d, e, f, g) {
        var h = d - b;
        var i = b + h * a;
        var j = (d - i) / h;
        var k = (i - b) / h;
        var l = j * c + k * e + ((j * j * j - j) * f + (k * k * k - k) * g) * (h * h) / 6;
        return l;
    };
    SplineSeriesBase.prototype.ix = function (a, b, c, d, e, f, g, h) {
        var i = NaN;
        if (c >= 0 && c < b.count) {
            i = b.item(c);
        }
        var j = NaN;
        if (d >= 0 && d < b.count) {
            j = b.item(d);
        }
        if (f == 0) {
            return j;
        }
        if (e == b.count - 1) {
            return i;
        }
        if (isNaN_(j) && g != 0 && a <= 0.5 && !h) {
            return i;
        }
        if (isNaN_(i) && g != 0 && a >= 0.5 && !h) {
            return j;
        }
        var k = e;
        var l = f;
        var m = i;
        var n = j;
        var o = NaN;
        var p = NaN;
        if (this.ada != null && e >= 0 && e < this.ada.length) {
            o = this.ada[e];
        }
        if (this.ada != null && f >= 0 && f < this.ada.length) {
            p = this.ada[f];
        }
        return this.adh(a, k, m, l, n, o, p);
    };
    SplineSeriesBase.prototype.adi = function (a, b, c, d) {
        var e = this.preferredCategoryMode(a);
        if (e == 0 && a.categoryMode != 0) {
            e = 1;
        }
        var f = 0;
        switch (e) {
            case 0:
                f = 0;
                break;
            case 1:
                f = 0.5 * a.getCategorySize(b, c, d);
                break;
            case 2:
                f = a.getGroupCenter(this.index, b, c, d);
                break;
        }
        if (a.df) {
            f = -f;
        }
        return f;
    };
    Object.defineProperty(SplineSeriesBase.prototype, "adk", {
        get: function () {
            return this.adg;
        },
        set: function (a) {
            this.adg = a;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(SplineSeriesBase.prototype, "adj", {
        get: function () {
            return this.adf;
        },
        set: function (a) {
            this.adf = a;
        },
        enumerable: false,
        configurable: true
    });
    SplineSeriesBase.prototype.adp = function () {
        this.ada = null;
        this.adk = NaN;
        this.adj = NaN;
        if (this.yAxis != null) {
            this.yAxis.d2();
        }
    };
    SplineSeriesBase.prototype.rg = function (a, b, c, d) {
        switch (b) {
            case "ValueColumn":
            case "FastItemsSource":
                this.adp();
                break;
        }
        _super.prototype.rg.call(this, a, b, c, d);
        switch (b) {
            case SplineSeriesBase.$$p[1]:
                this.adp();
                this.ry(false);
                this.qr();
                break;
        }
    };
    SplineSeriesBase.prototype.ph = function (a, b, c, d) {
        this.adp();
        _super.prototype.ph.call(this, a, b, c, d);
    };
    SplineSeriesBase.prototype.qa = function (a, b, c) {
        this.aap(a, b, c, this.y3, 0);
    };
    SplineSeriesBase.prototype.ak = function (a, b) {
        var c = new List$1(ChartSelection.$, 0);
        this.qa(a, c, b);
        return c.toArray();
    };
    SplineSeriesBase.prototype.aam = function (a, b, c, d, e) {
        var f = this.aan(a, b, c, d, e);
        d = f.p3;
        e = f.p4;
        return {
            p3: d,
            p4: e
        };
    };
    Object.defineProperty(SplineSeriesBase.prototype, "useHighMarkerFidelity", {
        get: function () {
            return this.z0;
        },
        enumerable: false,
        configurable: true
    });
    SplineSeriesBase.$t = markType(SplineSeriesBase, 'SplineSeriesBase', HorizontalAnchoredCategorySeries.$);
    SplineSeriesBase.$$p = markDep(DependencyProperty, PropertyMetadata, SplineSeriesBase, 'raisePropertyChanged', ['IsSplineShapePartOfRange:add:adq', [0, false], 'SplineType:adc:adr', [SplineType_$type, enumGetBox(SplineType_$type, 0)]]);
    return SplineSeriesBase;
}(HorizontalAnchoredCategorySeries));
export { SplineSeriesBase };
/**
 * @hidden
 */
var SplineSeriesBaseView = /** @class */ /*@__PURE__*/ (function (_super) {
    __extends(SplineSeriesBaseView, _super);
    function SplineSeriesBaseView(a) {
        var _this = _super.call(this, a) || this;
        _this.dt = null;
        _this.dt = a;
        return _this;
    }
    SplineSeriesBaseView.prototype.du = function () {
        var a = 1;
        if (this.dt.dc != null) {
            a = this.dt.dc.h2;
        }
        return Math.max(1 / (a * 3), 0.3);
    };
    SplineSeriesBaseView.prototype.an = function () {
        var a = new Color();
        a.colorString = "rgba(95,95,95,0.5)";
        this.f.wb = a;
        this.f.jq = 3;
        this.f.jr = 1;
        this.f.js = 4;
        this.f.hd = false;
    };
    SplineSeriesBaseView.$t = markType(SplineSeriesBaseView, 'SplineSeriesBaseView', AnchoredCategorySeriesView.$);
    return SplineSeriesBaseView;
}(AnchoredCategorySeriesView));
export { SplineSeriesBaseView };
