/*
 * Copyright (c) 2022 Eike Stepper (Loehne, 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.lm.ui.actions;

import org.eclipse.emf.cdo.lm.LMFactory;
import org.eclipse.emf.cdo.lm.ModuleType;
import org.eclipse.emf.cdo.lm.Process;
import org.eclipse.emf.cdo.lm.System;
import org.eclipse.emf.cdo.lm.client.ISystemDescriptor;
import org.eclipse.emf.cdo.lm.client.ISystemManager;
import org.eclipse.emf.cdo.lm.provider.LMEditPlugin;
import org.eclipse.emf.cdo.lm.ui.actions.NewStreamAction.CommonStreamParameters;

import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPage;

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

/**
 * @author Eike Stepper
 */
public class NewModuleAction extends LMAction<System>
{
  private static final ModuleType NO_MODULE_TYPE = LMFactory.eINSTANCE.createModuleType("");

  private ISystemDescriptor systemDescriptor;

  private String name;

  private ModuleType type;

  private CommonStreamParameters<System> streamParameters;

  public NewModuleAction(IWorkbenchPage page, System system)
  {
    super(page, //
        "New Module" + INTERACTIVE, //
        "Add a new module to system '" + system.getName() + "'", //
        ExtendedImageRegistry.INSTANCE.getImageDescriptor(LMEditPlugin.INSTANCE.getImage("full/obj16/Module")), //
        "Add a new module to system '" + system.getName() + "'.", //
        "icons/NewModule.png", //
        system);
  }

  @Override
  protected void preRun() throws Exception
  {
    System system = getContext();
    systemDescriptor = ISystemManager.INSTANCE.getDescriptor(system);

    Process process = system.getProcess();
    Version initialModuleVersion = process.getInitialModuleVersion();
    if (initialModuleVersion == null)
    {
      streamParameters = new CommonStreamParameters<>(this, 0, 1);
    }
    else
    {
      streamParameters = new CommonStreamParameters<>(this, //
          (int)initialModuleVersion.getSegment(0), //
          (int)initialModuleVersion.getSegment(1));
    }

    super.preRun();
  }

  @Override
  protected void fillDialogArea(LMDialog dialog, Composite parent)
  {
    {
      Label label = new Label(parent, SWT.NONE);
      label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).create());
      label.setText("Name:");

      Text text = new Text(parent, SWT.BORDER | SWT.SINGLE);
      text.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).create());
      text.addModifyListener(e -> {
        name = text.getText();
        validateDialog();
      });
    }

    List<ModuleType> moduleTypes = systemDescriptor.getSystem().getProcess().getModuleTypes();
    if (!moduleTypes.isEmpty())
    {
      moduleTypes = new ArrayList<>(moduleTypes);
      moduleTypes.add(NO_MODULE_TYPE);

      Label label = new Label(parent, SWT.NONE);
      label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).create());
      label.setText("Type:");

      ComboViewer comboViewer = new ComboViewer(parent, SWT.READ_ONLY);
      comboViewer.setLabelProvider(new ModuleTypeLabelProvider());
      comboViewer.setContentProvider(new ArrayContentProvider());
      comboViewer.setInput(moduleTypes);
      comboViewer.addSelectionChangedListener(new ISelectionChangedListener()
      {
        @Override
        public void selectionChanged(SelectionChangedEvent event)
        {
          Object selection = event.getStructuredSelection().getFirstElement();
          type = selection == NO_MODULE_TYPE ? null : (ModuleType)selection;
          validateDialog();
        }
      });
    }

    {
      Composite composite = new Composite(parent, SWT.NONE);
      composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).create());
      composite.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).align(SWT.FILL, SWT.CENTER).grab(true, false).create());

      Label separator1 = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
      separator1.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).create());

      Label label = new Label(composite, SWT.NONE);
      label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).create());
      int NamingStrategy;
      label.setText("Initial Stream");

      Label separator2 = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
      separator2.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).create());
    }

    streamParameters.fillDialogArea(parent);
  }

  @Override
  protected String doValidate(LMDialog dialog)
  {
    if (name == null || name.isEmpty())
    {
      return "A valid name must be entered.";
    }

    String result = streamParameters.validate();
    if (result != null)
    {
      return result;
    }

    return super.doValidate(dialog);
  }

  @Override
  protected void doRun(System system, IProgressMonitor monitor) throws Exception
  {
    systemDescriptor.createModule(name, type, streamParameters, monitor);
  }

  /**
   * @author Eike Stepper
   */
  private static final class ModuleTypeLabelProvider extends LabelProvider
  {
    public ModuleTypeLabelProvider()
    {
    }

    @Override
    public String getText(Object element)
    {
      if (element instanceof ModuleType)
      {
        ModuleType type = (ModuleType)element;
        return type.getName();
      }

      return super.getText(element);
    }
  }
}
