/*
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 { CategoryBucketCalculator } from "./CategoryBucketCalculator";
import { markType, runOn, delegateCombine, typeCast, markDep, Point_$type } from "igniteui-angular-core";
import { isNaN_, truncate, isInfinity } from "igniteui-angular-core";
import { CategorySeries } from "./CategorySeries";
import { IIsCategoryBased_$type } from "./IIsCategoryBased";
import { IHasHighLowValueCategory_$type } from "./IHasHighLowValueCategory";
import { RangeCategoryFramePreparer } from "./RangeCategoryFramePreparer";
import { DependencyProperty } from "igniteui-angular-core";
import { Series } from "./Series";
import { CategoryAxisBase } from "./CategoryAxisBase";
import { ICategoryScaler_$type } from "./ICategoryScaler";
import { IScaler_$type } from "./IScaler";
import { CategorySeriesView } from "./CategorySeriesView";
import { CategoryFrame } from "./CategoryFrame";
import { SeriesLayerPropertyOverlay } from "./SeriesLayerPropertyOverlay";
import { CategoryMarkerManager } from "./CategoryMarkerManager";
import { AxisRange } from "./AxisRange";
import { Rect } from "igniteui-angular-core";
import { ScalerParams } from "./ScalerParams";
import { ISortingAxis_$type } from "./ISortingAxis";
import { IFastItemsSource_$type } from "igniteui-angular-core";
import { CollisionAvoider } from "./CollisionAvoider";
import { ISupportsMarkers_$type } from "./ISupportsMarkers";
import { ChartSelection } from "./ChartSelection";
import { PropertyMetadata } from "igniteui-angular-core";
import { FastFlattener } from "igniteui-angular-core";
/**
 * @hidden
 */
export let RangeCategoryBucketCalculator = /*@__PURE__*/ (() => {
    class RangeCategoryBucketCalculator extends CategoryBucketCalculator {
        constructor(a) {
            super(a);
            this.j = null;
            this.l = 0;
            this.k = 0;
            this.i = null;
            this.h = null;
            this.j = a;
        }
        getBucketWithoutUnknowns(a) {
            let b = false;
            let c = this.i;
            let d = this.h;
            let e = this.l;
            let f = this.k;
            let g = Math.min(e, f);
            let h = a * this.d;
            let i = Math.min(h + this.d - 1, g - 1);
            let j = 1.7976931348623157E+308;
            let k = -1.7976931348623157E+308;
            let l = true;
            let m = 0;
            let n = 0;
            let o;
            let p;
            if (h <= i) {
                for (let q = h; q <= i; ++q) {
                    m = c[q];
                    n = d[q];
                    if (m < n) {
                        o = m;
                        p = n;
                    }
                    else {
                        p = m;
                        o = n;
                    }
                    if (!l) {
                        j = j < o ? j : o;
                        k = k > o ? k : o;
                        j = j < p ? j : p;
                        k = k > p ? k : p;
                    }
                    else {
                        j = Math.min(j, o);
                        k = Math.max(k, o);
                        k = Math.max(k, p);
                        j = Math.min(j, p);
                        l = false;
                    }
                }
            }
            if (b && n < m) {
                let r = j;
                j = k;
                k = r;
            }
            if (!l) {
                let s = new Array(3);
                s[0] = 0.5 * (h + i);
                s[1] = j;
                s[2] = k;
                return s;
            }
            let t = new Array(3);
            t[0] = NaN;
            t[1] = NaN;
            t[2] = NaN;
            return t;
        }
        getBucket(a) {
            let b = false;
            let c = this.i;
            let d = this.h;
            let e = this.l;
            let f = this.k;
            let g = Math.min(e, f);
            let h = a * this.d;
            let i = Math.min(h + this.d - 1, g - 1);
            let j = NaN;
            let k = NaN;
            let l = true;
            let m = 0;
            let n = 0;
            let o;
            let p;
            if (h <= i) {
                for (let q = h; q <= i; ++q) {
                    m = c[q];
                    n = d[q];
                    if (m < n) {
                        o = m;
                        p = n;
                    }
                    else {
                        p = m;
                        o = n;
                    }
                    if (!l) {
                        if (!isNaN_(o)) {
                            j = j < o ? j : o;
                            k = k > o ? k : o;
                        }
                        if (!isNaN_(p)) {
                            j = j < p ? j : p;
                            k = k > p ? k : p;
                        }
                    }
                    else {
                        if (!isNaN_(o)) {
                            if (isNaN_(j)) {
                                j = o;
                            }
                            else {
                                j = Math.min(j, o);
                            }
                            if (!isNaN_(k)) {
                                k = Math.max(k, o);
                            }
                        }
                        if (!isNaN_(p)) {
                            if (isNaN_(k)) {
                                k = p;
                            }
                            else {
                                k = Math.max(k, p);
                            }
                            if (!isNaN_(j)) {
                                j = Math.min(j, p);
                            }
                        }
                        if (!isNaN_(j) && !isNaN_(k)) {
                            l = false;
                        }
                    }
                }
            }
            if (n < m && b) {
                let r = j;
                j = k;
                k = r;
            }
            if (!l) {
                let s = new Array(3);
                s[0] = 0.5 * (h + i);
                s[1] = j;
                s[2] = k;
                return s;
            }
            let t = new Array(3);
            t[0] = NaN;
            t[1] = NaN;
            t[2] = NaN;
            return t;
        }
        cacheValues() {
            this.l = this.j.c5.lowColumn.count;
            this.k = this.j.c5.highColumn.count;
            this.i = this.j.c5.lowColumn.asArray();
            this.h = this.j.c5.highColumn.asArray();
        }
        unCacheValues() {
            this.i = null;
            this.h = null;
        }
    }
    RangeCategoryBucketCalculator.$t = markType(RangeCategoryBucketCalculator, 'RangeCategoryBucketCalculator', CategoryBucketCalculator.$);
    return RangeCategoryBucketCalculator;
})();
/**
 * @hidden
 */
