package de.dhbwstuttgart.strucTypes5.typeVars;


import de.dhbwstuttgart.strucTypes5.constraints.InterfaceForConstraint;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by sebastian on 15.04.17.
 */
public class MappingAltNeu {


        List<TypeVarAbstract> altList = new ArrayList<>();
        List<TypeVarAbstract> neuList = new ArrayList<>();

        public void addTypeVar(TypeVarAbstract alt, TypeVarAbstract neu) {
            altList.add(alt);

            // Versuch bereits bekannte Typen mitzunehmen
            // geht nur wenn dies auch dem TypeVarStore bekannt ist
            if (alt.getClass().equals(TypeVarType.class)) {
                neuList.add(alt);
            }
            else {
                neuList.add(neu);
            }
        }

        public TypeVarAbstract getNeu (TypeVarAbstract altTypeVar) {

            // Wenn der Typ bereits bekannt ist gebe ihn zurück
            if (altTypeVar instanceof  TypeVarRefType) {
                return altTypeVar;
            }
            else if (altTypeVar instanceof  TypeVarInterface) {
                TypeVarInterface strucType = (TypeVarInterface) altTypeVar;
                TypeVarAbstract name = strucType.getInterfaceForConstraint().getStrucType();
                List<TypeVarAbstract> neueGenerics = new ArrayList<>();
                List<TypeVarAbstract> alteGenerics = strucType.getInterfaceForConstraint().getGenerics();
                for (TypeVarAbstract tv : alteGenerics) {
                    neueGenerics.add(this.getNeu(tv));
                }

                InterfaceForConstraint interfaceForConstraint = new InterfaceForConstraint(name,neueGenerics);
                TypeVarInterface typeVarInterface = new TypeVarInterface(interfaceForConstraint);

                return typeVarInterface;
            }
            else if (altTypeVar instanceof TypeVar) {
                return neuList.get(altList.indexOf(altTypeVar));
            }
            else {
                System.err.println("kein TypeVarChange möglich " + MappingAltNeu.class.getName() );
                return altTypeVar;
            }

            // Wenn typ bereits bekannt ist
            //if (altTypeVar.getClass().equals(TypeVarType.class)) {
            //    return altTypeVar;
            //}

            // Typvariable nicht bekannt
            //if ( ! neuList.contains(altTypeVar)) {
            //   return altTypeVar;
            //}
            //System.out.println(altTypeVar);
        }
    }

