/*
 * Copyright (c) 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.explorer.ui.checkouts.wizards;

import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager;
import org.eclipse.emf.cdo.explorer.repositories.CDORepository;
import org.eclipse.emf.cdo.internal.explorer.AbstractElement;
import org.eclipse.emf.cdo.internal.explorer.checkouts.CDOCheckoutImpl;

import org.eclipse.net4j.util.StringUtil;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Text;

import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

/**
 * @author Eike Stepper
 */
public class CheckoutLabelPage extends CheckoutWizardPage
{
  private String label;

  private Label repositoryLabel;

  private Label typeLabel;

  private Label branchLabel;

  private Label timeLabel;

  private Label rootLabel;

  private Text labelText;

  public CheckoutLabelPage()
  {
    super("Checkout Label", "Enter the label of the new checkout.");
  }

  public final String getLabel()
  {
    return label;
  }

  public final void setLabel(String label)
  {
    if (this.label != label)
    {
      log("Setting label to " + label);
      this.label = label;

      if (labelText != null)
      {
        labelText.setText(StringUtil.safe(label));
      }
    }
  }

  @Override
  protected Layout createCompositeLayout()
  {
    GridLayout gridLayout = new GridLayout(2, false);
    gridLayout.marginWidth = 0;
    gridLayout.marginHeight = 0;
    return gridLayout;
  }

  @Override
  protected void createUI(Composite parent)
  {
    new Label(parent, SWT.NONE).setText("Repository:");
    repositoryLabel = new Label(parent, SWT.NONE);
    repositoryLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(parent, SWT.NONE).setText("Type:");
    typeLabel = new Label(parent, SWT.NONE);
    typeLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(parent, SWT.NONE).setText("Branch:");
    branchLabel = new Label(parent, SWT.NONE);
    branchLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(parent, SWT.NONE).setText("Time:");
    timeLabel = new Label(parent, SWT.NONE);
    timeLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(parent, SWT.NONE).setText("Root:");
    rootLabel = new Label(parent, SWT.NONE);
    rootLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(parent, SWT.NONE).setText("Label:");
    labelText = new Text(parent, SWT.BORDER);
    labelText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    labelText.addModifyListener(new ModifyListener()
    {
      public void modifyText(ModifyEvent e)
      {
        validate();
      }
    });
  }

  @Override
  protected void repositoryChanged(CDORepository repository)
  {
    clearLabel();
    super.repositoryChanged(repository);
  }

  @Override
  protected void typeChanged(String type)
  {
    clearLabel();
    super.typeChanged(type);
  }

  @Override
  protected void branchPointChanged(int branchID, long timeStamp)
  {
    clearLabel();
    super.branchPointChanged(branchID, timeStamp);
  }

  @Override
  protected void rootObjectChanged(CDOID rootID)
  {
    clearLabel();
    super.rootObjectChanged(rootID);
  }

  @Override
  protected void pageActivated()
  {
    CheckoutWizard wizard = getWizard();
    repositoryLabel.setText(wizard.getRepositoryPage().getRepository().getLabel());
    typeLabel.setText(wizard.getTypePage().getType());

    CDOBranchPoint branchPoint = wizard.getBranchPointPage().getBranchPoint();
    branchLabel.setText(branchPoint.getBranch().getPathName());
    timeLabel.setText(CDOCommonUtil.formatTimeStamp(branchPoint.getTimeStamp()));

    String rootObjectText = wizard.getRootObjectPage().getRootObjectText();
    rootLabel.setText(rootObjectText);

    if (label == null)
    {
      Set<String> names = new HashSet<String>();

      CDOCheckoutManager checkoutManager = CDOExplorerUtil.getCheckoutManager();
      for (CDOCheckout checkout : checkoutManager.getCheckouts())
      {
        names.add(checkout.getLabel());
      }

      for (int i = 1; i < Integer.MAX_VALUE; i++)
      {
        String name = i == 1 ? rootObjectText : rootObjectText + " (" + i + ")";
        if (!names.contains(name))
        {
          setLabel(name);
          break;
        }
      }
    }

    labelText.setFocus();
    labelText.selectAll();
    super.pageActivated();
  }

  @Override
  protected boolean doValidate() throws ValidationProblem
  {
    if (StringUtil.isEmpty(label))
    {
      return false;
    }

    for (int i = 0; i < label.length(); i++)
    {
      char c = label.charAt(i);
      for (int j = 0; j < AbstractElement.ILLEGAL_LABEL_CHARACTERS.length(); j++)
      {
        if (c == AbstractElement.ILLEGAL_LABEL_CHARACTERS.charAt(j))
        {
          throw new ValidationProblem("Invalid character: " + AbstractElement.ILLEGAL_LABEL_CHARACTERS.substring(j, 1));
        }
      }
    }

    CDOCheckoutManager checkoutManager = CDOExplorerUtil.getCheckoutManager();
    for (CDOCheckout checkout : checkoutManager.getCheckouts())
    {
      if (label.equals(checkout.getLabel()))
      {
        throw new ValidationProblem("Label is not unique.");
      }
    }

    return true;
  }

  @Override
  protected void fillProperties(Properties properties)
  {
    properties.setProperty(CDOCheckoutImpl.PROP_LABEL, label);
  }

  private void clearLabel()
  {
    label = null;
    if (labelText != null)
    {
      labelText.setText("");
    }
  }

  public static String getUniqueLabel(String label)
  {
    Set<String> names = new HashSet<String>();

    CDOCheckoutManager checkoutManager = CDOExplorerUtil.getCheckoutManager();
    for (CDOCheckout checkout : checkoutManager.getCheckouts())
    {
      names.add(checkout.getLabel());
    }

    for (int i = 1; i < Integer.MAX_VALUE; i++)
    {
      String name = i == 1 ? label : label + " (" + i + ")";
      if (!names.contains(name))
      {
        return name;
      }
    }

    throw new IllegalStateException("Too many checkouts");
  }
}
