package de.dhbwstuttgart.typedeployment;

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

import de.dhbwstuttgart.typeinference.result.ResultPair;

public class TypeInsert {
    /**
     * point wird hauptsächlich zur Anzeige einer Annotation im Eclipse-plugin benutzt.
     */
    public final TypeInsertPoint point;
    Set<TypeInsertPoint> inserts;
    ResultPair<?, ?> resultPair;

    public TypeInsert(TypeInsertPoint point, Set<TypeInsertPoint> additionalPoints, ResultPair<?, ?> resultPair){
        this.point = point;
        inserts = additionalPoints;
        this.resultPair = resultPair;
    }

    public String insert(String intoSource){
        List<TypeInsertPoint> offsets = new ArrayList<>();
        String ret = point.insert(intoSource, offsets);
        offsets.add(point);
        for(TypeInsertPoint insertPoint : inserts){
            ret = insertPoint.insert(ret, offsets);
            offsets.add(insertPoint);
        }
        return ret;
    }

    public String getInsertString(){
        return point.getInsertString();
    }
    
    public ResultPair<?, ?> getResultPair() {
    	return this.resultPair;
    }
    
    /* PL 2018-06-18
     * Zwei TypeInsert's sind gleich, wenn ihre point's und ihre inserts' gleich sind 
     * eingefuegt damit man TypeReplaceMarker vergleichen kann
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
    	if(!(obj instanceof TypeInsert)) {
			return false;
    	}
    	else {
    		return ((TypeInsert)obj).point.equals(this.point);
    				
    	}			
    }
    public String toString() {
    	return point.toString();
    }
}
