/*********************************************************************
 * Copyright (c) 2010 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.framework.ui.skynet.change;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.osee.framework.access.AccessControlManager;
import org.eclipse.osee.framework.core.data.BranchId;
import org.eclipse.osee.framework.core.data.BranchToken;
import org.eclipse.osee.framework.core.data.TransactionToken;
import org.eclipse.osee.framework.core.enums.BranchState;
import org.eclipse.osee.framework.core.enums.PermissionEnum;
import org.eclipse.osee.framework.core.model.Branch;
import org.eclipse.osee.framework.core.model.TransactionDelta;
import org.eclipse.osee.framework.jdk.core.type.OseeArgumentException;
import org.eclipse.osee.framework.jdk.core.util.Conditions;
import org.eclipse.osee.framework.plugin.core.util.Jobs;
import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
import org.eclipse.osee.framework.skynet.core.transaction.TransactionManager;
import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
import org.eclipse.osee.framework.ui.skynet.change.view.ChangeReportEditor;
import org.eclipse.osee.framework.ui.skynet.internal.Activator;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.progress.UIJob;

public final class ChangeUiUtil {
   public static void open(BranchId branch) {
      open(branch, false);
   }

   public static void open(BranchId branch, boolean showTransactionTab) {
      Conditions.checkNotNull(branch, "Branch");
      Branch brch = BranchManager.getBranch(branch);
      if (permissionsDeniedWithDialog(brch)) {
         return;
      }

      ChangeReportEditorInput editorInput = createInput(branch, true);
      editorInput.setTransactionTabActive(showTransactionTab);
      open(editorInput);
   }

   /**
    * Check if have at least read-only for given branch. Open dialog if denied.
    *
    * @return true if permissions denied
    */
   public static boolean permissionsDeniedWithDialog(BranchToken branch) {
      boolean hasPermission = AccessControlManager.hasPermission(branch, PermissionEnum.READ);
      if (!hasPermission) {
         AWorkbench.popup("Access Denied",
            String.format("Access denied to branch:\n\n%s", BranchManager.toStringWithId(branch)));
         return true;
      }
      return false;
   }

   public static void open(TransactionToken transaction) {
      Conditions.checkNotNull(transaction, "TransactionId");
      Branch branch = BranchManager.getBranch(transaction);
      if (branch.isInvalid() || permissionsDeniedWithDialog(branch)) {
         return;
      }
      open(createInput(transaction, true));
   }

   public static void open(TransactionToken startTx, TransactionToken endTx) {
      Conditions.checkNotNull(startTx, "First TransactionId");
      Conditions.checkNotNull(endTx, "Second TransactionId");
      TransactionDelta txDelta = new TransactionDelta(startTx, endTx);
      if (!txDelta.areOnTheSameBranch()) {
         throw new OseeArgumentException("Invalid selection - transactions art not on the same branch.", txDelta);
      }
      Branch branch = BranchManager.getBranch(startTx);
      if (branch.isInvalid() || permissionsDeniedWithDialog(branch)) {
         return;
      }
      open(createInput(CompareType.COMPARE_SPECIFIC_TRANSACTIONS, txDelta, true));
   }

   private static ChangeReportEditorInput createInput(TransactionToken transactionId, boolean loadOnOpen) {
      TransactionToken startTx = TransactionManager.getPriorTransaction(transactionId);
      TransactionToken endTx = transactionId;
      TransactionDelta txDelta = new TransactionDelta(startTx, endTx);
      return createInput(CompareType.COMPARE_SPECIFIC_TRANSACTIONS, txDelta, loadOnOpen);
   }

   private static ChangeReportEditorInput createInput(BranchId branch, boolean loadOnOpen) {
      if (BranchManager.isArchived(branch) || BranchManager.getState(branch).equals(BranchState.COMMITTED)) {
         TransactionToken startTx = BranchManager.getBaseTransaction(branch);
         TransactionToken endTx = TransactionManager.getHeadTransaction(branch);
         TransactionDelta txDelta = new TransactionDelta(startTx, endTx);
         ChangeReportEditorInput input = createInput(CompareType.COMPARE_BASE_TO_HEAD, txDelta, loadOnOpen);
         input.setBranch(branch);
         return input;
      } else {
         BranchId parentBranch = BranchManager.getParentBranch(branch);
         return createInput(branch, parentBranch, loadOnOpen);
      }
   }

   private static ChangeReportEditorInput createInput(BranchId branch, BranchId parentBranch, boolean loadOnOpen) {
      TransactionToken startTx = TransactionManager.getHeadTransaction(branch);
      TransactionToken endTx = TransactionManager.getHeadTransaction(parentBranch);
      TransactionDelta txDelta = new TransactionDelta(startTx, endTx);
      ChangeReportEditorInput input = createInput(CompareType.COMPARE_CURRENTS_AGAINST_PARENT, txDelta, loadOnOpen);
      input.setBranch(branch);
      return input;
   }

   public static ChangeReportEditorInput createInput(CompareType compareType, TransactionDelta txDelta, boolean loadOnOpen) {
      ChangeUiData uiData = new ChangeUiData(compareType, txDelta);
      uiData.setLoadOnOpen(loadOnOpen);
      return new ChangeReportEditorInput(uiData);
   }

   public static void open(final ChangeReportEditorInput editorInput) {
      Job job = new UIJob("Open Change Report") {

         @Override
         public IStatus runInUIThread(IProgressMonitor monitor) {
            IStatus status = Status.OK_STATUS;
            try {
               AWorkbench.getActivePage().openEditor(editorInput, ChangeReportEditor.EDITOR_ID);
            } catch (PartInitException ex) {
               status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error opening change report", ex);
            }
            return status;
         }
      };
      Jobs.startJob(job, true);
   }

   public static void open(BranchToken workingBranch, BranchId parentBranch, boolean b) {
      Branch branch = BranchManager.getBranch(workingBranch);
      if (branch.isInvalid() || permissionsDeniedWithDialog(workingBranch)) {
         return;
      }
      branch = BranchManager.getBranch(parentBranch);
      if (branch.isInvalid() || permissionsDeniedWithDialog(branch)) {
         return;
      }
      ChangeReportEditorInput input = createInput(workingBranch, parentBranch, true);
      open(input);
   }
}
