/*
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 { ScatterBase } from "./ScatterBase";
import { UnknownValuePlotting_$type } from "igniteui-angular-core";
import { DependencyProperty } from "igniteui-angular-core";
import { Point_$type, typeCast, runOn, Number_$type, enumGetBox, markType, markDep } from "igniteui-angular-core";
import { OwnedPoint } from "./OwnedPoint";
import { ScatterFrame } from "./ScatterFrame";
import { ScatterLineSeriesView } from "./ScatterLineSeriesView";
import { Defaults } from "./Defaults";
import { PathGeometry } from "igniteui-angular-core";
import { Rect } from "igniteui-angular-core";
import { ScalerParams } from "./ScalerParams";
import { Clipper } from "igniteui-angular-core";
import { List$1 } from "igniteui-angular-core";
import { RectUtil } from "igniteui-angular-core";
import { PolyLineSegment } from "igniteui-angular-core";
import { PathFigure } from "igniteui-angular-core";
import { PathFigureCollection } from "igniteui-angular-core";
import { Flattener } from "igniteui-angular-core";
import { PropertyMetadata } from "igniteui-angular-core";
import { boxArray$1, arrayShallowClone } from "igniteui-angular-core";
import { isNaN_ } from "igniteui-angular-core";
/**
 * @hidden
 */
