package de.dhbwstuttgart.strucTypes3;

import java.util.HashMap;
import java.util.Map;

import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.syntaxtree.Field;
import de.dhbwstuttgart.syntaxtree.FormalParameter;
import de.dhbwstuttgart.syntaxtree.Method;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;

public class AssumptionGenerator {

	/*
	 * Generiert die Assumptions einer Klasse
	 */
	public static AssTuple generateAssumptions(ClassOrInterface cl) {

		// Erstellen der Assumptions
		// (Assumption für die Argumente der Methode werden gleich
		// miterstellt)

		// Assumptions
		Map<String, RefTypeOrTPHOrWildcardOrGeneric> fAss = new HashMap<>();
		Map<String, RefTypeOrTPHOrWildcardOrGeneric> mAss = new HashMap<>();
		// Assumptions für die MethodenParameter
		Map<Method, Map<String, RefTypeOrTPHOrWildcardOrGeneric>> argAss = new HashMap<>();

		AssTuple assAll = new AssTuple(fAss, mAss, argAss);

		// Extraktion aller Typen der Methoden

		// Assumptions für Felder 
		for (Field f : cl.getFieldDecl()) {
			String fieldname = f.getName();
			String type = f.getType().toString();
			fAss.put(fieldname, f.getType());
			System.out.println(String.format("Feldname: %s Typ: %s", fieldname, type));
		}

		
		// Assumptions für Methoden 
		for (Method m : cl.getMethods()) {
			String methodName = m.getName();
			String returnType = m.getType().toString();
			mAss.put(methodName, m.getType());

			String typeArg = "";
			Map<String, RefTypeOrTPHOrWildcardOrGeneric> ass = new HashMap<>();
			for (FormalParameter p : m.getParameterList().getFormalparalist()) {
				String pName = p.getName();
				String pType = p.getType().toString();
				typeArg = typeArg + String.format("%s :%s  ", pName, pType);
				ass.put(p.getName(), p.getType());
			}
			argAss.put(m, ass);
			System.out.println(String.format("Methodenname: %s , Arguments: %s ->  ReturnType %s ", methodName, typeArg,
					returnType));
		}		
		
		// Assumption für die eingene aktuelle Klasse
		fAss.put("this", cl.getType()); 
		
		
		
		return assAll;
	}

}
