/*******************************************************************************
 * 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.rest.internal;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;

import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.ote.OTEApi;
import org.eclipse.osee.ote.core.ServiceUtility;

/**
 * @author Andrew M. Finkbeiner
 */
@Path("batches")
public class OteBatchResource {

   // Allows to insert contextual objects into the class, 
   // e.g. ServletContext, Request, Response, UriInfo
   @Context
   UriInfo uriInfo;
   @Context
   Request request;
   private final String path;

   public OteBatchResource(UriInfo uriInfo, Request request, String path) {
      this.uriInfo = uriInfo;
      this.request = request;
      this.path = path;
   }

   public OteBatchResource() {
      this.path = "";
   }

   @GET
   @Produces(MediaType.TEXT_HTML)
   public String getBatches() throws OseeCoreException {
      OTEApi ote = ServiceUtility.getService(OTEApi.class);
      File rootBatches = ote.getServerFolder().getBatchesFolder();
      File myBatchFolder = new File(rootBatches, path);
      File logFile = ote.getServerFolder().getBatchLogFile(myBatchFolder);
      
      HTMLBuilder builder = new HTMLBuilder();
      
      builder.open("OTE Batch Status");
      /**
       * Disaled till we figure out security 
      if(uriInfo != null){
         String url = uriInfo.getAbsolutePath().toASCIIString();
         builder.addLink(url, "content.zip", "Get Folder Contents");
      }
      */
      builder.commonHeader(myBatchFolder);

      
      generateStatusSection(builder, ote, myBatchFolder);
      
      generateResultsSection(builder, ote, myBatchFolder);
      
      builder.h2("Output");
      builder.pre(getFileContents(logFile));
      builder.close();
	   return builder.get(); 
   }
   
   private void generateResultsSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder) {
      File runList = ote.getServerFolder().getBatchRunList(myBatchFolder);
      String runListContents = "";
      if(runList.exists()){
         runListContents = getFileContents(runList);
      }
      if(runListContents.length() > 0){
         File[] resultFiles = myBatchFolder.listFiles(new FileFilter() {
            @Override
            public boolean accept(File arg0) {
               return arg0.getName().endsWith(".result");
            }
         });
         String[] runListArray = runListContents.split("\n");
         List<TestResultSummary> results = getTestResults(resultFiles, runListArray);
         builder.h2("Tests");
         builder.tableStart();
         builder.trStart();
         builder.td("Test");
         builder.td("Result");
         builder.td("Time");
         builder.trEnd();
         
         for(TestResultSummary result:results){
            builder.trStart();
            builder.td(result.getName());
            builder.td(result.getResult());
            builder.td(result.getTime());
            builder.trEnd();
         }
         
         builder.tableEnd();
         
      } else {
         builder.h2("Files");
         builder.ulStart();
         File[] batches = myBatchFolder.listFiles();
         Arrays.sort(batches, new TimeSort());
         for(File file:batches){
            builder.li(file.getName());
         }
         builder.ulStop();
      }
   }
   
   

   private List<TestResultSummary> getTestResults(File[] resultFiles, String[] runListArray) {
      List<TestResultSummary> results = new ArrayList<>();
      Map<String, TestResultSummary> resultsTemp = new HashMap<>();
      for(File file:resultFiles){
         String content = getFileContents(file);
         if(content.length() > 0){
            String[] data = content.split(",");
            if(data.length == 3){
               resultsTemp.put(data[0], new TestResultSummary(data[0], data[1], data[2]));
            }
         }
      }
      for(String name:runListArray){
         TestResultSummary result = resultsTemp.get(name);
         if(result == null){
            result = new TestResultSummary(name);
         }
         results.add(result);
      }
      return results;
   }

   private void generateStatusSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder){
      builder.h2("Status");
      String status = getFileContents(ote.getServerFolder().getBatchStatusFile(myBatchFolder));
      if(status.length() == 0){
         status = "unknown";
      }
      builder.p(status);
   }
   
   private String getFileContents(File statusFile) {
      String status = "";
      try {
         if(statusFile.exists()){
            status = Lib.fileToString(statusFile);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return status;
   }
   
   @Path("content.zip")
   @GET
   @Produces({"application/zip"})
   public StreamingOutput getZip() throws Exception {
      return new StreamingOutput() {
         @Override
         public void write(OutputStream output) throws IOException, WebApplicationException {
            try {
               OTEApi ote = ServiceUtility.getService(OTEApi.class);
               File rootBatches = ote.getServerFolder().getBatchesFolder();
               File myBatchFolder = new File(rootBatches, path);
               ZIPGenerator generator = new ZIPGenerator(myBatchFolder);
               generator.generateZip(output);
            } catch (Exception e) {
               throw new WebApplicationException(e);
            }
         }
      };
   }
   
}
