/*******************************************************************************
 * 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.test.manager.pages.scriptTable;

import org.eclipse.osee.framework.jdk.core.util.GUID;
import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel;
import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel.ScriptInteractionEnum;

public class ScriptTask {

   public enum ScriptStatusEnum {
      CANCELLED,
      CANCELLING,
      COMPLETE,
      IN_QUEUE,
      INCOMPATIBLE,
      INVALID,
      NOT_CONNECTED,
      READY,
      RUNNING
   }

   private GUID guid = null;
   private boolean run = true;
   private ScriptModel scriptModel = null;

   private ScriptStatusEnum status = ScriptStatusEnum.INCOMPATIBLE;

   /**
    * @param outputDir alternate output directory for tmo output files null will default to script directory
    */
   public ScriptTask(String rawFilename, String outputDir) {
      scriptModel = new ScriptModel(rawFilename, outputDir);
      updateStatusOnConnected(false);
      OutputModelJob.getSingleton().addTask(this);
   }

   /**
    * @return Returns the guid.
    */
   public GUID getGuid() {
      return guid;
   }

   /**
    * @return Returns the interaction.
    */
   public ScriptInteractionEnum getInteraction() {
      return scriptModel.getInteraction();
   }

   /**
    * @return Returns the name.
    */
   public String getName() {
      if (scriptModel == null) {
         return "";
      } else {
         return scriptModel.getName();
      }
   }

   /**
    * @return Returns the passFail.
    */
   public String getPassFail() {

      int passTP = scriptModel.getOutputModel().getPassedTestPoints();
      int failTP = scriptModel.getOutputModel().getFailedTestPoints();
      if (status == ScriptStatusEnum.RUNNING && scriptModel.getOutputModel().isAborted()){
         return "(0/0)";
      }
      if (scriptModel.getOutputModel().isAborted()) {
         return "ABORTED";
      } else if (passTP > 0 || failTP > 0) {
         if (failTP == 0) {
            return "PASS (" + passTP + ")";
         } else {
            return "FAIL (" + failTP + "/" + (passTP + failTP) + ")";
         }
      } else if (status == ScriptStatusEnum.RUNNING) {
         return "(0/0)";
      }
      return "";
   }

   /**
    * @return Returns the path.
    */
   public String getPath() {
      return scriptModel.getPath();
   }

   /**
    * @return Returns the scriptModel.
    */
   public ScriptModel getScriptModel() {
      return scriptModel;
   }

   /**
    * @return Returns the status.
    */
   public ScriptStatusEnum getStatus() {
      return status;
   }

   public Boolean getRunStatus() {
      return run;
   }

   /**
    * @return Returns the outputExists.
    */
   public boolean isOutputExists() {
      return scriptModel.getOutputModel().exists();

   }

   //   public void computeExists() {
   //      exists = scriptModel.getOutputModel().exists();
   //   }

   //   public boolean isOutputReadonly() {
   //      return !scriptModel.getOutputModel().getFile().canWrite();
   //   }

   /**
    * @return Returns the run.
    */
   public boolean isRun() {
      return run;
   }

   public boolean isRunnable() {
      return isRun();// && status != ScriptStatusEnum.INCOMPATIBLE
      // && status != ScriptStatusEnum.INVALID);
   }

   /**
    * @param guid The guid to set.
    */
   public void setGuid(GUID guid) {
      this.guid = guid;
   }

   /**
    * @param run The run to set.
    */
   public void setRun(boolean run) {
      this.run = run;
   }

   /**
    * @param status The status to set.
    */
   public void setStatus(ScriptStatusEnum status) {
      this.status = status;
   }

   public void updateStatusOnConnected(boolean connected) {
      /* Always leave the status of INVALID alone */
      if (status != ScriptStatusEnum.INVALID) {
         /* If we're not connected, we'll leave the display blank */
         if (!connected) {
            status = ScriptStatusEnum.NOT_CONNECTED;
         } else {
            status = ScriptStatusEnum.READY;
         }
      }
   }
}