/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * 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:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.ui.define.dialogs;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.osee.framework.core.data.TestRunStorageKey;
import org.eclipse.osee.framework.core.model.Branch;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
import org.eclipse.osee.framework.ui.skynet.panels.BranchSelectSimpleComposite;
import org.eclipse.osee.framework.ui.swt.ImageManager;
import org.eclipse.osee.ote.ui.define.OteDefineImage;
import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

/**
 * @author Roberto E. Escobar
 */
public class BranchComboDialog extends TitleAreaDialog implements Listener {
   private static final Image TITLE_BAR_IMAGE = ImageManager.getImage(OteDefineImage.CHILD_BRANCH);
   private static final Image MESSAGE_IMAGE = ImageManager.getImage(OteDefineImage.COMMIT_WIZ);
   private static final String MESSAGE_TITLE = "Select a Working Branch";
   private static final String TITLE_BAR_TEXT = "Working Branch";
   private static final String MESSAGE = "Select a working branch";

   protected static final int COMBO_HISTORY_LENGTH = 5;

   private BranchSelectSimpleComposite branchSelectComposite;

   private BranchComboDialog(Shell parentShell) {
      super(parentShell);
   }

   @Override
   protected Control createDialogArea(Composite parent) {
      Composite content = (Composite) super.createDialogArea(parent);

      branchSelectComposite = BranchSelectSimpleComposite.createWorkingBranchSelectComposite(content, SWT.NONE);
      restoreWidgetValues();
      branchSelectComposite.addListener(this);
      setTitle(MESSAGE_TITLE);
      setTitleImage(MESSAGE_IMAGE);
      setMessage(MESSAGE);
      getShell().setText(TITLE_BAR_TEXT);
      getShell().setImage(TITLE_BAR_IMAGE);

      return branchSelectComposite;
   }

   @Override
   protected Control createButtonBar(Composite parent) {
      Control toReturn = super.createButtonBar(parent);
      checkState();
      return toReturn;
   }

   public Branch getSelection() {
      return branchSelectComposite.getSelectedBranch();
   }

   private boolean isValid() {
      return getSelection() != null;
   }

   private void checkState() {
      getButton(IDialogConstants.OK_ID).setEnabled(isValid());
      if (isValid() != true) {
         setErrorMessage("Branch cannot be empty.");
      } else {
         setErrorMessage(null);
      }
   }

   @Override
   protected void okPressed() {
      saveWidgetValues();
      super.okPressed();
   }

   @Override
   public void handleEvent(Event event) {
      checkState();
   }

   protected void restoreWidgetValues() {
      IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
      if (settings != null) {
         String[] branchUuids = settings.getArray(TestRunStorageKey.BRANCH_IDS);
         String lastSelected = settings.get(TestRunStorageKey.SELECTED_BRANCH_ID);
         branchSelectComposite.restoreWidgetValues(branchUuids, lastSelected);
      }
   }

   protected void saveWidgetValues() {
      IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
      if (settings != null) {
         // update source names history
         String[] branchUuids = settings.getArray(TestRunStorageKey.BRANCH_IDS);
         if (branchUuids == null) {
            branchUuids = new String[0];
         }

         try {
            Branch branch = getSelection();
            if (branch != null && branch.hasParentBranch()) {
               String lastBranchSelected = Long.toString(branch.getUuid());

               List<String> history = new ArrayList<>(Arrays.asList(branchUuids));
               history.remove(lastBranchSelected);
               history.add(0, lastBranchSelected);
               if (history.size() > COMBO_HISTORY_LENGTH) {
                  history.remove(COMBO_HISTORY_LENGTH);
               }
               branchUuids = new String[history.size()];
               history.toArray(branchUuids);

               settings.put(TestRunStorageKey.BRANCH_IDS, branchUuids);
               settings.put(TestRunStorageKey.SELECTED_BRANCH_ID, lastBranchSelected);
               try {
                  settings.save(this.getClass().getName());
               } catch (IOException ex) {
                  OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
               }
            }
         } catch (OseeCoreException ex) {
            OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
         }
      }
   }

   public static Branch getBranchFromUser() throws OseeCoreException {
      Branch toReturn = null;
      BranchComboDialog branchSelection = new BranchComboDialog(AWorkbench.getActiveShell());
      int result = branchSelection.open();
      if (result == Window.OK) {
         toReturn = branchSelection.getSelection();
         if (toReturn != null && toReturn.hasParentBranch() == false) {
            toReturn = null;
         }
      }
      return toReturn;
   }
}
