package de.dhbwstuttgart.strucTypes5.constraints;


import de.dhbwstuttgart.strucTypes5.typeVars.TypeVar;
import de.dhbwstuttgart.strucTypes5.typeVars.TypeVarAbstract;

/**
 * Created by sebastian on 20.04.17.
 */
public class ConstraintSubType extends ConstraintAbstract{

    // TODO Der SubtypeConstraint muss entweder eine Typvariable einen Typen oder ein Interface enthalten
    // TODO Hier muss ich mir das noch  überlegen wie es geht. Evtl ist eine TypeVarType nicht notwenidg
    // Eine Typvariable kann TypVar sein, ein Typ kann  auch eine TypVar sein , ein Interface kann was sein ?

    private TypeVarAbstract subtype;
    private TypeVarAbstract superType;

    public ConstraintSubType(TypeVarAbstract subtype, TypeVarAbstract superType) {
        this.subtype = subtype;
        this.superType = superType;
    }


    @Override
    public boolean replaceTypeVarAbstract(TypeVarAbstract alt, TypeVarAbstract neu) {
        if (subtype.equals(alt)) {
            subtype = ConstraintAbstract.helpChange(alt,neu,subtype);
        }
        if (superType.equals(alt)) {
            superType = ConstraintAbstract.helpChange(alt,neu,superType);
        }
        ConstraintAbstract.helpChange2(alt,neu,subtype);
        ConstraintAbstract.helpChange2(alt,neu,superType);
        return  true;
    }


    public TypeVarAbstract getSubtype() {
        return subtype;
    }

    public void setSubtype(TypeVarAbstract subtype) {
        this.subtype = subtype;
    }

    public TypeVarAbstract getSuperType() {
        return superType;
    }

    public void setSuperType(TypeVarAbstract superType) {
        this.superType = superType;
    }


    @Override
    public String toString() {
        return String.format("ConstraintSubType( %s <* %s )" , subtype , superType);
    }
}
