/*
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 { AnnotationLayer } from "./AnnotationLayer";
import { DependencyProperty } from "igniteui-angular-core";
import { Series } from "./Series";
import { Brush } from "igniteui-angular-core";
import { ItemTooltipLayerFrame } from "./ItemTooltipLayerFrame";
import { Base, String_$type, fromEnum, Point_$type, markType, markDep, runOn } from "igniteui-angular-core";
import { Pool$1 } from "igniteui-angular-core";
import { List$1 } from "igniteui-angular-core";
import { ItemTooltipCollisionInfo } from "./ItemTooltipCollisionInfo";
import { Rect } from "igniteui-angular-core";
import { DataContext } from "igniteui-angular-core";
import { Size } from "igniteui-angular-core";
import { DeviceUtils } from "igniteui-angular-core";
import { PropertyMetadata } from "igniteui-angular-core";
import { isNaN_ } from "igniteui-angular-core";
import { AnnotationLayerView } from "./AnnotationLayerView";
import { PointerTooltip } from "./PointerTooltip";
import { PointerTooltipStyle } from "./PointerTooltipStyle";
import { PointerTooltipUtils } from "./PointerTooltipUtils";
/**
 * @hidden
 */
export let ItemToolTipLayer = /*@__PURE__*/ (() => {
    class ItemToolTipLayer extends AnnotationLayer {
        constructor() {
            super();
            let a = new ItemTooltipLayerFrame();
            let b = new ItemTooltipLayerFrame();
            let c = new ItemTooltipLayerFrame();
            let d = this.kh / 1000;
            this.xm = a;
            this.xl = b;
            this.xn = c;
            this.ab = ItemToolTipLayer.$;
        }
        bk() {
            return new ItemToolTipLayer();
        }
        get_et() {
            return true;
        }
        ct() {
            return new ItemToolTipLayerView(this);
        }
        q7(a) {
            super.q7(a);
            this.aaf = a;
        }
        get_e4() {
            return true;
        }
        gv(a) {
            if (this.aag == null) {
                return true;
            }
            if (this.aag == a) {
                return true;
            }
            return false;
        }
        rg(a, b, c, d) {
            super.rg(a, b, c, d);
            switch (b) {
                case ItemToolTipLayer.$$p[1]:
                case ItemToolTipLayer.$$p[2]:
                    this.ry(true);
                    break;
                case ItemToolTipLayer.$$p[6]:
                    this.ry(true);
                    break;
                case ItemToolTipLayer.$$p[0]:
                    this.ry(true);
                    break;
                case "SeriesViewer":
                    this.aaf.cz();
                    break;
                case ItemToolTipLayer.$$p[3]:
                case ItemToolTipLayer.$$p[4]:
                case ItemToolTipLayer.$$p[5]:
                    this.ry(true);
                    break;
            }
        }
        y1(a, b) {
            if (this.aag == null || this.aag == a) {
                if (!this.a1.c) {
                    this.ry(b);
                }
            }
        }
        xs(a) {
            if (!super.xs(a)) {
                return false;
            }
            if (this.aan != null) {
                if (a.isFragment) {
                    let b = a.nh();
                    if (!Base.equalsStatic(this.aan, b)) {
                        return false;
                    }
                }
                else {
                    if (!Base.equalsStatic(this.aan, a.name)) {
                        return false;
                    }
                }
            }
            let c = this.yw(a);
            if (!c.c) {
                return false;
            }
            return true;
        }
        y3(a, b) {
            super.y3(a, b);
            let c = a;
            let d = this.aaf.co;
            let e = this.aaj;
            let f = this.aai;
            c.o.clear();
            c.i.clear();
            c.n.clear();
            c.g.clear();
            c.f.clear();
            c.l.clear();
            c.j.clear();
            c.m.clear();
            c.k.clear();
            c.h.clear();
            if (isNaN_(this.aac.x) && isNaN_(this.aac.y)) {
                d.count = 0;
                return;
            }
            let g = 0;
            if (this.xs(this.aag)) {
                this.aav(this.aag, c, e, f, 0);
                g++;
            }
            else {
                for (let h of fromEnum(this.dc.series)) {
                    if (this.xs(h)) {
                        this.aav(h, c, e, f, g);
                        g++;
                    }
                    if (h.isStacked) {
                        h.p9((i) => {
                            if (this.xs(i)) {
                                this.aav(i, c, e, f, g);
                                g++;
                            }
                            if (i.ei) {
                                i.p7((j) => {
                                    if (this.xs(j)) {
                                        this.aav(j, c, e, f, g);
                                        g++;
                                    }
                                    return true;
                                });
                            }
                            return true;
                        });
                    }
                    if (h.ei) {
                        h.p7((i) => {
                            if (this.xs(i)) {
                                this.aav(i, c, e, f, g);
                                g++;
                            }
                            return true;
                        });
                    }
                }
                this.aau(c);
            }
            d.count = g;
        }
        aau(a) {
            let b = new List$1(ItemTooltipCollisionInfo.$, 0);
            for (let c = 0; c < a.f.count; c++) {
                let d = new ItemTooltipCollisionInfo();
                d.d = c;
                d.e = { $type: Point_$type, x: a.f._inner[c], y: a.g._inner[c] };
                d.c = a.m._inner[c];
                d.a = a.k._inner[c];
                d.b = a.o._inner[c];
                if (isNaN_(d.e.x) || isNaN_(d.e.y)) {
                    continue;
                }
                b.add(d);
            }
            b.aa((e, f) => {
                if (e.e.y < f.e.y) {
                    return -1;
                }
                if (e.e.y > f.e.y) {
                    return 1;
                }
                if (e.b < f.b) {
                    return -1;
                }
                if (e.b > f.b) {
                    return 1;
                }
                return 0;
            });
            let e = this.aah(b);
            if (!e) {
                return;
            }
            for (let f = 0; f < b.count - 1; f++) {
                let g = b._inner[f];
                let h = b._inner[f + 1];
                let i = new Rect(0, g.e.x, g.e.y, g.c, g.a);
                let j = new Rect(0, h.e.x, h.e.y, h.c, h.a);
                if (i.intersectsWith(j) || i.top > j.bottom) {
                    h.e = { $type: Point_$type, x: h.e.x, y: i.bottom + 1 };
                }
            }
            if (b._inner[b.count - 1].e.y + b._inner[b.count - 1].a > this.cw.b9.height) {
                b._inner[b.count - 1].e = { $type: Point_$type, x: b._inner[b.count - 1].e.x, y: b._inner[b.count - 1].e.y - ((b._inner[b.count - 1].e.y + b._inner[b.count - 1].a) - this.cw.b9.height) };
            }
            for (let k = b.count - 1; k >= 1; k--) {
                let l = b._inner[k];
                let m = b._inner[k - 1];
                let n = new Rect(0, l.e.x, l.e.y, l.c, l.a);
                let o = new Rect(0, m.e.x, m.e.y, m.c, m.a);
                if (n.intersectsWith(o) || n.top < o.bottom) {
                    m.e = { $type: Point_$type, x: m.e.x, y: n.top - (o.height + 1) };
                }
            }
            for (let p = 0; p < b.count; p++) {
                let q = b._inner[p].d;
                let r = b._inner[p];
                a.f._inner[q] = r.e.x;
                a.g._inner[q] = r.e.y;
            }
        }
        aah(a) {
            if (a.count <= 1) {
                return false;
            }
            let b = this.cw.b9;
            for (let c = 0; c < a.count - 1; c++) {
                let d = a._inner[c];
                let e = a._inner[c + 1];
                let f = new Rect(0, d.e.x, d.e.y, d.c, d.a);
                let g = new Rect(0, e.e.x, e.e.y, e.c, e.a);
                if (f.intersectsWith(g)) {
                    return true;
                }
            }
            return false;
        }
        aav(a, b, c, d, e) {
            let f = this.yw(a);
            if (!f.c) {
                return;
            }
            let g = a.wm(f.d, c, d);
            let h = this.aaf.co;
            let i = this.aal(a);
            let j = this.aac;
            if (!c) {
                j = this.wr(g);
            }
            let k = a.kr(j);
            let l = h.item(e);
            let m = this.cw.b9;
            let n = null;
            if (a.e5 && k != null) {
                n = a.a3(k);
            }
            else {
                n = new DataContext();
                n.item = k;
                n.series = a;
            }
            if (!this.aaf.cp(a, l, i, n)) {
                return;
            }
            let o = this.aaf.c0(l, i, n);
            b.i.add1(l);
            b.j.add1(n);
            b.l.add1(i);
            let p = g.x;
            let q = g.x;
            q = Math.max(q, m.left);
            q = Math.min(q, m.right);
            b.n.add(q);
            let r = g.y;
            r = Math.max(r, m.top);
            r = Math.min(r, m.bottom);
            b.o.add(r);
            let s = DeviceUtils.g(10);
            let t = g.x + s;
            if (t + o.width > m.right) {
                t = (p - o.width) - s;
            }
            if (t < m.left) {
                t = m.left;
            }
            b.f.add(t);
            let u = (g.y - o.height) - s;
            if (u + o.height > m.bottom) {
                u = (m.bottom - o.height) - s;
            }
            if (u < m.top) {
                u = m.top;
            }
            b.g.add(u);
            b.m.add(o.width);
            b.k.add(o.height);
            let v = this.vj;
            if (v == null) {
                v = this.vp;
            }
            if (v == null) {
                v = a.vj;
            }
            b.h.add(v);
        }
        aal(a) {
            return a.toolTip;
        }
        qd() {
            this.aac = { $type: Point_$type, x: NaN, y: NaN };
            this.ry(false);
            this.aaf.cx(false);
        }
        qe() {
            this.aac = { $type: Point_$type, x: NaN, y: NaN };
            this.ry(false);
            this.aaf.cx(true);
        }
        y6(a, b) {
            super.y6(a, b);
            let c = a;
            let d = c.o.count;
            let e = b.b9.left;
            let f = b.b9.right;
            let g = b.b9.top;
            let h = b.b9.bottom;
            for (let i = 0; i < d; i++) {
                if (isNaN_(c.n._inner[i]) || isNaN_(c.o._inner[i]) || isNaN_(c.f._inner[i]) || isNaN_(c.g._inner[i]) || c.l._inner[i] == null || c.j._inner[i] == null) {
                    this.aaf.cw(c.i._inner[i]);
                    continue;
                }
                let j = c.f._inner[i];
                let k = c.g._inner[i];
                let l = c.m._inner[i];
                let m = c.k._inner[i];
                let n = false;
                if (j < e && Math.abs(j - e) > 1) {
                    n = true;
                }
                if (k < g && Math.abs(k - g) > 1) {
                    n = true;
                }
                if ((j + l) > f && Math.abs((j + l) - f) > 1) {
                    n = true;
                }
                if ((k + m) > h && Math.abs((k + m) - h) > 1) {
                    n = true;
                }
                if (n) {
                    this.aaf.cw(c.i._inner[i]);
                    continue;
                }
                let o = c.i._inner[i];
                let p = Math.min(c.f._inner[i], c.n._inner[i]);
                let q = Math.min(c.g._inner[i], c.o._inner[i]);
                let r = c.n._inner[i] - c.f._inner[i];
                let s = c.o._inner[i] - c.g._inner[i];
                if (o != null) {
                    this.aaf.cy(o, p, q, r, s);
                }
            }
        }
        gb() {
            return true;
        }
    }
    ItemToolTipLayer.$t = markType(ItemToolTipLayer, 'ItemToolTipLayer', AnnotationLayer.$);
    ItemToolTipLayer.$$p = markDep(DependencyProperty, PropertyMetadata, ItemToolTipLayer, 'raisePropertyChanged', ['SkipUnknownValues:aai:aaw', [0, true], 'TargetSeriesName:aan:aax', [2, null], 'TargetSeries:aag:aay', [Series.$, null], 'ToolTipBackground:aa3:aaz', [Brush.$, null], 'ToolTipBorderBrush:aa4:aa0', [Brush.$, null], 'ToolTipBorderThickness:aak:aa1', [1, NaN], 'UseInterpolation:aaj:aa2', [0, false]]);
    return ItemToolTipLayer;
})();
/**
 * @hidden
 */
