package eu.dnetlib.espas.gui.shared;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import com.google.gwt.user.client.rpc.IsSerializable;
import java.util.Collection;
import java.util.LinkedList;

public class DownloadStatus implements IsSerializable {

   public enum Status implements IsSerializable {
      UNDEFINED,
      CANCELED,
      SUBMITTING,
      PENDING,
      RUNNING,
      COMPLETED,
      FAILED,
      EXPIRED
   }

   private long requestId;
   private Date expirationDate;
   private String message;
   private Status status;
   private String downloadURLs;
   private Collection<DataProviderRequestStatus> providerStatus;
   private boolean emailNotified;
   
   public DownloadStatus() {
      super();
      downloadURLs = "";
      providerStatus = new LinkedList();
   }

   public DownloadStatus(long requestId, Date expirationDate, String message,
           Status status) {
      this();
      this.requestId = requestId;
      this.expirationDate = expirationDate;
      this.message = message;
      this.status = status;
   }

   public long getRequestId() {
      return requestId;
   }

   public void setRequestId(long requestId) {
      this.requestId = requestId;
   }

   public Date getExpirationDate() {
      return expirationDate;
   }

   public void setExpirationDate(Date expirationDate) {
      this.expirationDate = expirationDate;
   }

   public String getMessage() {
      return message;
   }

   public void setMessage(String message) {
      this.message = message;
   }

   public Status getStatus() {
      return status;
   }

   public void setStatus(Status status) {
      this.status = status;
   }

   public void addProviderStatus(String providerName, Status providerStatus, String statusReport,Date lastUpdatedDate, Date expirationDate, 
                                  String providerDownloadURL, int totalRequests, int completedRequests, int failedRequests, int pendingRequests){
      this.providerStatus.add(new DataProviderRequestStatus(providerName, providerStatus, statusReport, lastUpdatedDate, expirationDate,
         providerDownloadURL, totalRequests, completedRequests, failedRequests, pendingRequests));
   }
   
   public Collection<DataProviderRequestStatus> getProviderStatusList(){
      return providerStatus;
   }

    public boolean isEmailNotified() {
        return emailNotified;
    }

    public void setEmailNotified(boolean emailNotified) {
        this.emailNotified = emailNotified;
    }

   /**
    * Returns the set of URLS that can be used for accessing the formulated bundles
    */
   public String getDownloadURL() {
      return this.downloadURLs;
   }

   public void setDownloadURL(String downloadURL) {
      this.downloadURLs = downloadURL;
   }

   public String logStatus() {
      String result = "Job " + this.requestId + " Status is :" + this.status.name();
      if (this.downloadURLs != null) {
         result += " URL is:\n" +this.downloadURLs;
         }
      return result;
   }

}
