import { Result } from "../src/util/result";
import { Nub } from "../src/nub";
import { ComputeNodeType, ParamCalculability, ParamDefinition, ParamDomainValue, ParamsEquation } from "../src/param";

class NubTestParams extends ParamsEquation {
    private _A: ParamDefinition;
    private _B: ParamDefinition;
    private _C: ParamDefinition;

    constructor() {
        super();
        this._A = new ParamDefinition(ComputeNodeType.Test, "A", ParamDomainValue.POS_NULL, 1);
        this._B = new ParamDefinition(ComputeNodeType.Test, "B", ParamDomainValue.POS_NULL, 2);
        this._C = new ParamDefinition(ComputeNodeType.Test, "C", ParamDomainValue.POS_NULL, 3);

        this.addParamDefinition(this._A);
        this.addParamDefinition(this._B);
        this.addParamDefinition(this._C);
    }

    get A() {
        return this._A;
    }

    get B() {
        return this._B;
    }

    get C() {
        return this._C;
    }
}

export class NubTest extends Nub {
    constructor(prms: NubTestParams, dbg: boolean = false) {
        super(prms, dbg);
    }

    protected setParametersCalculability() {
        this.getParameter("A").calculability = ParamCalculability.DICHO;
        this.getParameter("B").calculability = ParamCalculability.DICHO;
        this.getParameter("C").calculability = ParamCalculability.EQUATION;
    }

    get prms(): NubTestParams {
        return this._prms as NubTestParams;
    }

    Equation(): Result {
        // C = A+B
        return new Result(this.prms.A.v + this.prms.B.v);
    }
}

export let nub = new NubTest(new NubTestParams());