export let ScatterLineSeries = /*@__PURE__*/ (() => {
    class ScatterLineSeries extends ScatterBase {
        constructor() {
            super();
            this.ab = ScatterLineSeries.$;
            this.y2 = new ScatterFrame();
            this.y4 = new ScatterFrame();
            this.y0 = new ScatterFrame();
            let a = (b, c, d) => {
                let e = this.dn.indexOf(b.a);
                if (e == -1 || e == 0) {
                    return b;
                }
                let f = this.dn.item(e - 1);
                let g;
                if (!((() => { let h = c.g.tryGetValue(f, g); g = h.p1; return h.ret; })())) {
                    return b;
                }
                return g;
            };
            this.y2.o = a;
            this.y4.o = a;
            this.y0.o = a;
        }
        bj() {
            return new ScatterLineSeries();
        }
        get_fk() {
            return true;
        }
        cs() {
            return new ScatterLineSeriesView(this);
        }
        zw() {
            return true;
        }
        jk() {
            if (!isNaN_(this.jj)) {
                return super.jk();
            }
            return Defaults.x;
        }
        gw(a, b) {
            if (this.xh(a, b)) {
                return true;
            }
            if (this.aco(a, b)) {
                return true;
            }
            return false;
        }
        aco(a, b) {
            let c = this.cv;
            let d = c.dl;
            return this.gx(a, b, d.an);
        }
        abf(a, b) {
            super.abf(a, b);
            a.m.clear();
            a.u.clear();
            let c = b.by;
            let d = b.bx;
            let e = this.getEffectiveViewport1(b);
            let f = this.id * this.id;
            let g = 0;
            if (this.zh != null) {
                g = this.zh.count;
            }
            if (this.zi != null) {
                g = Math.min(this.zi.count, g);
            }
            let h = new ScalerParams(0, c, d, this.yw.d, e);
            let i = ((() => {
                let $ret = new ScalerParams(0, c, d, this.yw.e, e);
                $ret.b = this.iy();
                return $ret;
            })());
            let j = arrayShallowClone(this.zh.asArray());
            let k = arrayShallowClone(this.zi.asArray());
            this.xAxis.hq(boxArray$1(j), 0, j.length, h);
            this.yAxis.hq(boxArray$1(k), 0, k.length, i);
            let l = d.top - 10;
            let m = d.bottom + 10;
            let n = d.left - 10;
            let o = d.right + 10;
            let p = ((() => {
                let $ret = new Clipper(1, n, m, o, l, false);
                $ret.i = a.m;
                return $ret;
            })());
            for (let q = 0; q < g;) {
                let r = q;
                ++q;
                if (g > this.z9) {
                    while (q < g) {
                        let s = j[q] - j[r];
                        let t = k[q] - k[r];
                        let u = s * s + t * t;
                        if (isNaN_(u) || u >= f) {
                            break;
                        }
                        ++q;
                    }
                    p.j(this.acv(j, k, r, q - 1));
                }
                else {
                    let v = new OwnedPoint();
                    v.c = { $type: Point_$type, x: j[r], y: k[r] };
                    v.a = this.dn.item(r);
                    if (!a.u.containsKey(v.a)) {
                        a.u.addItem(v.a, v);
                    }
                }
            }
            if (g > this.z9) {
                p.i = null;
            }
        }
        acv(a, b, c, d) {
            if (c == d) {
                return { $type: Point_$type, x: a[c], y: b[c] };
            }
            let e = 0;
            let f = 0;
            let g = (d - c + 1);
            for (let h = c; h <= d; ++h) {
                e += a[h];
                f += b[h];
            }
            return { $type: Point_$type, x: e / g, y: f / g };
        }
        get_zq() {
            return true;
        }
        abq(a, b) {
            b.c9(false);
            super.abq(a, b);
            let c = this.getEffectiveViewport1(b);
            let d = new Rect(0, b.bx.left, b.bx.top, b.bx.width, b.bx.height);
            d = RectUtil.t(d, this.ie, this.ie);
            this.abj(a, new Clipper(0, d, false));
            let e = typeCast(ScatterLineSeriesView.$, b);
            this.y9.az(this, this.zv(), runOn(this, this.yp));
            let f = false;
            let g = this.y9.b;
            if (g != null) {
                f = true;
            }
            if (f) {
                this.abb(-1, this.zh.count, b.q);
            }
            this.y9.ad(e.dl, true, false, true, false);
            this.act(e.dl, a.m.count, (h) => a.m._inner[h].x, (h) => a.m._inner[h].y, this.acn, this.id);
        }
        act(a, b, c, d, e, f) {
            let g = new PathGeometry();
            a.an = g;
            g.c = new PathFigureCollection();
            let h = new List$1(PolyLineSegment.$, 0);
            let i = 0;
            for (let j = 0; j < b; j++) {
                if (isNaN_(c(j)) || isNaN_(d(j))) {
                    let k = j - i;
                    if (k > 0) {
                        if (e == 1 || h.count == 0) {
                            let l = new PolyLineSegment();
                            h.add(l);
                        }
                        this.acs(h._inner[h.count - 1]._points, i, j - 1, c, d, f);
                    }
                    i = j + 1;
                }
            }
            if (e == 1 || h.count == 0) {
                let m = new PolyLineSegment();
                h.add(m);
            }
            this.acs(h._inner[h.count - 1]._points, i, b - 1, c, d, f);
            for (let n = 0; n < h.count; n++) {
                let o = h._inner[n];
                if (o._points.count > 0) {
                    let p = ((() => {
                        let $ret = new PathFigure();
                        $ret.startPoint = o._points._inner[0];
                        return $ret;
                    })());
                    p._segments.add(o);
                    g.c.add(p);
                }
            }
        }
        acp(a, b, c, d, e, f) {
            let g = new List$1(Number_$type, 0);
            let h = d;
            let i = e;
            let j = i - h + 1;
            while (j > 0) {
                if (j <= 512) {
                    Flattener.c(g, b, c, h, i, f);
                    h = i + 1;
                }
                else {
                    let k = h + 512 - 1;
                    Flattener.c(g, b, c, h, k, f);
                    h = k + 1;
                }
                j = i - h + 1;
            }
            return g;
        }
        acs(a, b, c, d, e, f) {
            if (c > -1) {
                let g = !isNaN_(this.jj) ? f : 1;
                let h = this.acp(new List$1(Number_$type, 0), d, e, b, c, g);
                let i;
                for (let j = 0; j < h.count; j++) {
                    i = h.item(j);
                    a.add({ $type: Point_$type, x: d(i), y: e(i) });
                }
            }
        }
        q9(a, b, c, d) {
            super.q9(a, b, c, d);
            switch (b) {
                case ScatterLineSeries.$$p[0]:
                    this.rr(false);
                    this.ql();
                    break;
            }
        }
    }
    ScatterLineSeries.$t = markType(ScatterLineSeries, 'ScatterLineSeries', ScatterBase.$);
    ScatterLineSeries.$$p = markDep(DependencyProperty, PropertyMetadata, ScatterLineSeries, 'raisePropertyChanged', ['UnknownValuePlotting:acn:acu', [UnknownValuePlotting_$type, enumGetBox(UnknownValuePlotting_$type, 1)]]);
    return ScatterLineSeries;
})();
