package de.dhbwstuttgart.strucTypes3;

import java.util.List;

import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.syntaxtree.Field;
import de.dhbwstuttgart.syntaxtree.FieldDeclaration;
import de.dhbwstuttgart.syntaxtree.FormalParameter;
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
import de.dhbwstuttgart.syntaxtree.Method;
import de.dhbwstuttgart.syntaxtree.statement.Block;
import de.dhbwstuttgart.syntaxtree.statement.Expression;
import de.dhbwstuttgart.syntaxtree.statement.Return;
import de.dhbwstuttgart.syntaxtree.statement.Statement;


public class ToStringGenerator {

	public static String klasseToString(ClassOrInterface cl, AssTuple assAll) {

		// Als nächstes muss die Expression getypt werden

		for (Method m : cl.getMethods()) {
			Block block = m.get_Block();

			/*
			 * Wahrscheinlich ist der TPH des Blocks der wahre Typ und der Typ
			 * der methode kann auch kleiner sein
			 */
			System.out.println("Block" + block.getType().toString());

			// ein block hat einen TPH und eine Statement Liste
			// davon wird das erste statement genommen welches ein
			// Return Statement ist

			// TODO: check get 0
			Statement statement = block.getStatements().get(0);

			if (statement.getClass().equals(Return.class)) {
				Return rStatement = (Return) statement;
				Expression expression = rStatement.get_Expression();

				// An dieser Stelle muss ein Rekursiver Aufruf
				// möglich werden
				String exp = HelpMethoden.expression2String(expression);
				System.out.println("Expression:  " + exp);

				String exp_t = HelpMethoden.expression_typed2String(expression);
				System.out.println("Expression_typed: " + exp_t);

				List<ConstraintAbstract> constraints = HelpMethoden.TypeExpr(assAll, expression, m, cl);
				for (ConstraintAbstract c : constraints) {
					System.out.println(c.toString());
				}

			} else {
				System.err.println("Problem");
			}

		}
		
		return null; 
	}
	
	
	public static String interface2String(ClassOrInterface face) {
		
		
		
		// Ausgabe name
		String n = face.getClassName().toString(); 
		
		// Ausgabe Generics
		String generics = ""; 
		
		//for (  GenericTypeVar f   : face.getGenericDeclarationList()) {
			//generics = generics + " " +  f.toString(); 
		//}
		
		// Ausgabe der Felder 
		String felder = ""; 
		for (Field f : face.getFieldDecl()) {
			felder = f.toString(); 
		}
		
		// Ausgabe der Methoden
		String methods = ""; 
		for (Method m : face.getMethods()) {
			String mName = m.getName() +  " ( ";			
			//m.getParameterList().getFormalparalist().forEach((x) -> {  mName.concat(x.getName().toString());  });
			for (FormalParameter fp : m.getParameterList().getFormalparalist()) {
				mName = mName  + " "+ fp.getName(); 
			}
			methods = methods + mName + ") " ; 			
		}
		
		return String.format(" interface:   %s  %s  %s  %s  \n" , n, generics , felder, methods); 	
	}
	
	

}
