package org.ntlab.rdlcanvas.generaterdl;

import org.ntlab.rdlcanvas.models.*;
import org.ntlab.rdlcanvas.parser.Value;

import java.util.ArrayList;

public class BaseGenerateRDL {

    public ValueType checkValueType(Value value) {
        if (value.getClass().getSimpleName().equals("StringValue")) {
            return RDLSpecLang.typeString;
        } else if (value.getClass().getSimpleName().equals("IntegerValue")) {
            return RDLSpecLang.typeInt;
        } else if (value.getClass().getSimpleName().equals("BooleanValue")) {
            return RDLSpecLang.typeBoolean;
        }
        return RDLSpecLang.typeDouble;
    }

    // [depending: insideDependedId -> insideArguments] : outsideDependedId -> outsideArguments]
    public RDLSpecDependencyTerm createNestedDependencyTerm(RDLSpec spec, String depending, String insideDependedId, boolean insideDependedIdPrime, String insideArgument, String outsideDependedId, boolean outsideDependedIdPrime, String outsideArgument){

        ArrayList<RDLSpecEvaluatableTerm> insideDependedResourceList = new ArrayList<>();
        ArrayList<RDLSpecEvaluatableTerm> insideArgumentsList = new ArrayList<>();
        ArrayList<RDLSpecEvaluatableTerm> outsideDependedResourceList = new ArrayList<>();
        ArrayList<RDLSpecEvaluatableTerm> outsideArgumentsList = new ArrayList<>();

        insideArgumentsList.add(spec.getConstant(insideArgument, spec.getRDLSpecResourceDeclaration(insideDependedId).getResource().getValueType()));
        outsideArgumentsList.add(spec.getConstant(outsideArgument, spec.getRDLSpecResourceDeclaration(outsideDependedId).getResource().getValueType()));

        if(insideDependedIdPrime){
            insideDependedResourceList.add(spec.getRDLSpecResourceDeclaration(insideDependedId).getPrimedResource());
        }else{
            insideDependedResourceList.add(spec.getRDLSpecResourceDeclaration(insideDependedId).getResource());
        }

        if(outsideDependedIdPrime){
            outsideDependedResourceList.add(spec.getRDLSpecResourceDeclaration(outsideDependedId).getPrimedResource());
        }else {
            outsideDependedResourceList.add(spec.getRDLSpecResourceDeclaration(outsideDependedId).getResource());
        }


        RDLSpecDependencyTerm insideDependencyTerm = new RDLSpecDependencyTerm(spec.getRDLSpecResourceDeclaration(depending).getResource(),  insideDependedResourceList, insideArgumentsList);
        RDLSpecDependencyTerm outsideDependencyTerm = new RDLSpecDependencyTerm(insideDependencyTerm, outsideDependedResourceList, outsideArgumentsList);


        return outsideDependencyTerm;
    }


}
