/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.model.internal.mergers;

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

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jst.javaee.core.EjbLocalRef;
import org.eclipse.jst.javaee.core.EjbRef;

/**
 * EjbRef and EjbLocalRef merger.
 * 
 * @author Dimitar Giormov
 */
public class EJBRefsMerger extends BaseRefsMerger {
    
    /**
     * Constructor for the EjbRefs merger.
     * 
     * @param _baseEjbRefs - base list of references that have higher priority and are result of the merge.
     * @param _toMergeEjbRefs - toMerge list of references
     */
    public EJBRefsMerger(List _baseEjbRefs, List _toMergeEjbRefs) {
        super(_baseEjbRefs, _toMergeEjbRefs);
        
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jst.javaee.ejb.model.mergers.common.ModelElementsMerger#process()
     */
    @Override
	public List process() throws ModelException {
        List warnings = new ArrayList();
        if (getToMergeElemets() == null || getToMergeElemets().isEmpty()){
          return warnings;
        }
        
        for (Object object : getToMergeElemets()) {
          Object findMatchingRef = null;
          if(object instanceof EjbLocalRef){
            findMatchingRef = findMatchingLocalRef(getBaseElements(), object);
          } else {
            findMatchingRef = findMatchingRef(getBaseElements(), object);
          }
          if (findMatchingRef != null){
            copyMissingPropertesInBase(findMatchingRef, object);
          } else{
            getBaseElements().add(EcoreUtil.copy((EObject) object));
          }
          
          
        }

        
        return warnings;
    }

    private static EjbRef findMatchingRef(List xmlRefs,
            Object ref) throws ModelException {
    	EjbRef result = null;
        for (Object currentXMLRef: xmlRefs) {
            if (isMatchingRef(currentXMLRef, ref)) {
                result = (EjbRef) currentXMLRef;
                break;
            }
        }
        return result;
    }
    
    private static EjbLocalRef findMatchingLocalRef(List xmlRefs,
        Object ref) throws ModelException {
      EjbLocalRef result = null;
    for (Object currentXMLRef: xmlRefs) {
        if (isMatchingRef(currentXMLRef, ref)) {
            result = (EjbLocalRef) currentXMLRef;
            break;
        }
    }
    return result;
}

    private static boolean isMatchingRef(Object xmlRef,
            Object annotatedRef) throws ModelException {
        boolean result = false;
        String xmlRefName = (xmlRef instanceof EjbRef) ? ((EjbRef)xmlRef).getEjbRefName() : ((EjbLocalRef)xmlRef).getEjbRefName();
        String annotatedRefName = (annotatedRef instanceof EjbRef) ? ((EjbRef)annotatedRef).getEjbRefName() : ((EjbLocalRef)annotatedRef).getEjbRefName();
        if (xmlRefName.equals(annotatedRefName)) {
//            if(!isMatchingTargetBean(xmlRef, annotatedRef)){
//            	//TODO   check if correct
//            	return false;
//            }
            result = true;
        }

        return result;
    }

    @Override
	protected void copyMissingPropertesInBase(Object base, Object toMerge) {
	  if(base instanceof EjbRef){
	    copyEjbRefPropsInBase((EjbRef)base, (EjbRef)toMerge);
	  } else if (base instanceof EjbLocalRef){
	    copyEjbLocalRefPropsInBase((EjbLocalRef)base, (EjbLocalRef)toMerge);
	  }
	}

  private void copyEjbLocalRefPropsInBase(EjbLocalRef base, EjbLocalRef toMerge) {
    if (base.getEjbLink() == null){
      base.setEjbLink(toMerge.getEjbLink());
    }
    
    if (base.getMappedName() == null){
      base.setMappedName(toMerge.getMappedName());
    }
    
    if (!base.isSetEjbRefType()){
      base.setEjbRefType(toMerge.getEjbRefType());
    }
    
    if (base.getLocal() == null){
      base.setLocal(toMerge.getLocal());
    }
    
    if (base.getLocalHome() == null){
      base.setLocalHome(toMerge.getLocalHome());
    }
    
  }

  private void copyEjbRefPropsInBase(EjbRef base, EjbRef toMerge) {
    if (base.getEjbLink() == null){
      base.setEjbLink(toMerge.getEjbLink());
    }
    
    if (base.getMappedName() == null){
      base.setMappedName(toMerge.getMappedName());
    }
    
    if (!base.isSetEjbRefType()){
      base.setEjbRefType(toMerge.getEjbRefType());
    }
    
    if (base.getRemote() == null){
      base.setRemote(toMerge.getRemote());
    }
    
    if (base.getHome() == null){
      base.setHome(toMerge.getHome());
    }
    
  }
}
