/*
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 { TimeAxisBase } from "./TimeAxisBase";
import { DependencyProperty } from "igniteui-react-core";
import { TimeAxisDisplayType_$type } from "./TimeAxisDisplayType";
import { Base, enumGetBox, Number_$type, typeGetValue, typeCast, markType, markDep } from "igniteui-react-core";
import { Rect } from "igniteui-react-core";
import { ScalerParams } from "./ScalerParams";
import { NumericYAxis } from "./NumericYAxis";
import { LinearNumericSnapper } from "./LinearNumericSnapper";
import { LabelPosition } from "./LabelPosition";
import { PropertyMetadata } from "igniteui-react-core";
import { truncate, intDivide, isNaN_, isInfinity } from "igniteui-react-core";
import { dateMinValue, dateFromTicks } from "igniteui-react-core";
import { timeSpanFromMilliseconds } from "igniteui-react-core";
import { CategoryAxisBaseView } from "./CategoryAxisBaseView";
import { AxisDefaults } from "./AxisDefaults";
/**
 * @hidden
 */
var CategoryDateTimeXAxis = /** @class */ /*@__PURE__*/ (function (_super) {
    __extends(CategoryDateTimeXAxis, _super);
    function CategoryDateTimeXAxis() {
        var _this = _super.call(this) || this;
        _this.n0 = 0;
        _this.n1 = 0;
        _this.ab = CategoryDateTimeXAxis.$;
        _this.actualMinimumValue = (new Date());
        _this.actualMaximumValue = (new Date());
        return _this;
    }
    CategoryDateTimeXAxis.prototype.get_cd = function () {
        return this.nt == 0;
    };
    CategoryDateTimeXAxis.prototype.a4 = function () {
        return new CategoryDateTimeXAxisView(this);
    };
    CategoryDateTimeXAxis.prototype.hv = function (a) {
        _super.prototype.hv.call(this, a);
        this.ns = a;
    };
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "n2", {
        get: function () {
            return this.n0;
        },
        set: function (a) {
            if (this.n2 != a) {
                var b = this.n0;
                this.n0 = a;
                this.h5("ActualInterval", b, this.n2);
            }
        },
        enumerable: false,
        configurable: true
    });
    CategoryDateTimeXAxis.prototype.ex = function () {
        return this.n2;
    };
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "n6", {
        get: function () {
            return typeGetValue(this.c(CategoryDateTimeXAxis.oi));
        },
        set: function (a) {
            this.h(CategoryDateTimeXAxis.oi, a);
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "n3", {
        get: function () {
            return this.n1;
        },
        set: function (a) {
            if (this.n3 != a) {
                var b = this.n1;
                this.n1 = a;
                this.h5("ActualMinorInterval", b, this.n3);
            }
        },
        enumerable: false,
        configurable: true
    });
    CategoryDateTimeXAxis.prototype.c8 = function (a, b, c) {
        var d = _super.prototype.c8.call(this, a, b, c);
        if (!d) {
            return false;
        }
        return +(this.actualMinimumValue) != +(this.actualMaximumValue);
    };
    CategoryDateTimeXAxis.prototype.d6 = function () {
        return this.n2;
    };
    CategoryDateTimeXAxis.prototype.ic = function (a) {
        _super.prototype.ic.call(this, a);
        var b = this.bi != null ? this.bi.v4 : Rect.empty;
        var c = !b.isEmpty ? this.kh : Rect.empty;
        var d = this.kc();
        var e = this.kb();
        var f = new ScalerParams(0, b, c, this.ch, d);
        if ((this.mm == null || this.mm.count < 1) && !this.ms() && !this.mt()) {
            return;
        }
        if (!b.isEmpty && !c.isEmpty && (this.nt != 1 || this.mm != null)) {
            var g = c.bottom;
            var h = g - c.top;
            if (this.aj != null) {
                var i = typeCast(NumericYAxis.$, this.aj);
                if (i != null) {
                    var j = this.ii(g, h, b, c, d, c.top, c.bottom);
                    g = j.p0;
                    h = j.p1;
                }
            }
            if (isNaN_(g)) {
                g = 0;
            }
            this.ht(this.a5.a4(), g, c, this.a5.e(), true);
            this.aw.bg = h;
            var k = this.a5.a7();
            var l = this.a5.f();
            var m = this.a5.a5();
            var n = this.a5.a6();
            var o = this.a5.g();
            if (this.nt == 1) {
                var p = this.i$e(b, c, d, e);
                var q = this.i$g(b, c, d, e);
                if (p < 0 || q < 0) {
                    return;
                }
                var r = NaN;
                for (var s = p; s <= q; s++) {
                    var t = this.mv == null ? s : this.mv._inner[s];
                    var u = this.el(this.mm.item(t).getTime(), f);
                    if (u == r) {
                        continue;
                    }
                    r = u;
                    if (this.categoryMode == 2) {
                        u += this.ch ? -this.getGroupCenter(s, b, c, d) : this.getGroupCenter(s, b, c, d);
                    }
                    if (u < e.left || u > e.right) {
                        continue;
                    }
                    this.iq(m, u, c, l, false);
                    this.k2.add(u);
                    if (this.kv != null && s < this.kv.count) {
                        var v = this.kv.item(t);
                        var w = _super.prototype.f1.call(this, v);
                        if (!isNaN_(u) && !isInfinity(u) && w != null) {
                            if ((typeof w === 'string') && Base.equalsStatic(w, "")) {
                            }
                            else {
                                this.dd.add1(w);
                                this.de.add(new LabelPosition(u));
                            }
                        }
                    }
                }
            }
            else {
                var x = this.eo(e.left, f);
                var y = this.eo(e.right, f);
                var z = Math.min(x, y);
                var aa = Math.max(x, y);
                var ab = new LinearNumericSnapper(0, z, aa, e.width, this.e0(), this.nz());
                var ac = this.mq ? this.ny() : ab.g;
                this.oe(truncate(ac));
                var ad = truncate(Math.floor((z - this.actualMinimumValue.getTime()) / ac));
                var ae = truncate(Math.ceil((aa - this.actualMinimumValue.getTime()) / ac));
                var af = 0;
                if (this.categoryMode == 2) {
                    af = this.getGroupCenter(0, b, c, d);
                    af = this.ch ? -af : af;
                }
                var ag = truncate(Math.ceil(e.right));
                var ah = truncate(Math.floor(e.left));
                var ai = this.el(this.actualMinimumValue.getTime() + ad * ac, f) + af;
                for (var aj = ad; aj <= ae; aj++) {
                    var ak = this.el(this.actualMinimumValue.getTime() + (aj + 1) * ac, f) + af;
                    if (!isNaN_(ai) && !isInfinity(ai)) {
                        var al = truncate(Math.round(ai));
                        if (al <= ag) {
                            if (aj % 2 == 0) {
                                this.ir(k, ai, ak, c);
                            }
                            this.iq(m, ai, c, l, false);
                            this.k2.add(ai);
                            if (this.cy) {
                                var am = this.n4();
                                if (am > 0 && am < ac) {
                                    if (ac / am < 20) {
                                        var an = ai;
                                        var ao = Math.abs(this.el(this.actualMinimumValue.getTime() + am, f) - this.el(this.actualMinimumValue.getTime(), f));
                                        while (an + ao < ak) {
                                            if (Math.abs(an + ao - ak) < 0.0001) {
                                                break;
                                            }
                                            an += ao;
                                            if (an > 0) {
                                                this.iq(n, an, c, o, false);
                                            }
                                        }
                                        this.of(am);
                                    }
                                }
                                else {
                                    for (var ap = 1; ap < ab.j; ++ap) {
                                        var aq = this.el(this.actualMinimumValue.getTime() + aj * ac + (ap * ac) / ab.j, f) + af;
                                        this.iq(n, aq, c, o, false);
                                    }
                                    if (ab.j > 0) {
                                        this.of(truncate((ac / ab.j)));
                                    }
                                }
                            }
                        }
                        if (al >= ah && al <= ag) {
                            var ar = this.actualMinimumValue.getTime() + aj * ac;
                            var ticks_ = truncate(Math.floor(ar));
                            var as = (new Date(ticks_));
                            var at = this.f1(as);
                            if (at != null) {
                                this.dd.add1(at);
                                this.de.add(new LabelPosition(ai));
                            }
                        }
                    }
                    ai = ak;
                }
            }
            if ((this.az == null || this.az.visibility == 0) && this.aj != null) {
                if (this.az != null && (this.az.location == 4 || this.az.location == 5)) {
                    this.bi.n3();
                }
            }
            this.aw.a9 = this.dd;
            this.aw.ba = this.de;
            this.l9();
        }
    };
    CategoryDateTimeXAxis.prototype.nz = function () {
        return -1;
    };
    CategoryDateTimeXAxis.prototype.ny = function () {
        return this.n2;
    };
    CategoryDateTimeXAxis.prototype.n4 = function () {
        return this.n6;
    };
    CategoryDateTimeXAxis.prototype.oe = function (a) {
        this.n2 = a;
    };
    CategoryDateTimeXAxis.prototype.of = function (a) {
        this.n3 = a;
    };
    CategoryDateTimeXAxis.prototype.nv = function () {
        return this.n5 != 0;
    };
    CategoryDateTimeXAxis.prototype.nu = function () {
        return this.n2 == 0;
    };
    CategoryDateTimeXAxis.prototype.nx = function (a) {
        return this.mm == null ? dateMinValue() : this.mm.item(a);
    };
    CategoryDateTimeXAxis.prototype.od = function (a, b) {
        if (a > b || this.kv == null || this.kv.count == 0) {
            return;
        }
        var c = (a.getTime() - this.actualMinimumValue.getTime()) / (this.actualMaximumValue.getTime() - this.actualMinimumValue.getTime());
        var d = (b.getTime() - this.actualMinimumValue.getTime()) / (this.actualMaximumValue.getTime() - this.actualMinimumValue.getTime());
        this.bi.wk = new Rect(0, c, this.bi.wk.y, d - c, this.bi.wk.height);
    };
    CategoryDateTimeXAxis.prototype.hz = function (a, b, c, d) {
        _super.prototype.hz.call(this, a, b, c, d);
        switch (b) {
            case CategoryDateTimeXAxis.$$p[0]:
                this.cq = true;
                this.aw.al = this.nt == 1 || this.nw;
                this.ib(false);
                break;
            case CategoryDateTimeXAxis.$$p[1]:
                this.cq = true;
                this.ib(false);
                break;
            case CategoryDateTimeXAxis.$$p[2]:
                this.aw.al = this.nt == 1 || this.nw;
                break;
        }
    };
    CategoryDateTimeXAxis.prototype.ni = function () {
        _super.prototype.ni.call(this);
        if (this.nv()) {
            this.n2 = this.n5;
            var a = this.bi != null ? this.bi.v4 : Rect.empty;
            var b = !a.isEmpty ? this.kh : Rect.empty;
            var c = Math.abs(this.actualMaximumValue.getTime() - this.actualMinimumValue.getTime());
            this.mq = this.nu() || (this.nt == 1) || (1 * c / this.ny() > (b.width / a.width)) ? false : true;
        }
        else {
            this.mq = false;
        }
    };
    CategoryDateTimeXAxis.prototype.ng = function (a, b) {
        var c = b.getTime() - a.getTime();
        var timeOffset_ = truncate(Math.round(intDivide(c, this.lj) / 2));
        return timeOffset_ == 0 ? timeSpanFromMilliseconds(1) : timeSpanFromMilliseconds(timeOffset_);
    };
    CategoryDateTimeXAxis.prototype.get_cc = function () {
        return true;
    };
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "isVertical", {
        get: function () {
            return this.cp;
        },
        enumerable: false,
        configurable: true
    });
    CategoryDateTimeXAxis.prototype.j$d = function (a, b) {
        return this.eo.apply(this, arguments);
    };
    CategoryDateTimeXAxis.prototype.j$c = function (a, b) {
        return this.el.apply(this, arguments);
    };
    CategoryDateTimeXAxis.prototype.j$e = function (a, b, c, d, e) {
        this.hp.apply(this, arguments);
    };
    CategoryDateTimeXAxis.prototype.j$f = function (a, b, c, d) {
        this.hq.apply(this, arguments);
    };
    CategoryDateTimeXAxis.prototype.j$g = function (a, b, c, d) {
        this.hr.apply(this, arguments);
    };
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "j$b", {
        get: function () {
            return this.ch;
        },
        enumerable: false,
        configurable: true
    });
    CategoryDateTimeXAxis.prototype.j$a = function () {
        return this.ag.apply(this, arguments);
    };
    Object.defineProperty(CategoryDateTimeXAxis.prototype, "i$a", {
        get: function () {
            return this.ce;
        },
        enumerable: false,
        configurable: true
    });
    CategoryDateTimeXAxis.$t = markType(CategoryDateTimeXAxis, 'CategoryDateTimeXAxis', TimeAxisBase.$);
    CategoryDateTimeXAxis.oi = DependencyProperty.i("MinorInterval", Number_$type, CategoryDateTimeXAxis.$, new PropertyMetadata(2, 0, function (a, b) {
        (typeCast(CategoryDateTimeXAxis.$, a)).h5("MinorInterval", b.oldValue, b.newValue);
        (typeCast(CategoryDateTimeXAxis.$, a)).ib(false);
    }));
    CategoryDateTimeXAxis.$$p = markDep(DependencyProperty, PropertyMetadata, CategoryDateTimeXAxis, 'h5', ['DisplayType:nt:og', [TimeAxisDisplayType_$type, enumGetBox(TimeAxisDisplayType_$type, 0)], 'Interval:n5:oh', [1, 0], 'UnevenlySpacedLabels:nw:oj', [0, false]]);
    return CategoryDateTimeXAxis;
}(TimeAxisBase));
export { CategoryDateTimeXAxis };
/**
 * @hidden
 */
var CategoryDateTimeXAxisView = /** @class */ /*@__PURE__*/ (function (_super) {
    __extends(CategoryDateTimeXAxisView, _super);
    function CategoryDateTimeXAxisView(a) {
        var _this = _super.call(this, a) || this;
        _this.bm = null;
        _this.bm = a;
        return _this;
    }
    CategoryDateTimeXAxisView.prototype.al = function () {
        _super.prototype.al.call(this);
        this.a.fj = AxisDefaults.f;
    };
    CategoryDateTimeXAxisView.prototype.s = function (a) {
        var b = this.q(dateFromTicks(truncate(a)));
        return b;
    };
    CategoryDateTimeXAxisView.$t = markType(CategoryDateTimeXAxisView, 'CategoryDateTimeXAxisView', CategoryAxisBaseView.$);
    return CategoryDateTimeXAxisView;
}(CategoryAxisBaseView));
export { CategoryDateTimeXAxisView };
