/*
 * Copyright (c) 2014, 2015 Eike Stepper (Berlin, Germany) and others.
 * 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.oomph.setup.internal.core.util;

import org.eclipse.oomph.setup.InstallationTask;
import org.eclipse.oomph.setup.ProductCatalog;
import org.eclipse.oomph.setup.SetupFactory;
import org.eclipse.oomph.setup.SetupPackage;
import org.eclipse.oomph.setup.SetupTask;
import org.eclipse.oomph.setup.User;
import org.eclipse.oomph.setup.internal.core.SetupContext;
import org.eclipse.oomph.setup.internal.core.SetupCorePlugin;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.URIHandlerImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Eike Stepper
 */
public class UserURIHandlerImpl extends URIHandlerImpl
{
  private static final String FEATURE_PATTERN_SUFFIX = "='([^']*)'";

  private static final Pattern CLASS_PATTERN = Pattern.compile("class" + FEATURE_PATTERN_SUFFIX);

  public UserURIHandlerImpl()
  {
  }

  @Override
  public boolean canHandle(URI uri)
  {
    return SetupContext.isUserScheme(uri.scheme());
  }

  @Override
  public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    if (!uriConverter.exists(normalizedURI, options))
    {
      create(uri, normalizedURI);
    }

    return uriConverter.createInputStream(normalizedURI, options);
  }

  @Override
  public OutputStream createOutputStream(URI uri, Map<?, ?> options) throws IOException
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    return uriConverter.createOutputStream(normalizedURI, options);
  }

  @Override
  public void delete(URI uri, Map<?, ?> options) throws IOException
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    uriConverter.delete(normalizedURI, options);
  }

  @Override
  public Map<String, ?> contentDescription(URI uri, Map<?, ?> options) throws IOException
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    if (!uriConverter.exists(normalizedURI, options))
    {
      create(uri, normalizedURI);
    }

    return uriConverter.contentDescription(normalizedURI, options);
  }

  @Override
  public boolean exists(URI uri, Map<?, ?> options)
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    return uriConverter.exists(normalizedURI, options) || create(uri, normalizedURI);
  }

  @Override
  public Map<String, ?> getAttributes(URI uri, Map<?, ?> options)
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    if (!uriConverter.exists(normalizedURI, options))
    {
      create(uri, normalizedURI);
    }

    return uriConverter.getAttributes(normalizedURI, options);
  }

  @Override
  public void setAttributes(URI uri, Map<String, ?> attributes, Map<?, ?> options) throws IOException
  {
    URI normalizedURI = SetupContext.resolveUser(uri);
    URIConverter uriConverter = getURIConverter(options);
    if (!uriConverter.exists(normalizedURI, options))
    {
      create(uri, normalizedURI);
    }

    uriConverter.setAttributes(normalizedURI, attributes, options);
  }

  private boolean create(URI uri, URI normalizedURI)
  {
    String query = uri.query();
    if (query != null)
    {
      Resource resource = SetupCoreUtil.createResourceSet().createResource(normalizedURI);

      String decodedQuery = URI.decode(query);

      Matcher classMatcher = CLASS_PATTERN.matcher(decodedQuery);
      URI classURI = URI.createURI(classMatcher.find() ? classMatcher.group(1) : SetupPackage.eNS_URI + "#//Project");

      EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(classURI.trimFragment().toString());
      if (ePackage == null)
      {
        throw new IllegalArgumentException("No package registered for " + classURI);
      }

      EObject eObject = ePackage.eResource().getEObject(classURI.fragment());
      if (eObject instanceof EClass)
      {
        EClass eClass = (EClass)eObject;
        EObject instance = EcoreUtil.create(eClass);

        for (EAttribute eAttribute : eClass.getEAllAttributes())
        {
          if (!eAttribute.isMany())
          {
            Pattern pattern = Pattern.compile(eAttribute.getName() + FEATURE_PATTERN_SUFFIX);
            Matcher matcher = pattern.matcher(decodedQuery);
            if (matcher.find())
            {
              String value = matcher.group(1);
              instance.eSet(eAttribute, EcoreUtil.createFromString(eAttribute.getEAttributeType(), value));
            }
          }
        }

        if (instance instanceof ProductCatalog)
        {
          ProductCatalog productCatalog = (ProductCatalog)instance;
          EList<SetupTask> setupTasks = productCatalog.getSetupTasks();
          InstallationTask installationTask = SetupFactory.eINSTANCE.createInstallationTask();
          installationTask.setID("installation");
          setupTasks.add(installationTask);
        }

        resource.getContents().add(instance);
      }
      else
      {
        throw new IllegalArgumentException("No class registered for " + classURI);
      }

      return saveResource(resource);
    }

    if (SetupContext.USER_SETUP_URI.equals(uri))
    {
      User user = SetupContext.createUser();
      Resource resource = SetupCoreUtil.createResourceSet().createResource(normalizedURI);
      resource.getContents().add(user);
      return saveResource(resource);
    }

    return false;
  }

  private static boolean saveResource(Resource resource)
  {
    try
    {
      resource.save(null);
      return true;
    }
    catch (IOException ex)
    {
      SetupCorePlugin.INSTANCE.log(ex);
      return false;
    }
  }
}
