/*
 * Copyright (c) 2013, 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.emf.cdo.spi.server;

import org.eclipse.emf.cdo.internal.server.bundle.CDOServerApplication;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.StoreThreadLocal;

import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.factory.ProductCreationException;

import org.eclipse.osgi.framework.console.CommandInterpreter;

import org.osgi.framework.Bundle;

import java.util.Dictionary;

/**
 * @author Eike Stepper
 * @since 4.3
 */
public abstract class CDOCommand extends org.eclipse.net4j.util.factory.Factory
{
  public static final String PRODUCT_GROUP = "org.eclipse.emf.cdo.server.commands";

  public static final String INDENT = "   "; //$NON-NLS-1$

  private static final CommandParameter[] NO_PARAMETERS = new CommandParameter[0];

  private final String description;

  private final CommandParameter[] parameters;

  private CommandInterpreter interpreter;

  public CDOCommand(String name, String description, CommandParameter... parameters)
  {
    super(PRODUCT_GROUP, name);
    this.description = description;
    this.parameters = parameters == null ? NO_PARAMETERS : parameters;
  }

  public CDOCommand(String name, String description)
  {
    this(name, description, NO_PARAMETERS);
  }

  public final CDOCommand create(String description) throws ProductCreationException
  {
    return this;
  }

  public final CommandInterpreter getInterpreter()
  {
    return interpreter;
  }

  public final void setInterpreter(CommandInterpreter interpreter)
  {
    this.interpreter = interpreter;
  }

  public final String getName()
  {
    return getType();
  }

  public final String getDescription()
  {
    return description;
  }

  public final CommandParameter[] getParameters()
  {
    return parameters;
  }

  public final String getSyntax()
  {
    StringBuilder builder = new StringBuilder();
    builder.append("cdo ");
    builder.append(getName());

    for (CommandParameter parameter : parameters)
    {
      builder.append(" ");
      if (parameter.isOptional())
      {
        builder.append("[");
      }

      builder.append("<");
      builder.append(parameter.getName());
      builder.append(">");

      if (parameter.isOptional())
      {
        builder.append("]");
      }
    }

    return builder.toString();
  }

  public final Object executeCommand(String cmd)
  {
    return interpreter.execute(cmd);
  }

  public final void print(Object o)
  {
    interpreter.print(o);
  }

  public final void println()
  {
    interpreter.println();
  }

  public final void println(Object o)
  {
    interpreter.println(o);
  }

  public final void printStackTrace(Throwable t)
  {
    interpreter.printStackTrace(t);
  }

  public final void printDictionary(Dictionary<?, ?> dic, String title)
  {
    interpreter.printDictionary(dic, title);
  }

  public final void printBundleResource(Bundle bundle, String resource)
  {
    interpreter.printBundleResource(bundle, resource);
  }

  public final void execute() throws Exception
  {
    int length = parameters.length;
    String[] args = new String[length];
    for (int i = 0; i < parameters.length; i++)
    {
      String arg;

      CommandParameter parameter = parameters[i];
      if (parameter.isOptional())
      {
        arg = nextArgumentOptional();
      }
      else
      {
        arg = nextArgument();
      }

      args[i] = arg;
    }

    execute(args);
  }

  public abstract void execute(String[] args) throws Exception;

  private String nextArgument()
  {
    String argument = interpreter.nextArgument();
    if (argument == null && parameters != null)
    {
      throw new CommandException("Syntax: " + getSyntax());
    }

    return argument;
  }

  private String nextArgumentOptional()
  {
    return interpreter.nextArgument();
  }

  public static CommandParameter[] parameters(CommandParameter parameter, CommandParameter[] parameters)
  {
    if (parameters == null || parameters.length == 0)
    {
      return new CommandParameter[] { parameter };
    }

    CommandParameter[] result = new CommandParameter[1 + parameters.length];
    result[0] = parameter;
    System.arraycopy(parameters, 0, result, 1, parameters.length);
    return result;
  }

  public static CommandParameter parameter(String name, boolean optional)
  {
    return new CommandParameter(name, optional);
  }

  public static CommandParameter parameter(String name)
  {
    return parameter(name, false);
  }

  public static CommandParameter optional(String name)
  {
    return parameter(name, true);
  }

  protected static String[] trimFirstArgument(String[] args)
  {
    int length = args.length - 1;
    String[] result = new String[length];
    System.arraycopy(args, 1, result, 0, length);
    return result;
  }

  /**
   * @author Eike Stepper
   */
  public static abstract class WithRepository extends CDOCommand
  {
    public WithRepository(String name, String description, CommandParameter... parameters)
    {
      super(name, description, parameters(parameter("repository-name"), parameters));
    }

    public WithRepository(String name, String description)
    {
      this(name, description, NO_PARAMETERS);
    }

    @Override
    public final void execute(String[] args) throws Exception
    {
      String repositoryName = args[0];
      InternalRepository repository = getRepository(repositoryName);
      if (repository == null)
      {
        throw new CommandException("Repository not found: " + repositoryName);
      }

      execute(repository, trimFirstArgument(args));
    }

    public abstract void execute(InternalRepository repository, String[] args) throws Exception;

    private InternalRepository getRepository(String name)
    {
      IManagedContainer container = CDOServerApplication.getContainer();
      for (Object element : container.getElements(RepositoryFactory.PRODUCT_GROUP))
      {
        if (element instanceof InternalRepository)
        {
          InternalRepository repository = (InternalRepository)element;
          if (repository.getName().equals(name))
          {
            return repository;
          }
        }
      }

      return null;
    }
  }

  /**
   * @author Eike Stepper
   */
  public static abstract class WithAccessor extends CDOCommand.WithRepository
  {
    public WithAccessor(String name, String description, CommandParameter... parameters)
    {
      super(name, description, parameters);
    }

    public WithAccessor(String name, String description)
    {
      this(name, description, NO_PARAMETERS);
    }

    @Override
    public final void execute(InternalRepository repository, String[] args) throws Exception
    {
      IStoreAccessor accessor = repository.getStore().getReader(null);
      StoreThreadLocal.setAccessor(accessor);

      try
      {
        execute(repository, accessor, args);
      }
      finally
      {
        StoreThreadLocal.release();
      }
    }

    public abstract void execute(InternalRepository repository, IStoreAccessor accessor, String[] args)
        throws Exception;
  }

  /**
   * @author Eike Stepper
   */
  public static final class CommandParameter
  {
    private final String name;

    private final boolean optional;

    public CommandParameter(String name, boolean optional)
    {
      this.name = name;
      this.optional = optional;
    }

    public String getName()
    {
      return name;
    }

    public boolean isOptional()
    {
      return optional;
    }
  }

  /**
   * @author Eike Stepper
   */
  public static final class CommandException extends RuntimeException
  {
    private static final long serialVersionUID = 1L;

    public CommandException(String message)
    {
      super(message);
    }
  }

  // /**
  // * @author Eike Stepper
  // */
  // public static abstract class Factory extends org.eclipse.net4j.util.factory.Factory
  // {
  // public Factory(String type)
  // {
  // super(CDOCommand.PRODUCT_GROUP, type);
  // }
  //
  // public abstract CDOCommand create(String description) throws ProductCreationException;
  // }
}