export let RangeCategorySeries = /*@__PURE__*/ (() => {
    class RangeCategorySeries extends CategorySeries {
        constructor() {
            super();
            this._RangeFramePreparer = null;
            this.aaw = null;
            this.aav = null;
            this.aas = null;
            this.RangeFramePreparer = new RangeCategoryFramePreparer(1, this, this.aau, this, this, this.aau.cw);
        }
        cs() {
            return new RangeCategorySeriesView(this);
        }
        getHostReferenceValue() {
            return this.iy();
        }
        q1(a) {
            super.q1(a);
            this.aau = a;
        }
        get RangeFramePreparer() {
            return this._RangeFramePreparer;
        }
        set RangeFramePreparer(a) {
            this._RangeFramePreparer = a;
        }
        gb() {
            return this.highlightedItemsSource != null || (this.aa2 != null && this.aa0 != null);
        }
        ht() {
            let a = super.ht();
            {
                let b = ((() => {
                    let $ret = new SeriesLayerPropertyOverlay();
                    $ret.ad = "HighMemberPath";
                    $ret.p = true;
                    $ret.y = "HighlightedHighMemberPath";
                    $ret.q = true;
                    return $ret;
                })());
                b.valueResolving = delegateCombine(b.valueResolving, runOn(this, this.aa9));
                a.add(b);
            }
            {
                let c = ((() => {
                    let $ret = new SeriesLayerPropertyOverlay();
                    $ret.ad = "LowMemberPath";
                    $ret.p = true;
                    $ret.y = "HighlightedLowMemberPath";
                    $ret.q = true;
                    return $ret;
                })());
                c.valueResolving = delegateCombine(c.valueResolving, runOn(this, this.aba));
                a.add(c);
            }
            return a;
        }
        aba(a, b) {
            if (this.aa2 != null) {
                b.value = this.aa2;
                return;
            }
            b.value = this.aa7;
        }
        aa9(a, b) {
            if (this.aa0 != null) {
                b.value = this.aa0;
                return;
            }
            b.value = this.aa4;
        }
        kq(a, b) {
            let c = this.nd(b);
            if (c == RangeCategorySeries.$$p[0]) {
                return this.kr(a, b, this.aa4);
            }
            if (c == RangeCategorySeries.$$p[3]) {
                return this.kr(a, b, this.aa7);
            }
            if (c == RangeCategorySeries.$$p[2]) {
                return this.kr(a, b, this.aa2);
            }
            if (c == RangeCategorySeries.$$p[1]) {
                return this.kr(a, b, this.aa0);
            }
            return super.kq(a, b);
        }
        md(a) {
            let b = this.nd(a);
            if (b == RangeCategorySeries.$$p[0]) {
                return this.aa4;
            }
            if (b == RangeCategorySeries.$$p[3]) {
                return this.aa7;
            }
            if (b == RangeCategorySeries.$$p[2]) {
                return this.aa2;
            }
            if (b == RangeCategorySeries.$$p[1]) {
                return this.aa0;
            }
            return super.md(a);
        }
        get lowColumn() {
            return this.aaw;
        }
        set lowColumn(a) {
            if (this.aaw != a) {
                let b = this.aaw;
                this.aaw = a;
                this.raisePropertyChanged("LowColumn", b, this.aaw);
            }
        }
        get highColumn() {
            return this.aav;
        }
        set highColumn(a) {
            if (this.aav != a) {
                let b = this.aav;
                this.aav = a;
                this.raisePropertyChanged("HighColumn", b, this.aav);
            }
        }
        y4() {
            return 11;
        }
        aak(a, b) {
            super.aak(a, b);
            b.b7 = true;
            CategoryMarkerManager.e(this, a.n, b.cz, this.xi);
            this.z9(b, a);
        }
        abb(a, b, c, d, e, f) {
            this.aau.c6(a, b, c, d, e, f);
        }
        az(a) {
            if (a.isEmpty && this.db != null) {
                a = this.db.v4;
            }
            let b = this.ys();
            if (this.lowColumn == null || this.highColumn == null) {
                return null;
            }
            let c = this.wj(this.cv);
            let d = new ScalerParams(0, a, this.db.wk, b.ch, this.getEffectiveViewport());
            let e = (b.eo(c.left, d));
            let f = (b.eo(c.right, d));
            if (b.ch) {
                let g = e;
                e = f;
                f = g;
            }
            let h = null;
            if (b.cn) {
                h = b;
                e = h.i$f(e);
                f = h.i$f(f);
            }
            else {
                e = Math.floor(e);
                f = Math.ceil(f);
            }
            e = Math.max(0, Math.min(this.lowColumn.count - 1, e));
            f = Math.max(0, Math.min(this.lowColumn.count - 1, f));
            let i = 1.7976931348623157E+308;
            let j = -1.7976931348623157E+308;
            for (let k = truncate(e); k <= truncate(f); k++) {
                let l = k;
                if (h != null) {
                    l = h.i$b._inner[k];
                }
                let m = this.lowColumn.item(l);
                if (this.lowColumn.mayContainUnknowns) {
                    if (isInfinity(m) || isNaN_(m)) {
                        continue;
                    }
                }
                let n = this.highColumn.item(l);
                if (this.highColumn.mayContainUnknowns) {
                    if (isInfinity(n) || isNaN_(n)) {
                        continue;
                    }
                }
                i = Math.min(i, m);
                j = Math.max(j, n);
            }
            let o = new AxisRange(i, j);
            let p = this.y9();
            o = this.ax(o, p, a);
            return o;
        }
        gd(a) {
            let b = new Rect(0, 0, 0, 1, 1);
            let c = this.cv != null ? this.cv.by : Rect.empty;
            c = c.copy();
            let d = this.cv != null ? this.cv.bx : Rect.empty;
            let e = !c.isEmpty && !d.isEmpty && this.dn != null ? this.dn.indexOf(a) : -1;
            let f = this.fetchXAxis();
            let g = this.fetchYAxis();
            let h = this.wl(this.cv);
            let i;
            if (f != null) {
                let j = new ScalerParams(0, b, b, f.ch, h);
                i = f.el(e, j);
            }
            else {
                i = NaN;
            }
            let k = f != null ? this.RangeFramePreparer.r(typeCast(ICategoryScaler_$type, f), b, b, h) : 0;
            i += k;
            if (e >= 0 && Rect.l_op_Inequality(c, null) && Rect.l_op_Inequality(d, null)) {
                if (!isNaN_(i)) {
                    if (i < c.left + 0.1 * c.width) {
                        i = i + 0.4 * c.width;
                    }
                    if (i > c.right - 0.1 * c.width) {
                        i = i - 0.4 * c.width;
                    }
                    c.x = i - 0.5 * c.width;
                }
                if (g != null && this.highColumn != null && e < this.highColumn.count) {
                    let l = new ScalerParams(0, b, b, g.ch, h);
                    l.b = this.iy();
                    let m = g.el(this.highColumn.item(e), l);
                    let n = g.el(this.lowColumn.item(e), l);
                    if (!isNaN_(m) && !isNaN_(n)) {
                        let o = Math.abs(n - m);
                        if (c.height < o) {
                            c.height = o;
                            c.y = Math.min(n, m);
                        }
                        else {
                            if (n < c.top + 0.1 * c.height) {
                                n = n + 0.4 * c.height;
                            }
                            if (n > c.bottom - 0.1 * c.height) {
                                n = n - 0.4 * c.height;
                            }
                            c.y = n - 0.5 * c.height;
                        }
                    }
                }
                if (this.c3 != null) {
                    this.c3.au(this.db, c, true);
                }
            }
            return e >= 0;
        }
        q9(a, b, c, d) {
            super.q9(a, b, c, d);
            switch (b) {
                case "FastItemsSource":
                    if (typeCast(IFastItemsSource_$type, c) != null) {
                        c.deregisterColumn(this.lowColumn);
                        c.deregisterColumn(this.highColumn);
                        this.lowColumn = null;
                        this.highColumn = null;
                    }
                    if (typeCast(IFastItemsSource_$type, d) != null) {
                        this.lowColumn = this.dk(this.aa7);
                        this.highColumn = this.dk(this.aa4);
                    }
                    if (!this.zp()) {
                        this.y3.cw.g(this.id);
                        this.rr(this.gg && c != null);
                    }
                    break;
                case RangeCategorySeries.$$p[3]:
                    if (this.dn != null) {
                        this.dn.deregisterColumn(this.lowColumn);
                        this.lowColumn = this.dk(this.aa7);
                    }
                    break;
                case "LowColumn":
                    if (!this.zp()) {
                        this.y3.cw.g(this.id);
                        this.rr(this.gg && this.d7);
                    }
                    break;
                case RangeCategorySeries.$$p[0]:
                    if (this.dn != null) {
                        this.dn.deregisterColumn(this.highColumn);
                        this.highColumn = this.dk(this.aa4);
                    }
                    break;
                case "HighColumn":
                    if (!this.zp()) {
                        this.y3.cw.g(this.id);
                        this.rr(this.gg && this.d7);
                    }
                    break;
            }
        }
        ay(a) {
            if (this.lowColumn == null || this.lowColumn.count == 0 || this.highColumn == null || this.highColumn.count == 0) {
                return null;
            }
            if (a == this.fetchXAxis()) {
                let b = Math.min(this.lowColumn.count, this.highColumn.count);
                return new AxisRange(0, b - 1);
            }
            if (a == this.fetchYAxis()) {
                let c = Math.min(this.lowColumn.minimum, this.highColumn.minimum);
                let d = Math.max(this.lowColumn.maximum, this.highColumn.maximum);
                return new AxisRange(Math.min(c, d), Math.max(c, d));
            }
            return null;
        }
        pb(a, b, c, d) {
            if (this.fetchXAxis() != null && typeCast(ISortingAxis_$type, this.fetchXAxis()) !== null) {
                this.fetchXAxis().i$i();
            }
            let e = this.fetchXAxis();
            switch (a) {
                case 3:
                    if (d == this.aa7 || d == this.aa4) {
                        if (e != null) {
                            e.c1();
                        }
                        if (!this.zp()) {
                            this.rr(true);
                        }
                    }
                    break;
                case 1:
                    if (e != null) {
                        e.c1();
                    }
                    this.y3.cw.g(this.id);
                    if (!this.zp()) {
                        this.rr(true);
                    }
                    break;
                case 0:
                    if (e != null) {
                        e.c1();
                    }
                    this.y3.cw.g(this.id);
                    if (!this.zp()) {
                        this.rr(true);
                    }
                    break;
                case 2:
                    if (e != null) {
                        e.c1();
                    }
                    if (this.aa7 != null && this.aa4 != null && this.y3.cw.d > 0 && !this.zp()) {
                        this.rr(true);
                    }
                    break;
                case 4:
                    if (e != null) {
                        e.c1();
                    }
                    this.y3.cw.g(this.id);
                    if (!this.zp()) {
                        this.rr(true);
                    }
                    break;
            }
        }
        he(a, b, c) {
            let d = super.he(a, b, c);
            if (this.lowColumn == null || this.lowColumn.count == 0 || this.highColumn == null || this.highColumn.count == 0) {
                d = false;
            }
            return d;
        }
        aah(a, b) {
            super.aah(a, b);
            this.RangeFramePreparer.d(a, b);
        }
        get currentCategoryMode() {
            return this.preferredCategoryMode(typeCast(CategoryAxisBase.$, this.fetchXAxis()));
        }
        get scaler() {
            return typeCast(ICategoryScaler_$type, this.fetchXAxis());
        }
        get yScaler() {
            return typeCast(IScaler_$type, this.fetchYAxis());
        }
        get bucketizer() {
            return this.y3.cw;
        }
        get currentMode2Index() {
            return this.zy();
        }
        provideCollisionDetector() {
            return new CollisionAvoider();
        }
        get mayContainUnknowns() {
            return this.lowColumn == null || this.lowColumn.mayContainUnknowns || this.highColumn == null || this.highColumn.mayContainUnknowns;
        }
        rt(a, b) {
            let c = this.g0;
            super.rt(a, b);
            if (!c) {
                this.cv.a4(b);
                return;
            }
            this.cv.a4(b);
            if (this.d5(this.cu)) {
                return;
            }
            let d = new RangeCategoryFramePreparer(1, this, typeCast(ISupportsMarkers_$type, this.cu), this.db.c9.o, this, this.cu.cw);
            if (!this.gs) {
                this.yx = new CategoryFrame(3);
                this.yx.v();
                d.d(this.yx, this.cu);
            }
            this.gs = false;
            this.aak(this.yx, this.cu);
            this.g0 = false;
        }
        rq(a, b, c, d, e) {
            super.rq(a, b, c, d, e);
            let f = this.ba.a$j.item(d);
            let g = f;
            g.cw.g(this.id);
            f.a3(c);
            if (this.d5(g)) {
                return;
            }
            let h = new RangeCategoryFramePreparer(1, this, typeCast(ISupportsMarkers_$type, f), f, this, f.cw);
            if (this.aas == null) {
                this.aas = new CategoryFrame(3);
            }
            this.aas.v();
            h.d(this.aas, g);
            this.aak(this.aas, g);
        }
        iy() {
            return Series.iz(this.lowColumn, typeCast(ISortingAxis_$type, this.fetchXAxis()));
        }
        aad(a, b, c, d, e, f, g) {
            if (c == -1 || d == -1) {
                return;
            }
            for (let h = c; h <= d; h++) {
                let i = this.lowColumn.item(h);
                let j = this.highColumn.item(h);
                let k = Math.min(i, j);
                let l = Math.max(i, j);
                if (k < f && e < l) {
                    if (g == 7 || g == 6) {
                        b.add(((() => {
                            let $ret = new ChartSelection();
                            $ret.series = this;
                            return $ret;
                        })()));
                        return;
                    }
                    this.z7(b, h, g);
                }
            }
        }
        z7(a, b, c) {
            if (c == 2 || c == 1) {
                a.add(((() => {
                    let $ret = new ChartSelection();
                    $ret.item = this.dn.item(b);
                    return $ret;
                })()));
            }
            else {
                a.add(((() => {
                    let $ret = new ChartSelection();
                    $ret.item = this.dn.item(b);
                    $ret.series = this;
                    return $ret;
                })()));
            }
        }
        get useHighMarkerFidelity() {
            return this.zq;
        }
    }
    RangeCategorySeries.$t = markType(RangeCategorySeries, 'RangeCategorySeries', CategorySeries.$, [IIsCategoryBased_$type, IHasHighLowValueCategory_$type]);
    RangeCategorySeries.$$p = markDep(DependencyProperty, PropertyMetadata, RangeCategorySeries, 'raisePropertyChanged', ['HighMemberPath:aa4:abe', [2, null], 'HighlightedHighMemberPath:aa0:abc', [2, null], 'HighlightedLowMemberPath:aa2:abd', [2, null], 'LowMemberPath:aa7:abf', [2, null]]);
    return RangeCategorySeries;
})();
/**
 * @hidden
 */
