package org.ntlab.rdlcanvas.generaterdl;

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

import java.util.*;

public class ScreenGenerateRDL extends BaseGenerateRDL{

    // parser済みのJsonを引数とする
    public ScreenGenerateRDL(Value value, RDLSpec spec){
        //System.out.println(value.toString());
        addScreenRDL(value, spec);
    }

    // Jsonを構成するデータを抽出する
    private void addScreenRDL(Value value, RDLSpec spec){

        Map<StringValue, Value> screenMap = ((org.ntlab.rdlcanvas.parser.JsonValue)value).getJson();

        for (StringValue key1 : screenMap.keySet()){
            String scIdString = key1.getStringValue(); //ScreenIDをStringValue(key1)からStringに変換
            Value widgets = screenMap.get(key1);
            Map<StringValue, Value> widgetMap = ((org.ntlab.rdlcanvas.parser.JsonValue)widgets).getJson();

            for (StringValue key2 : widgetMap.keySet()){
                String wIdString = key2.getStringValue(); //widgetIDをStringValue(key2)からStringに変換
                Value metas = widgetMap.get(key2);
                Map<StringValue, Value> metaMap = ((org.ntlab.rdlcanvas.parser.JsonValue)metas).getJson();

                for (StringValue key3 : metaMap.keySet()){
                    String metaIdString = key3.getStringValue(); //MetaIDをStringValue(key3)からStringへ変換
                    Value data = metaMap.get(key3); //Dataを取得
//                    System.out.println(metaIdString);
                    addScreenDefinition(spec, metaIdString, "wId", false, wIdString, "scId", false, scIdString, data);
                }
            }
        }
        //spec.outputConstant(); //デバッグ用 Constantを出力
    }


    //ex [[wText : wId -> "editBotton"] : scId -> "一覧画面"] := "編集"
    private void addScreenDefinition(RDLSpec spec, String depending, String insideDependedId, boolean insideDependedIdPrime, String insideArgument, String outsideDependedId, boolean outsideDependedIdPrime, String outsideArguments, Value initializeValue){

        RDLSpecDependencyTerm left = createNestedDependencyTerm(spec, depending, insideDependedId, insideDependedIdPrime, insideArgument, outsideDependedId,outsideDependedIdPrime, outsideArguments);
        spec.addRDLSpecStatement(new RDLSpecInitialization(left, spec.getConstant(initializeValue.toString(), checkValueType(initializeValue))));
    }
}
