/*********************************************************************
 * Copyright (c) 2017 Boeing
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Boeing - initial API and implementation
 **********************************************************************/

package org.eclipse.osee.ats.ide.util.widgets;

import java.util.Collection;
import org.eclipse.osee.ats.api.AtsApi;
import org.eclipse.osee.ats.api.team.IAtsTeamDefinition;
import org.eclipse.osee.ats.api.util.IAtsChangeSet;
import org.eclipse.osee.ats.api.version.IAtsVersion;
import org.eclipse.osee.ats.api.version.Version;
import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
import org.eclipse.osee.ats.ide.internal.Activator;
import org.eclipse.osee.ats.ide.internal.AtsApiService;
import org.eclipse.osee.ats.ide.util.widgets.dialog.VersionListDialog;
import org.eclipse.osee.ats.ide.workflow.teamwf.TeamWorkFlowArtifact;
import org.eclipse.osee.framework.core.data.RelationTypeSide;
import org.eclipse.osee.framework.core.data.TransactionToken;
import org.eclipse.osee.framework.core.util.Result;
import org.eclipse.osee.framework.logging.OseeLevel;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelValueSelection;
import org.eclipse.osee.framework.ui.swt.Widgets;

/**
 * Single version selection dialog that persists upon selection. Clear and Close button shown by default to un-select.
 *
 * @author Megumi Telles
 * @author Donald G. Dunne
 */
public abstract class XHyperlabelVersionSelectionWithPersist extends XHyperlinkLabelValueSelection implements ArtifactWidget {

   public static final String WIDGET_ID = XHyperlabelVersionSelectionWithPersist.class.getSimpleName();
   Version selectedVersion = null;
   Collection<IAtsVersion> selectableVersions;
   VersionListDialog dialog = null;
   private Artifact artifact;
   private final RelationTypeSide relType;
   protected AtsApi atsApi;
   protected boolean removeAllAllowed = true;

   public XHyperlabelVersionSelectionWithPersist(String label, RelationTypeSide relType) {
      super(label);
      this.relType = relType;
      atsApi = AtsApiService.get();
   }

   public Version getSelectedVersion() {
      return selectedVersion;
   }

   @Override
   public Object getData() {
      return getSelectedVersion();
   }

   @Override
   public String getCurrentValue() {
      if (selectedVersion == null) {
         return "Not Set";
      }
      return selectedVersion.getName();
   }

   public boolean handleClear() {
      selectedVersion = null;
      IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update " + relType.getName());
      changes.unrelateAll(getArtifact(), relType);
      changes.executeIfNeeded();
      notifyXModifiedListeners();
      return true;
   }

   public void setSelectedVersions(Version selectedVersion) {
      this.selectedVersion = selectedVersion;
      refresh();
      notifyXModifiedListeners();
   }

   @Override
   public boolean handleSelection() {
      try {
         if (selectableVersions == null) {
            dialog = new VersionListDialog("Select Version", "Select Version", getSelectableVersions());
         } else {
            dialog = new VersionListDialog("Select Version", "Select Version", selectableVersions);
         }
         dialog.setRemoveAllAllowed(removeAllAllowed);
         int result = dialog.open();
         if (result == 0) {
            IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update " + relType.getName());
            changes.setRelation(getArtifact(), relType, dialog.getSelectedFirst());
            TransactionToken transaction = changes.executeIfNeeded();
            if (transaction.isValid()) {
               notifyXModifiedListeners();
            }
         }
         return true;
      } catch (Exception ex) {
         OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
      }
      return false;
   }

   private Collection<IAtsVersion> getSelectableVersions() {
      if (artifact instanceof IAtsTeamWorkflow) {
         IAtsTeamDefinition teamDefHoldingVersion = atsApi.getTeamDefinitionService().getTeamDefHoldingVersions(
            ((IAtsTeamWorkflow) artifact).getTeamDefinition());
         if (teamDefHoldingVersion != null) {
            return atsApi.getTeamDefinitionService().getVersions(teamDefHoldingVersion);
         }
      }
      return java.util.Collections.emptyList();
   }

   public void setVersions(Collection<IAtsVersion> versions) {
      this.selectableVersions = versions;
      if (dialog != null) {
         dialog.setInput(versions);
      }
   }

   @Override
   public boolean isEmpty() {
      return selectedVersion == null;
   }

   public void setEnableHyperLink() {
      if (Widgets.isAccessible(labelHyperlink)) {
         labelHyperlink.setEnabled(true);
      }
   }

   public void setDisableHyperLink() {
      if (Widgets.isAccessible(labelHyperlink)) {
         labelHyperlink.setEnabled(false);
      }
   }

   @Override
   public void setArtifact(Artifact art) {
      if (art instanceof TeamWorkFlowArtifact) {
         this.artifact = art;
      }
   }

   @Override
   public Artifact getArtifact() {
      return this.artifact;
   }

   @Override
   public void revert() {
      //
   }

   @Override
   public void saveToArtifact() {
      //
   }

   @Override
   public Result isDirty() {
      return Result.FalseResult;
   }

   public boolean isRemoveAllAllowed() {
      return removeAllAllowed;
   }

   public void setRemoveAllAllowed(boolean removeAllAllowed) {
      this.removeAllAllowed = removeAllAllowed;
   }

}
