//
// return content of xml 
// (used for VOSI capabilityVOSI and availability.xml)
//

import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.*; // ArrayList<String>

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream; // for SOOA

// from vlkb_mergefiles.java - dir & file handling
import java.io.*;

import java.nio.file.*;
import static java.nio.file.StandardCopyOption.*;


// serve VOSI resources from xml files (for now implemented as strings, not files FIXME)

public class VlkbServletFile
    extends javax.servlet.http.HttpServlet
{
   String className = this.getClass().getSimpleName();
	private static final SearchSettings settings = Settings.getInstance();
	private boolean available;

	private String checkDatasets(String dirName)
	{
		Path dir = Paths.get(dirName);
      String note;
      try
      {
         int count = 0;
         try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir))
         {
            for (Path entry: stream) count++;
            note = dir.toString() + " has " + String.valueOf(count) + " entries";
				this.available = true;
         }
         catch (DirectoryIteratorException ex)
         {
            // I/O error during the iteration, the cause is an IOException
            throw ex.getCause();
         }
      }
      catch(Exception ex)
      {
         note = "error: " + ex.toString();
			this.available = false;
      }

		return note;
	}

	private String availString()
	{
		String dirName = settings.fitsPaths.surveys();
		String datasetsAvail = checkDatasets(dirName);

		String availStr = 
			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			+ "<vosi:availability xmlns:vosi=\"http://www.ivoa.net/xml/VOSIAvailability/v1.0\">"
			+ "<vosi:available> " +  ((this.available)?"true":"false") + " </vosi:available>"
			+ "<vosi:note> VLKB-SODA " + Version.asString + " is accepting queries </vosi:note>"
			+ "<vosi:note> " + datasetsAvail + " </vosi:note>"
			+ "</vosi:availability>";


		return availStr;
	}



	private String capsStr = null;

	protected void SetCapsStr(String URL, String funcName)
	{
		if(URL != null)
		{

			String accessURL = stripTrailingSlash(URL);

			capsStr =
				"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

				+ "<vosi:capabilities "
				+    "xmlns:vosi=\"http://www.ivoa.net/xml/VOSICapabilities/v1.0\" "
				+    "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
				+    "xmlns:vod=\"http://www.ivoa.net/xml/VODataService/v1.1\">"

				+ " <capability standardID=\"ivo://ivoa.net/std/VOSI#capabilities\">"
				+ "   <interface xsi:type=\"vod:ParamHTTP\" version=\"1.0\">"
				+ "     <accessURL use=\"full\">"
				+          accessURL + "/capabilities"
				+ "     </accessURL>"
				+ "   </interface>"
				+ " </capability>"

				+ " <capability standardID=\"ivo://ivoa.net/std/VOSI#availability\">"
				+ "   <interface xsi:type=\"vod:ParamHTTP\" version=\"1.0\">"
				+ "     <accessURL use=\"full\">"
				+          accessURL + "/availability"
				+ "     </accessURL>"
				+ "   </interface>"
				+ " </capability>"

				+ " <capability standardID=\"ivo://ivoa.net/std/SODA#sync-1.0\">"
				+ "   <interface xsi:type=\"vod:ParamHTTP\" role=\"std\" version=\"1.0\">"
				+ "     <accessURL use=\"full\">"
				+          accessURL + "/" + funcName
				+ "     </accessURL>"
				+ "   </interface>"
				+ " </capability>"

				+ " <capability standardID=\"ivo://ivoa.net/std/SODA#async-1.0\">"
				+ "   <interface xsi:type=\"vod:ParamHTTP\" role=\"std\" version=\"1.0\">"
				+ "     <accessURL use=\"full\">"
				+          accessURL + "/" + funcName + "_uws/soda_cuts"
				+ "     </accessURL>"
				+ "   </interface>"
				+ " </capability>"

				+ "</vosi:capabilities>";
		}
	}


	String stripTrailingSlash(String path)
	{
		if (path.endsWith("/"))
			return path.substring(0,path.length()-1);
		else
			return path;
	}


	protected void doGet(HttpServletRequest request,
			HttpServletResponse response)
		throws ServletException, IOException {

			doPost(request, response);
		}



	protected void doPost(HttpServletRequest request,
			HttpServletResponse response)
		throws ServletException, IOException
		{
			StringBuffer requestURL = request.getRequestURL();

			System.out.println(className + " vlkb req from: " + request.getRemoteAddr()
					+ " doGet: " + requestURL.toString());

			PrintWriter writer = response.getWriter();
			response.setContentType("text/xml");

			if(-1 != requestURL.lastIndexOf("/capabilities"))
			{
				String fullURL = request.getRequestURL().toString();
				String baseURL = fullURL.substring(0,requestURL.lastIndexOf("/"));

				SetCapsStr(baseURL, "soda");
				writer.println(capsStr);	

			}
			else if(-1 != requestURL.lastIndexOf("/availability"))
			{
				writer.println(availString());	
			}
			// error FIXME what to do if none of above given ? e.g. misconfigured web.xml

			writer.close();
			return;
		}
}