/* import { ExpressParametro } from "../express/parametro.express"; */

import { ICommentato, tipo } from "../utility";
import { IMeta, ListaMeta, Meta } from "../metadata";



export interface IMetaParametroBesa {
    nomeVariante?: string;
    tipo?: tipo;
    descrizione?: string;
    sommario?: string;
    obbligatorio?: boolean;
}

export interface IMetaParametro extends IMeta {
    /** tipo di dato da trattare valore, da ricordarsi che vi sara il controllo sul tipo con le modalita classiche di comparazione base gia presenti in js */
    tipo?: tipo;
    /** parametro che rappresenta la sua posizione, viene impostato automaticamente, è coninvolto nel nome del parametro nella rotta */
    indexParameter?: number;
    /** fondamentalmente è rappresentativo del parametro e sara poi messo in documentazione,, questo sara il commento lungo presente nella descrizione. */
    descrizione?: string;
    /** altro compo che sara poi utile nella creazione della documentazione, questo sara il commento breve presente in intestazione*/
    sommario?: string;
    /**parametro che determina se obbligare la sua presenza, puo far terminare la chiamata con codice differenti da quelli previsti. */
    obbligatorio?: boolean;

    /*  parametroExpress?: ExpressParametro; */
}

export class MetadataParametro extends Meta implements IMetaParametro, ICommentato {

    tipo: tipo = 'any';
    indexParameter = -1;
    descrizione = '';
    sommario = '';
    obbligatorio = false;

    /* parametroExpress = new ExpressParametro(); */
    constructor(item: IMetaParametro) {
        super(item);
        if (item.tipo != undefined)
            this.tipo = item.tipo;
        if (item.indexParameter != undefined)
            this.indexParameter = item.indexParameter ?? -1;
        if (item.descrizione != undefined)
            this.descrizione = item.descrizione;
        if (item.sommario != undefined)
            this.sommario = item.sommario;
        if (item.obbligatorio != undefined)
            this.obbligatorio = item.obbligatorio ?? false;
    }
    Mergia(item: MetadataParametro) {
        super.Mergia(item)
        if (item.tipo != undefined)
            this.tipo = item.tipo;
        if (item.indexParameter != undefined)
            this.indexParameter = item.indexParameter ?? -1;
        if (item.descrizione != undefined)
            this.descrizione = item.descrizione;
        if (item.sommario != undefined)
            this.sommario = item.sommario;
        if (item.obbligatorio != undefined)
            this.obbligatorio = item.obbligatorio ?? false;
    }
    GetThis() { return this; }

}

export interface IListaMetadataParametro extends Array<IMetaParametro> {
    length: number;
}
export class ListaMetadataParametro extends ListaMeta {

    constructor(item?: ListaMetadataParametro) {
        super();
        if (item)
            for (let index = 0; index < item.length; index++) {
                const element = new MetadataParametro(item[index]);
                const tmp = this.Cerca(element);
                if (tmp) tmp.Mergia(element);
            }
    }
    Mergia(item: ListaMetadataParametro) {
        const t = super.Mergia(item);
        return t;
        /* for (let index = 0; index < item.length; index++) {
            const element = item[index];
            const elementoCercato = this.Cerca(element);
            if (elementoCercato == undefined) {
                const tmp = element;
                this.push(tmp);
            }
            else {
                elementoCercato.Mergia(elementoCercato);
            }
        } */
    }
    CercaSeNoAggiungi(item: MetadataParametro) {
        const t = super.CercaSeNoAggiungi(item);
        return t;
        /* let parametro = undefined;
        for (let index = 0; index < this.length && parametro == undefined; index++) {
            const element = this[index];
            if (Meta.Compara(element, item) == 0) parametro = element;
        }
        if (parametro == undefined) {
            if (item.GetThis) {
                parametro = <ExpressParametro>item.GetThis(item);
            }
            else {
                parametro = new MetadataParametro(item);
            }
            this.AggiungiElemento(parametro);
        }
        return parametro; */
    }
    Cerca(item: MetadataParametro): MetadataParametro | undefined {
        const t = super.Cerca(item);
        return <MetadataParametro>t;
        /* for (let index = 0; index < this.length; index++) {
            const element = this[index];
            if (Meta.Compara(element, item) == 0) return element;
        }
        return undefined; */
    }
    AggiungiElemento(item: MetadataParametro) {
        const t = super.AggiungiElemento(item);
        return t;
        /* for (let index = 0; index < this.length; index++) {
            const element = this[index];
            if (Meta.Compara(element, item) == 0) {
                this[index].Mergia(item);
                return this[index];
            }
        }
        this.push(item);
        return item; */
    }
}