/*******************************************************************************
 * Copyright (c) 2008 Sonatype, Inc.
 * 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
 *******************************************************************************/

package org.eclipse.m2e.wtp;

import java.io.IOException;
import java.io.InputStream;

import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.MavenProjectUtils;
import org.eclipse.m2e.wtp.internal.Messages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * maven-acr-plugin (application client maven plugin) configuration model.
 *
 * @see <a href="http://maven.apache.org/plugins/maven-acr-plugin/acr-mojo.html">http://maven.apache.org/plugins/maven-acr-plugin/acr-mojo.html</a>
 *
 * @provisional This class has been added as part of a work in progress. 
 * It is not guaranteed to work or remain the same in future releases. 
 * For more information contact <a href="mailto:m2e-wtp-dev@eclipse.org">m2e-wtp-dev@eclipse.org</a>.
 * 
 * @author Fred Bricon
 */
public class AcrPluginConfiguration extends AbstractFilteringSupportMavenPlugin {
  
  private static final IProjectFacetVersion DEFAULT_APPCLIENT_FACET_VERSION = IJ2EEFacetConstants.APPLICATION_CLIENT_50;
  
  private static final int JEE_7_0_ID = 70;

  private static final Logger LOG = LoggerFactory.getLogger(AcrPluginConfiguration.class);
  
  final IMavenProjectFacade mavenProjectFacade;

  public AcrPluginConfiguration(IMavenProjectFacade facade) throws CoreException {

    MavenProject mavenProject = facade.getMavenProject(new NullProgressMonitor());
    if (JEEPackaging.APP_CLIENT != JEEPackaging.getValue(mavenProject.getPackaging())) {
    	throw new IllegalArgumentException(Messages.AcrPluginConfiguration_Error_Project_Not_appclient);
    }
    
    this.mavenProjectFacade = facade;
    Plugin plugin = mavenProject.getPlugin("org.apache.maven.plugins:maven-acr-plugin"); //$NON-NLS-1$
    if (plugin != null) {
      setConfiguration((Xpp3Dom) plugin.getConfiguration()); 
    }
  }

  public IProjectFacetVersion getFacetVersion() {
    IFile applicationClientXml = getApplicationClientXml();

    if(applicationClientXml != null && applicationClientXml.isAccessible()) {
      try {
        InputStream is = applicationClientXml.getContents();
        try {
          JavaEEQuickPeek jqp = new JavaEEQuickPeek(is);
          switch(jqp.getVersion()) {
            case J2EEVersionConstants.J2EE_1_2_ID:
              return IJ2EEFacetConstants.APPLICATION_CLIENT_12;
            case J2EEVersionConstants.J2EE_1_3_ID:
              return IJ2EEFacetConstants.APPLICATION_CLIENT_13;
            case J2EEVersionConstants.J2EE_1_4_ID:
              return IJ2EEFacetConstants.APPLICATION_CLIENT_14;
            case J2EEVersionConstants.JEE_5_0_ID:
              return IJ2EEFacetConstants.APPLICATION_CLIENT_50;
            case J2EEVersionConstants.JEE_6_0_ID:
              return IJ2EEFacetConstants.APPLICATION_CLIENT_60;
            case JEE_7_0_ID:
            	//This can only happen when run in WTP >= 3.5
            	//Don't use/create a static 1.7 facet version, it'd blow up WTP < 3.5
                return IJ2EEFacetConstants.APPLICATION_CLIENT_FACET.getVersion("7.0"); //$NON-NLS-1$
          }
        } finally {
          is.close();
        }
      } catch(IOException ex) {
        // expected
      } catch(CoreException ex) {
        // expected
      }
    }
   
    IProject project = mavenProjectFacade.getProject();
    //If no application-client.xml found, don't change existing facet version
    try {
        IFacetedProject fProject = ProjectFacetsManager.create(project);
        if (fProject != null && fProject.hasProjectFacet(IJ2EEFacetConstants.APPLICATION_CLIENT_FACET)) {
          return fProject.getProjectFacetVersion(IJ2EEFacetConstants.APPLICATION_CLIENT_FACET);
        }
    } catch (Exception e) {
        LOG.warn(NLS.bind(Messages.Error_Reading_Project_Facet, project.getName()), e); 
    }      

    
    //If no application-client.xml found and the project depends on some java EE 6 jar then set application client facet to 6.0
    //FIXME this is totally arbitrary. Need to find a better solution.
    if (WTPProjectsUtil.hasInClassPath(mavenProjectFacade.getProject(), "javax.servlet.annotation.WebServlet")) { //$NON-NLS-1$
      return IJ2EEFacetConstants.APPLICATION_CLIENT_60;
    }
    
    return DEFAULT_APPCLIENT_FACET_VERSION; 
  }
  
  /**
   * @return the first application-client.xml file found under META-INF, in all the resource folders.
   */
  public IFile getApplicationClientXml() {
    IProject project = mavenProjectFacade.getProject();
    String contentDir = null;
    for (IPath path : mavenProjectFacade.getResourceLocations()) {
      contentDir = path.toPortableString()+"/META-INF"; //$NON-NLS-1$
      IFile applicationClientXml = project.getFolder(contentDir).getFile("application-client.xml"); //$NON-NLS-1$
      if (applicationClientXml.exists()) {
        return applicationClientXml;
      }
    }
    return null;
  }
  
  /**
   * @return the first resource location directory declared in pom.xml
   */
  public String getContentDirectory(IProject project) {
    IPath[] resources = MavenProjectUtils.getResourceLocations(project, mavenProjectFacade.getMavenProject().getResources());
    return resources[0].toPortableString();
  }
  
  @Override
protected String getFilteringAttribute() {
    return "filterDeploymentDescriptor"; //$NON-NLS-1$
  }

}
