/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eu.dnetlib.espas.sos.client;

import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/** Used for holding status information related to a specific sos request.
 *
 * @author gathanas
 */
public class SOSRequestStatus {
   
   public enum RequestStatus{ EXPIRED, SUBMITTING, PENDING, RUNNING, COMPLETED, FAILED, UNKNOWN};
   
   private String requestId;
   
   private RequestStatus status;
   
   private String description;
   
   private Date latestUpdateTime;
   
   private Date expirationDate;

   private Map<String, RequestStatus> transformationStatusMap;

   private Collection<ProviderStatus> requestProviderStatus;
   
   
   public SOSRequestStatus(String requestId, RequestStatus status, String description) {
      this.status = status;
      this.description = description;
      this.requestId = requestId;
      transformationStatusMap = new HashMap<String, RequestStatus>();
      requestProviderStatus = new LinkedList<ProviderStatus>();
   }

   public RequestStatus getStatus() {
      return status;
   }

   public String getDescription() {
      return description;
   }

   public String getRequestId() {
      return requestId;
   }

   public Date getLatestUpdateTime() {
      return latestUpdateTime;
   }

   public void setLatestUpdateTime(Date latestUpdateTime) {
      this.latestUpdateTime = latestUpdateTime;
   }

   public Date getExpirationDate() {
      return expirationDate;
   }

   public void setExpirationDate(Date expirationDate) {
      this.expirationDate = expirationDate;
   }
   
   public void addTransaformationStatus(String name, RequestStatus status){
      this.transformationStatusMap.put(name, status);
   }
   
   public boolean isTransformationSubmitted(String transformationName){
       return transformationStatusMap.containsKey(transformationName);
   }
   
   public RequestStatus getTransformationStatus(String name){
      if(transformationStatusMap.containsKey(name))
         return transformationStatusMap.get(name);
      
//    if this transformation has not been requested then return unknown
      return RequestStatus.UNKNOWN;
   }

   public Map<String, RequestStatus> getTransformationStatusMap() {
      return transformationStatusMap;
   }

   public Collection<ProviderStatus> getRequestProviderStatus() {
      return requestProviderStatus;
   }

   public void addProviderStatus(String name, RequestStatus status, String statusReport, Date lastUpdated){
      this.requestProviderStatus.add(new ProviderStatus(name, status, statusReport, lastUpdated));
   }
           
   public class ProviderStatus {
      private String name;
      private RequestStatus status;
      private String statusReport;
      private Date lastUpdated;

      public ProviderStatus(String name, RequestStatus status, String statusReport, Date lastUpdated) {
         this.name = name;
         this.status = status;
         this.statusReport = statusReport;
         this.lastUpdated = lastUpdated==null?null:lastUpdated;
      }

      public String getName() {
         return name;
      }

      public RequestStatus getStatus() {
         return status;
      }

      public String getStatusReport() {
         return statusReport;
      }

      public Date getLastUpdated() {
         return lastUpdated;
      }
      
      
      
   }
}
