/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.operation;

import se.unlogic.standardutils.time.TimeUtils;


public class ProgressMeter {
   private long start;
   private long finish;
   private long currentPosition;
   private long startTime;
   private long endTime;
   public ProgressMeter(){};

   public ProgressMeter(long start, long finish){
      this.start = start;
      this.finish = finish;
   }

   public ProgressMeter(boolean setStartTime){
      if(setStartTime){
         this.setStartTime();
      }
   }

   public ProgressMeter(int start, int finish, int currentPosition){
      this.start = start;
      this.finish = finish;
      this.currentPosition = currentPosition;
   }

   public long getCurrentPosition() {
      return currentPosition;
   }

   public synchronized void setCurrentPosition(int currentPosition) {
      this.currentPosition = currentPosition;
   }

   public synchronized void incrementCurrentPosition(){
      this.currentPosition++;
   }

   public synchronized void decrementCurrentPosition(){
      this.currentPosition--;
   }

   public long getFinish() {
      return finish;
   }

   public void setFinish(long finish) {
      this.finish = finish;
   }

   public long getStart() {
      return start;
   }

   public void setStart(long start) {
      this.start = start;
   }

   public int getPercentComplete(){
      if(this.finish > this.start){
         return (int)(((float)(this.currentPosition - this.start)/(float)(this.finish - this.start))*100f);
      }else if(this.finish < this.start){
         return (int)(((float)(this.start - this.currentPosition)/(float)(this.start - this.finish))*100f);
      }else{
         return -1;
      }
   }

   public int getPercentRemaining(){
      if(this.finish > this.start){
         if(this.finish - this.currentPosition != 0){
            return (int)(((float)(this.finish - this.currentPosition)/(float)(this.finish - this.start))*100f);
         }else{
            return 0;
         }
      }else if(this.finish < this.start){
         if(this.currentPosition - this.finish != 0){
            return (int)(((float)(this.currentPosition - this.finish)/(float)(this.start - this.finish))*100f);
         }else{
            return 0;
         }
      }else{
         return -1;
      }
   }

   public long getIntervalSize(){
      if(this.finish > this.start){
         return this.finish - this.start;
      }else if(this.finish < this.start){
         return this.start - this.finish;
      }else{
         return 0;
      }
   }

   public long getStartTime() {
      return startTime;
   }

   public void setStartTime() {
      this.startTime = System.currentTimeMillis();
   }

   public void setStartTime(long startTime) {
      this.startTime = startTime;
   }

   public long getEndTime() {
      return endTime;
   }

   public void setEndTime() {
      this.endTime = System.currentTimeMillis();
   }

   public void setEndTime(long endTime) {
      this.endTime = endTime;
   }

   public long getTimeSpent(){
      if(this.startTime != 0){
         if(this.endTime == 0){
            return System.currentTimeMillis() - this.startTime;
         }else{
            return this.endTime - this.startTime;
         }
      }else{
         return 0;
      }
   }

   public void incrementCurrentPosition(long value) {

      this.currentPosition += value;
   }

   public String getTimeSpentString() {

      return TimeUtils.millisecondsToString(getTimeSpent());
   }
}