export let ItemToolTipLayerView = /*@__PURE__*/ (() => {
    class ItemToolTipLayerView extends AnnotationLayerView {
        constructor(a) {
            super(a);
            this.cn = null;
            this.co = null;
            this.cq = null;
            this._htmlTest = null;
            this.cn = a;
            this.cq = new List$1(PointerTooltip.$, 0);
        }
        a4() {
            super.a4();
            this.co = ((() => {
                let $ret = new Pool$1(Base.$);
                $ret.create = runOn(this, this.cr);
                $ret.activate = runOn(this, this.ct);
                $ret.disactivate = runOn(this, this.cv);
                $ret.destroy = runOn(this, this.cu);
                return $ret;
            })());
            this.htmlTest = /^[^<]*(<[\w\W]+>)[^>]*$/;
        }
        as() {
            super.as();
            for (let a = 0; a < this.co.a.count; a++) {
                this.co.a._inner[a].br();
            }
            for (let b = 0; b < this.co.b.count; b++) {
                this.co.b._inner[b].br();
            }
            this.co.clear();
        }
        cr() {
            let a = new PointerTooltip();
            a.bw(this.f.j3);
            a._visibility = 1;
            a.ap = this.f.dc.dp.k;
            this.cq.add(a);
            return a;
        }
        ct(a) {
            let b = a;
        }
        cv(a) {
            let b = a;
            b._visibility = 1;
        }
        cu(a) {
            let b = a;
            b.bz();
            b.content = null;
            this.cq.remove1(a);
        }
        get htmlTest() {
            return this._htmlTest;
        }
        set htmlTest(a) {
            this._htmlTest = a;
        }
        cp(a, b, c, d) {
            let e = b;
            if (a.k6 == "default") {
                a.k6 = a.cw.getDefaultTooltipTemplate();
            }
            let template_ = a.k6;
            let context_ = d;
            if (a.toolTip == null) {
                return false;
            }
            let tooltip_ = a.toolTip;
            if ((tooltip_.updateToolTip)) {
                tooltip_._inPointer = true;
                tooltip_.updateToolTip(context_, true);
                tooltip_.setStyleProperty('position', 'relative');
                tooltip_.setStyleProperty('left', '');
                tooltip_.setStyleProperty('top', '');
            }
            e.content = a.toolTip;
            return true;
        }
        c0(a, b, c) {
            let d = a;
            let e = d.content;
            let f = new Size(1, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);
            d.cy = 1;
            let g = d.cx(new Size(1, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY));
            d.cy = 0;
            return g;
        }
        cy(a, b, c, d, e) {
            let f = new PointerTooltipStyle();
            if (this.f.dc != null) {
                let g = this.f.dc.dp.j.i();
                PointerTooltipUtils.a(g, f, this.cn.aa3, this.cn.aa4, this.cn.aak);
            }
            let h = a;
            h.aq = f;
            let i = h.content;
            h.cs = { $type: Point_$type, x: d, y: e };
            h._visibility = 0;
            h.n = b;
            h.o = c;
        }
        cw(a) {
            if (a != null) {
                let b = a;
                b._visibility = 1;
            }
        }
        bj(a, b) {
            super.bj(a, b);
            if (b) {
                return;
            }
            let c = 0;
            let d = 0;
            let e = this.f.dc;
            if (e != null) {
                let f = e.dp.j.b8();
                c += f.x;
                d += f.y;
            }
            for (let g = 0; g < this.cq.count; g++) {
                this.cq._inner[g].by(this.cq._inner[g].n + c, this.cq._inner[g].o + d);
            }
        }
        ax(a) {
            super.ax(a);
            for (let tooltip_ of fromEnum(this.co.a)) {
                if (tooltip_._visibility != 0) {
                    continue;
                }
                let b = tooltip_;
                let c = b.a5();
                let d = b.n;
                let e = b.o;
                let f = new List$1(String_$type, 0);
                let g = b.content;
                if (g != null) {
                    let h = g.findByClass("ui-chart-default-tooltip-content");
                    if (h != null && h.length > 0 && h[0] != null && h[0].getChildCount() > 0) {
                        let i = h[0];
                        let j = i.getChildAt(0);
                        let k = j.getText();
                        f.add(k);
                    }
                    else {
                        let l = g.getText();
                        f.add(l);
                    }
                }
                this.f.bc.addPointerTooltipData(a, c, d, e, f);
            }
        }
        cx(a) {
            this.a2();
            for (let b = 0; b < this.cq.count; b++) {
                this.cw(this.cq._inner[b]);
                if (a) {
                    this.cq._inner[b].bs();
                }
            }
        }
        cz() {
            if (this.f.dc == null) {
                this.cx(true);
            }
        }
    }
    ItemToolTipLayerView.$t = markType(ItemToolTipLayerView, 'ItemToolTipLayerView', AnnotationLayerView.$);
    return ItemToolTipLayerView;
})();
