/*******************************************************************************
 * Copyright (c) 2004-2008 Akos Horvath, Gergely Varro and Daniel Varro
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Akos Horvath, Gergely Varro - initial API and implementation
 *******************************************************************************/

 package org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.operation;

import org.eclipse.viatra2.core.IModelElement;
import org.eclipse.viatra2.core.IRelation;
import org.eclipse.viatra2.gtasm.patternmatcher.exceptions.PatternMatcherRuntimeException;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.EdgeType;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.MatchingFrame;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.PatternMatcherErrorStrings;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.searchgraph.SearchGraphEdge;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.AnnotatedElement;


public class ConstantToConstantCheckOperation extends EdgeConstraintCheckOperation {
    private IModelElement source;
    private IModelElement target;
    private SearchGraphEdge edge;
    
    
    public ConstantToConstantCheckOperation(IModelElement source, 
    		IModelElement target,
            SearchGraphEdge edge) {
        this.source = source;
        this.target = target;
        this.edge = edge;
    }

    protected boolean check(MatchingFrame frame) 
        throws PatternMatcherRuntimeException {
        if (source == null) {
        	String[] context = {edge.getTargetNode().getName(),getClass().getSimpleName()};
			throw new PatternMatcherRuntimeException(PatternMatcherErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,edge.getTargetNode().getTraceabilityElement().getRepresentativeEMFElement());
	
        }
        if (target == null) {
        	String[] context = {edge.getTargetNode().getName(),getClass().getSimpleName()};
			throw new PatternMatcherRuntimeException(PatternMatcherErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,edge.getTargetNode().getTraceabilityElement().getRepresentativeEMFElement());
	
        }

        if (edge.getVPMEdgeType() == EdgeType.INSTANCEOF && !edge.isSource()) {
            //return source.getAllTypes().contains(target);
            return source.isInstanceOf(target);
        } else if (edge.getVPMEdgeType() == EdgeType.INSTANCEOF && edge.isSource()) {
            //return source.getAllInstances().contains(target);
        	return target.isInstanceOf(source);
        } else if (edge.getVPMEdgeType() == EdgeType.SUPERTYPEOF && !edge.isSource()) {
            //return source.getAllSubtypes().contains(target);
            return target.isSubtypeOf(source);
        } else if (edge.getVPMEdgeType() == EdgeType.SUPERTYPEOF && edge.isSource()) {
            //return source.getAllSupertypes().contains(target);
        	return source.isSubtypeOf(target);
        } else if (edge.getVPMEdgeType() == EdgeType.SOURCE && !edge.isSource()) {
        	return (target instanceof IRelation ? 
                    ((IRelation) target).getFrom().equals(source) :
                        false);
        } else if (edge.getVPMEdgeType() == EdgeType.SOURCE && edge.isSource()) {
            return (source instanceof IRelation ?
                    ((IRelation) source).getFrom().equals(target) :
                        false);
        } else if (edge.getVPMEdgeType() == EdgeType.TARGET && !edge.isSource()) {
            return (target instanceof IRelation ?
                    ((IRelation) target).getTo().equals(source) :
                        false);
        } else if (edge.getVPMEdgeType() == EdgeType.TARGET && edge.isSource()) {
            return (source instanceof IRelation ? 
                    ((IRelation) source).getTo().equals(target) : 
                        false);
        } else if (edge.getVPMEdgeType() == EdgeType.IN && !edge.isSource()) {
            return source.getNamespace().compareTo(target) == 0;
        } else if (edge.getVPMEdgeType() == EdgeType.IN && edge.isSource()) {
            return target.getNamespace().compareTo(source) == 0;
        } else if (edge.getVPMEdgeType() == EdgeType.BELOW && !edge.isSource()) {
            return source.isBelowNamespace(target);
        } else if (edge.getVPMEdgeType() == EdgeType.BELOW && edge.isSource()) {
            return target.isBelowNamespace(source);
        }
        String [] context = {edge.getVPMEdgeType().toString(),getClass().getSimpleName()};
        throw new PatternMatcherRuntimeException(PatternMatcherErrorStrings.INTERNAL_OPERATION_NOT_SUPPORTED
                ,context
                ,edge.getTraceabilityElement().getRepresentativeEMFElement());
    }

    public String toString() {
		return getClass().getSimpleName() + " : " +
            source.getName() + " -- " + edge.getVPMEdgeType().name()+ " -> " + target.getName();
	}
    
    public AnnotatedElement getErrorfulElement(MatchingFrame frame) {
		return edge.getTraceabilityElement().getRepresentativeEMFElement();
	}
}
