/*
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 { BuiltInFunctionBase } from "./BuiltInFunctionBase";
import { ExcelCalcValue } from "./ExcelCalcValue";
import { ExcelCalcErrorValue } from "./ExcelCalcErrorValue";
import { UltraCalcFunctionFact } from "./UltraCalcFunctionFact";
import { Stack$1 } from "igniteui-angular-core";
import { Number_$type, markType } from "igniteui-angular-core";
import { truncate, intDivide, isNaN_ } from "igniteui-angular-core";
/**
 * @hidden
 */
export class UltraCalcFunctionCombin extends BuiltInFunctionBase {
    evaluate(a, b) {
        let c = a.pop();
        if (c.isError) {
            return new ExcelCalcValue(c.toErrorValue());
        }
        let d = c._toDecimal2();
        c = a.pop();
        if (c.isError) {
            return new ExcelCalcValue(c.toErrorValue());
        }
        let e = c._toDecimal2();
        let f = truncate(d);
        let g = truncate(e);
        if (e < 0 || d < 0 || g < f) {
            return new ExcelCalcValue(new ExcelCalcErrorValue(4));
        }
        let h = UltraCalcFunctionCombin._am(g, f, false);
        if (isNaN_(h)) {
            return new ExcelCalcValue(new ExcelCalcErrorValue(4));
        }
        return new ExcelCalcValue(h);
    }
    static _am(a, b, c) {
        if (c) {
            a = a + b - 1;
        }
        if (a <= 170) {
            let d = UltraCalcFunctionFact._ak(a);
            let e = UltraCalcFunctionFact._ak(b);
            let f = a - b;
            let g = UltraCalcFunctionFact._ak(f);
            let h = d / (e * g);
            return h;
        }
        else {
            return UltraCalcFunctionCombin._an(a, b);
        }
    }
    static _an(a, b) {
        if (b > a) {
            return NaN;
        }
        if (UltraCalcFunctionCombin._ak == null) {
            UltraCalcFunctionCombin._ak = new Stack$1(Number_$type);
        }
        else {
            UltraCalcFunctionCombin._ak.g();
        }
        if (UltraCalcFunctionCombin._al == null) {
            UltraCalcFunctionCombin._al = new Stack$1(Number_$type);
        }
        else {
            UltraCalcFunctionCombin._al.g();
        }
        let c = 1;
        while (true) {
            if (b <= 0) {
                break;
            }
            if (b > intDivide(a, 2)) {
                b = a - b;
            }
            else {
                UltraCalcFunctionCombin._ak.h(b);
                UltraCalcFunctionCombin._al.h(a);
                a--;
                b--;
            }
        }
        while (UltraCalcFunctionCombin._al.f > 0) {
            let d = UltraCalcFunctionCombin._al.e();
            let e = UltraCalcFunctionCombin._ak.e();
            c = d * c / e;
        }
        return c;
    }
    get_name() {
        return "combin";
    }
    get name() {
        return this.get_name();
    }
    get_minArgs() {
        return 2;
    }
    get minArgs() {
        return this.get_minArgs();
    }
    get_maxArgs() {
        return 2;
    }
    get maxArgs() {
        return this.get_maxArgs();
    }
}
UltraCalcFunctionCombin.$t = markType(UltraCalcFunctionCombin, 'UltraCalcFunctionCombin', BuiltInFunctionBase.$);
UltraCalcFunctionCombin._ak = null;
UltraCalcFunctionCombin._al = null;
//# sourceMappingURL=UltraCalcFunctionCombin.js.map