/**
 * <copyright>
 * 
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.emf.pattern.base;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import org.eclipse.egf.core.EGFCorePlugin;
import org.eclipse.egf.model.pattern.PatternContext;
import org.eclipse.egf.model.pattern.PatternExecutionReporter;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.common.util.URI;
import org.eclipse.osgi.util.NLS;

/**
 * @author Matthieu Helleboid
 * 
 */
public abstract class CodegenPatternExecutionReporter implements PatternExecutionReporter {

  protected GenModel genModel;

  public void executionFinished(String output, PatternContext context) {
    // Nothing to do
  }

  public void loopFinished(String output, String outputWithCallBack, PatternContext context, Map<String, Object> parameterValues) {
    genModel = (GenModel) context.getValue("genModel"); //$NON-NLS-1$

    if (genModel == null)
      throw new IllegalStateException("Variable genModel must be set."); //$NON-NLS-1$
  }

  protected void generateText(String output, PatternContext context) {
    String targetPathName = (String) context.getValue("targetPathName"); //$NON-NLS-1$
    Boolean overwrite = (Boolean) context.getValue("overwrite"); //$NON-NLS-1$
    String encoding = (String) context.getValue("encoding"); //$NON-NLS-1$

    if (targetPathName == null)
      throw new IllegalStateException("Variable targetPath must be set."); //$NON-NLS-1$
    if (overwrite == null)
      throw new IllegalStateException("Variable overwrite must be set."); //$NON-NLS-1$
    if (encoding == null)
      throw new IllegalStateException("Variable encoding must be set."); //$NON-NLS-1$

    new CodegenGeneratorAdapter(genModel).generateText(targetPathName, overwrite, encoding, output);
  }

  protected void generateProperties(String output, PatternContext context) {
    String targetPathName = (String) context.getValue("targetPathName"); //$NON-NLS-1$

    if (targetPathName == null)
      throw new IllegalStateException("Variable targetPath must be set."); //$NON-NLS-1$

    new CodegenGeneratorAdapter(genModel).generateProperties(targetPathName, output);
  }

  protected void generateJava(String output, PatternContext context) {
    String targetPath = (String) context.getValue("targetPath"); //$NON-NLS-1$
    String packageName = (String) context.getValue("packageName"); //$NON-NLS-1$
    String className = (String) context.getValue("className"); //$NON-NLS-1$ 

    if (targetPath == null)
      throw new IllegalStateException("Variable targetPath must be set."); //$NON-NLS-1$
    if (packageName == null)
      throw new IllegalStateException("Variable packageName must be set."); //$NON-NLS-1$
    if (className == null)
      throw new IllegalStateException("Variable className must be set."); //$NON-NLS-1$

    CodegenGeneratorAdapter generator = new CodegenGeneratorAdapter(genModel);
    generator.setMergeRulesURI(normalizeAndCheckURI((URI) context.getValue("mergeRulesURI"))); //$NON-NLS-1$
    generator.generateJava(targetPath, packageName, className, output);
  }

  /*
   * Computes the bundle uri
   */
  protected URI normalizeAndCheckURI(URI uri) {
    if (uri == null) {
      return null;
    }
    // TODO: We should handle relative path to its fcore resource
    try {
      InputStream inputStream = EGFCorePlugin.getTargetPlatformURIConverter().createInputStream(uri);
      inputStream.close();
    } catch (IOException ioe) {
      Activator.getDefault().logError(NLS.bind("Unable to locate URI ''{0}''", uri), ioe); //$NON-NLS-1$
      return null;
    }
    return uri;
  }

  protected void generateGIF(String output, PatternContext context) {
    // Nothing to do (done in patterns)
  }

}