export let RangeCategorySeriesView = /*@__PURE__*/ (() => {
    class RangeCategorySeriesView extends CategorySeriesView {
        constructor(a) {
            super(a);
            this.c5 = null;
            this.c5 = a;
        }
        c6(a, b, c, d, e, f) {
            a.an.clear();
            b.an.clear();
            c.an.clear();
            let g = FastFlattener.b(d, e, true, f, this.e.id);
            let h = FastFlattener.b(d, e, false, f, this.e.id);
            let i = g.count;
            let j = h.count;
            let k;
            let l;
            let m;
            let n;
            for (let o = 0; o < i; o++) {
                k = g.item(o);
                l = e._inner[k];
                m = l[0];
                n = l[1];
                a.an.add({ $type: Point_$type, x: m, y: n });
                b.an.add({ $type: Point_$type, x: m, y: n });
            }
            let p;
            let q;
            for (let r = 0; r < j; r++) {
                k = h.item(r);
                l = e._inner[k];
                if (f) {
                    p = l[0];
                    q = l[2];
                }
                else {
                    p = l[2];
                    q = l[3];
                }
                c.an.add({ $type: Point_$type, x: p, y: q });
                b.an.add({ $type: Point_$type, x: p, y: q });
            }
            a.ab = a.an.count > 0;
            b.ab = b.an.count > 0;
            c.ab = c.an.count > 0;
        }
        cx() {
            return new RangeCategoryBucketCalculator(this);
        }
    }
    RangeCategorySeriesView.$t = markType(RangeCategorySeriesView, 'RangeCategorySeriesView', CategorySeriesView.$);
    return RangeCategorySeriesView;
})();
