package org.ntlab.rdlcanvas.generaterdl;

import org.ntlab.rdlcanvas.models.*;

import java.util.ArrayList;
import java.util.List;

public class BaseGenerateRDL {


    // name(order)::structuralType, valueType
    public static void addResourceDeclaration(RDLSpec spec, String name, int order, StructuralType structuralType, ValueType valueType){
        spec.addRDLSpecResourceDeclaration(name, order, structuralType, valueType);
        spec.addRDLSpecStatement(spec.getRDLSpecResourceDeclaration(name));
    }

    // name(order)::valueType
    public static void addResourceDeclaration(RDLSpec spec, String name, int order, ValueType valueType){
        spec.addRDLSpecResourceDeclaration(name, order, valueType);
        spec.addRDLSpecStatement(spec.getRDLSpecResourceDeclaration(name));
    }


    // depending:depended
    public static void addElementPairDependencyFormula(RDLSpec spec, String depending, boolean dependingPrimed, String depended, boolean dependedPrimed){

        List<RDLSpecEvaluatableTerm> dependedList = new ArrayList<>();

        if(dependedPrimed) {
            dependedList.add(spec.getRDLSpecResourceDeclaration(depended).getPrimedResource());
        } else {
            dependedList.add(spec.getRDLSpecResourceDeclaration(depended).getResource());
        }

        if(dependingPrimed){
            RDLSpecDependencyFormula rdlSpecDependencyFormula = new RDLSpecDependencyFormula(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getPrimedResource(), dependedList));
            spec.addRDLSpecStatement(rdlSpecDependencyFormula);
        } else {
            RDLSpecDependencyFormula rdlSpecDependencyFormula = new RDLSpecDependencyFormula(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedList));
            spec.addRDLSpecStatement(rdlSpecDependencyFormula);
        }

    }

    // [depending:depended]:outsideDepended
    public static void addNestedDependencyFormula(RDLSpec spec, String depending, boolean dependingPrimed, String depended, boolean dependedPrimed, String outsideDepended, boolean outsideDependedPrimed){
        List<RDLSpecEvaluatableTerm> dependedInsideList = new ArrayList<>();
        List<RDLSpecEvaluatableTerm> dependedOutsideList = new ArrayList<>();

        if(dependedPrimed){
            dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended).getPrimedResource());
        }else{
            dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended).getResource());
        }

        if(outsideDependedPrimed){
            dependedOutsideList.add(spec.getRDLSpecResourceDeclaration(outsideDepended).getPrimedResource());
        }else{
            dependedOutsideList.add(spec.getRDLSpecResourceDeclaration(outsideDepended).getResource());
        }

        if(dependingPrimed){
            spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getPrimedResource(), dependedInsideList) ,dependedOutsideList)));
        }else{
            spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedInsideList) ,dependedOutsideList)));
        }

    }
}
