import { Component, Output, EventEmitter } from "@angular/core";

import { PabResults } from "../../results/pab-results";
import { I18nService } from "../../services/internationalisation/internationalisation.service";
import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";

@Component({
    selector: "pab-variable-results-selector",
    templateUrl: "./pab-variable-results-selector.component.html",
    styleUrls: [
        "./pab-variable-results-selector.component.scss"
    ]
})
export class PabVariableResultsSelectorComponent {

    /** résultats non mis en forme */
    private _pabResults: PabResults;

    private _selectedValue: number;

    /** size of the longest variable value */
    private size = 0;

    /** inferred extended values list for each variating parameter */
    private varValues = [];

    @Output()
    protected indexChange = new EventEmitter();

    constructor(
        protected intlService: I18nService,
        protected appSetupService: ApplicationSetupService
    ) {
        this._selectedValue = 0;
    }

    public set results(r: PabResults) {
        this._pabResults = r;

        if (this._pabResults) {
            // pre-extract variable parameters values
            this.varValues = [];
            const nDigits = this.appSetupService.displayDigits;
            // find longest list
            this.size = 0;
            for (let i = 0; i < this._pabResults.variatedParameters.length; i++) {
                const vs = this._pabResults.variatedParameters[i].valuesIterator.count();
                if (vs > this.size) {
                    this.size = vs;
                }
            }
            // get extended values lists for each variable parameter
            for (const v of this._pabResults.variatedParameters) {
                const vv = [];
                const iter = v.getExtendedValuesIterator(this.size);
                while (iter.hasNext) {
                    const nv = iter.next();
                    vv.push(nv.value.toFixed(nDigits));
                }
                this.varValues.push(vv);
            }
        }
    }

    public get hasVariableResults(): boolean {
        return (
            this._pabResults
            && this._pabResults.hasResults
            && this._pabResults.variatedParameters.length > 0
        );
    }

    public get entries(): number[] {
        let i = 0;
        const entries: number[] = this._pabResults.variatedParameters[0].inferredValuesList.map((v) => {
            return i++;
        });
        return entries;
    }

    protected entryLabel(index: number): string {
        let i = 0;
        return this.varValues.map((vv) => {
            const vp = this._pabResults.variatedParameters[i];
            i++;
            let value = "0";
            value = vv[index];
            return `${vp.symbol} = ${value}`;
        }).join(", ");
    }

    public get selectedValue(): number {
        return this._selectedValue;
    }

    public set selectedValue(v: number) {
        this._pabResults.variableIndex = v;
        this.indexChange.emit();
    }

    public get label() {
        return this.intlService.localizeText("INFO_PARAMFIELD_BOUNDARY_CONDITIONS");
    }
}