package org.ntlab.rdlcanvas.generaterdl;

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

import java.io.BufferedReader;
import java.util.Map;

public class GenerateRDL {

    //screenのJsonとtableのJsonをまとめてreturnする用
    private record SeparatedJsonValue(Value screen, Value table){}

    RDLSpec spec = new RDLSpec();

    public GenerateRDL() {
        Parser parser = new Parser();
        MetaScreenGenerateRDL metaScreenGenerateRDL = new MetaScreenGenerateRDL(spec);
        MetaTableGenerateRDL metaTableGenerateRDL = new MetaTableGenerateRDL(spec);
        MetaScreenViewGenerateRDL metaScreenViewGenerateRDL = new MetaScreenViewGenerateRDL(spec);
        ScreenGenerateRDL screenGenerateRDL = new ScreenGenerateRDL(parser.getValue(), spec);

        System.out.println(spec.toString());
    }

    public GenerateRDL(final BufferedReader reader) {
        Parser parser = new Parser(reader);

        //メタアプリケーション仕様
        MetaScreenGenerateRDL metaScreenGenerateRDL = new MetaScreenGenerateRDL(spec);
        MetaTableGenerateRDL metaTableGenerateRDL = new MetaTableGenerateRDL(spec);
        MetaScreenViewGenerateRDL metaScreenViewGenerateRDL = new MetaScreenViewGenerateRDL(spec);

        //JsonをScreen部分とTable部分に分割
        SeparatedJsonValue separatedJson = separateJsonValue(parser.getValue());

        //アプリケーション固有仕様
        ScreenGenerateRDL screenGenerateRDL = new ScreenGenerateRDL(separatedJson.screen, spec);
        TableGenerateRDL tableGenerateRDL = new TableGenerateRDL(separatedJson.table, spec);

        System.out.println(spec.toString());
        spec.outputConstant(); //デバッグ用
    }

    //一つのJsonValueからScreenとTableにそれぞれValueを分割
    private SeparatedJsonValue separateJsonValue(Value parserValue) {
        Map<StringValue, Value> jsonmap = ((JsonValue) parserValue).getJson();

        Value screenValue = null;
        Value tableValue = null;

        for (StringValue key : jsonmap.keySet()) {
            if (key.getStringValue().equals("screen")) {
                screenValue = jsonmap.get(key);
            } else if (key.getStringValue().equals("table")) {
                tableValue = jsonmap.get(key);
            }
        }

        return new SeparatedJsonValue(screenValue, tableValue);
    }
}

