/*
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 { ColorScale } from "./ColorScale";
import { DependencyProperty } from "igniteui-angular-core";
import { ObservableColorCollection } from "igniteui-angular-core";
import { runOn, delegateCombine, delegateRemove, enumGetBox, markType, markDep } from "igniteui-angular-core";
import { Color } from "igniteui-angular-core";
import { ColorScaleInterpolationMode_$type } from "./ColorScaleInterpolationMode";
import { ColorUtil } from "igniteui-angular-core";
import { PropertyMetadata } from "igniteui-angular-core";
import { truncate, isNaN_ } from "igniteui-angular-core";
/**
 * @hidden
 */
export let CustomPaletteColorScale = /*@__PURE__*/ (() => {
    class CustomPaletteColorScale extends ColorScale {
        constructor() {
            super();
            this.p = null;
            this.ag = new Color();
            this.u = NaN;
            this.t = NaN;
            this.s = true;
            this.r = true;
            this.n = 0;
            this.ag = Color.u(0, 0, 0, 0);
            this.p = new ObservableColorCollection();
            let a = this.p;
            a.collectionChanged = delegateCombine(a.collectionChanged, runOn(this, this.ab));
            this.propertyUpdated = delegateCombine(this.propertyUpdated, (b, c) => this.k(b, c.propertyName, c.oldValue, c.newValue));
        }
        get palette() {
            return this.p;
        }
        set palette(a) {
            let b = this.p;
            if (this.p != null) {
                let c = this.p;
                c.collectionChanged = delegateRemove(c.collectionChanged, runOn(this, this.ab));
            }
            this.p = a;
            if (this.p != null) {
                let d = this.p;
                d.collectionChanged = delegateCombine(d.collectionChanged, runOn(this, this.ab));
            }
            this.l("Palette", b, this.palette);
        }
        ab(a, b) {
            this.l("Palette", this.palette, this.palette);
        }
        k(a, b, c, d) {
            super.k(a, b, c, d);
            switch (b) {
                case CustomPaletteColorScale.$$p[2]:
                    this.u = this.minimumValue;
                    this.s = isNaN_(this.u);
                    break;
                case CustomPaletteColorScale.$$p[1]:
                    this.t = this.maximumValue;
                    this.r = isNaN_(this.t);
                    break;
                case CustomPaletteColorScale.$$p[0]:
                    this.n = this.interpolationMode;
                    break;
            }
        }
        getColor(a, b, c, d) {
            if (((this.p == null) || (this.p.count == 0)) || d == null) {
                return this.ag;
            }
            let e = this.s ? b : this.u;
            let f = this.r ? c : this.t;
            let g = (a - e) / (f - e);
            if (isNaN_(g) || g < 0 || g > 1) {
                return this.ag;
            }
            let h = g * (this.p.count - 1);
            if (this.n == 2 || this.n == 1) {
                let i = Math.floor(h);
                let j = Math.ceil(h);
                let k = this.p._inner[truncate(i)];
                let l = this.p._inner[truncate(j)];
                let m = h - i;
                let n = this.n == 2 ? 1 : 0;
                return ColorUtil.u(k, m, l, n);
            }
            else {
                let o = truncate(Math.round(h));
                return this.p._inner[o];
            }
        }
        providePalette(a) {
            let b = new ObservableColorCollection();
            for (let d = 0; d < a.length; d++) {
                let c = a[d];
                let e = ((() => {
                    let $ret = new Color();
                    $ret.colorString = c;
                    return $ret;
                })());
                b.add(e);
            }
            this.palette = b;
        }
    }
    CustomPaletteColorScale.$t = markType(CustomPaletteColorScale, 'CustomPaletteColorScale', ColorScale.$);
    CustomPaletteColorScale.$$p = markDep(DependencyProperty, PropertyMetadata, CustomPaletteColorScale, 'l', ['InterpolationMode', [ColorScaleInterpolationMode_$type, enumGetBox(ColorScaleInterpolationMode_$type, 0)], 'MaximumValue', [1, NaN], 'MinimumValue', [1, NaN]]);
    return CustomPaletteColorScale;
})();
