package org.ntlab.rdlcanvas.generaterdl;

import org.ntlab.rdlcanvas.models.*;

import java.util.ArrayList;
import java.util.Arrays;

public class MetaScreenViewGenerateRDL extends BaseMetaGenerateRDL{

    public MetaScreenViewGenerateRDL(RDLSpec spec){
        addScreenViewResourceDeclaration(spec);
        addScreenViewFormula(spec);
    }

    private void addScreenViewResourceDeclaration(RDLSpec spec){

        // ex curWidget(1)::struct
        addResourceDeclaration(spec, "curWidget", 1, StructuralType.structure, null);
        addResourceDeclaration(spec, "curWId", 1, StructuralType.id, RDLSpecLang.typeString);
        addResourceDeclaration(spec, "curWText", 1, RDLSpecLang.typeString);
        addResourceDeclaration(spec, "curWState", 1, RDLSpecLang.typeString);
        addResourceDeclaration(spec, "curScId", 0, StructuralType.id, RDLSpecLang.typeString);

    }

    private void addScreenViewFormula(RDLSpec spec){

        // ex curWidget:curWId
        addElementPairDependencyFormula(spec, "curWidget", false, "curWId", false);
        addElementPairDependencyFormula(spec, "curWidget", false, "curWId", true);
        addElementPairDependencyFormula(spec, "curWText", false, "curWidget", false);
        addElementPairDependencyFormula(spec, "curWState", false, "curWidget", false);


        addScreenViewEquationFormula(spec);

    }

    // curWidget = [[widget:wId->curWId]:scId->curScId, curWId->curWId]
    private void addScreenViewEquationFormula(RDLSpec spec){
        RDLSpecDependencyTerm insideDependencyTerm = new RDLSpecDependencyTerm(spec.getRDLSpecResourceDeclaration("widget").getResource(), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("wId").getResource())), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("curWId").getResource())));
        RDLSpecDependencyTerm outsideDependencyTerm = new RDLSpecDependencyTerm(insideDependencyTerm, new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("scId").getResource(), spec.getRDLSpecResourceDeclaration("curWId").getResource())), new ArrayList<>(Arrays.asList(spec.getRDLSpecResourceDeclaration("curScId").getResource(), spec.getRDLSpecResourceDeclaration("curWId").getResource())));
        RDLSpecEquationFormula rdlSpecEquationFormula = new RDLSpecEquationFormula(spec.getRDLSpecResourceDeclaration("curWidget").getResource(), outsideDependencyTerm);
        spec.addRDLSpecStatement(rdlSpecEquationFormula);

    }

}
