package de.dhbwstuttgart.typeinference.result;

import de.dhbwstuttgart.exceptions.NotImplementedException;
import de.dhbwstuttgart.server.packet.dataContainers.ISerializableData;
import de.dhbwstuttgart.server.packet.dataContainers.KeyStorage;
import de.dhbwstuttgart.server.packet.dataContainers.serialized.SerialMap;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
import de.dhbwstuttgart.typeinference.unify.UnifyContext;

/**
 * enthaelt alle Paare, die in einem Ergebnis nicht vorkommen koennen
 * sie sind noetig fuer origPairs in PairTPHsmallerTPH, da hier auch
 * Paare vorkommen koennen die keine Result sind (z.B. bei FunN$$)
 */
public class PairNoResult extends ResultPair<RefTypeOrTPHOrWildcardOrGeneric, RefTypeOrTPHOrWildcardOrGeneric>
implements ISerializableData {
    //public final TypePlaceholder left;
    //public final TypePlaceholder right;
    
    /*
     * urspruengliches Paar aus diesem dieses Resultpair erzeugt wurde
     * wichtig fuer generated Generics
     */
    ResultPair<?,?> origPair;

    public PairNoResult(RefTypeOrTPHOrWildcardOrGeneric left, RefTypeOrTPHOrWildcardOrGeneric right){
        super(left, right);
    }

    /* noch nicht implementiert. */
    @Override
    public void accept(ResultPairVisitor visitor) {
    	throw new NotImplementedException();
        //visitor.visit(this);
    }

    @Override
    public SerialMap toSerial(KeyStorage keyStorage) {
        SerialMap serialized = new SerialMap();
        serialized.put("left", this.getLeft().toSerial(keyStorage));
        serialized.put("right", this.getRight().toSerial(keyStorage));
        // create the wrapper and put this as the object
        var serializedWrapper = super.toSerial(keyStorage);
        serializedWrapper.put("object", serialized);
        return serializedWrapper;
    }

    public static PairNoResult fromSerial2(SerialMap data, UnifyContext context) {
        SerialMap left = data.getMap("left");
        SerialMap right = data.getMap("right");
        return new PairNoResult(
          RefTypeOrTPHOrWildcardOrGeneric.fromSerial(left, context),
          RefTypeOrTPHOrWildcardOrGeneric.fromSerial(right, context)
        );
    }
}
