/*
 * 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.spatial.impl;

import eu.dnetlib.espas.gui.server.utils.EmailUtils;
import eu.dnetlib.espas.spatial.BBoxQShape;
import eu.dnetlib.espas.spatial.CircularQShape;
import eu.dnetlib.espas.spatial.Point;
import eu.dnetlib.espas.spatial.QShape;
import eu.dnetlib.espas.spatial.QueryCRS;
import eu.dnetlib.espas.spatial.shared.SpatialQueryStatus;
import eu.dnetlib.espas.spatial.shared.SpatialQueryStatus.QueryStatus;
import eu.dnetlib.espas.spatial.SphereQShape;
import eu.dnetlib.espas.spatial.TimePeriodConstraint;
import eu.dnetlib.espas.spatial.utils.QueryDBUtils;
import eu.dnetlib.espas.spatial.utils.QueryStatusMonitor;
import eu.dnetlib.espas.spatial.utils.SQDiskMonitor;
import eu.dnetlib.espas.util.MetadataHandler;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;
import org.postgresql.ds.PGPoolingDataSource;

/**
 *
 * @author gathanas
 */
public class QueryEngineImplTest2 {

   private SQDiskMonitor dskMonitor;
   private QueryDBUtils spDBUtils;
   private QueryStatusMonitor queryMonitor;
   
//   "194.177.192.223/dnet_espas"
   public QueryEngineImplTest2() {
      PGPoolingDataSource dataSource = new PGPoolingDataSource();
      dataSource.setDatabaseName("dnet_espas");
      dataSource.setServerName("194.177.192.119");
      dataSource.setUser("dnet");
      dataSource.setPassword("dnetPwd");
      dataSource.setMaxConnections(100);
      spDBUtils = new QueryDBUtils();
      spDBUtils.setDatabaseURL("jdbc:postgresql://194.177.192.221/dnet_espas");
      spDBUtils.setDatabaseUsername("dnet");
      spDBUtils.setDatabasePassword("dnetPwd");
      spDBUtils.setSpDBSource(dataSource);
       
      spDBUtils.setTempDataFileStore("/tmp/espas/data/");
      dskMonitor = new SQDiskMonitor();
      dskMonitor.setSatelliteLocationPath("/tmp/espas/spatial/sat/");
      dskMonitor.setSatelliteListFilePath("/home/gathanas/My_Projects/ESPAS/satlocation/spacecraft_list.txt");
      dskMonitor.setSatelliteUtilityProcessKernelPath("/home/gathanas/My_Projects/ESPAS/satlocation");
      dskMonitor.setSatelliteUtilityProcessPath("/home/gathanas/My_Projects/ESPAS/satlocation/ESPAS_trajectory");
      dskMonitor.setSatelliteTLEPath("/home/gathanas/My_Projects/ESPAS/satlocation/tle");
 
      queryMonitor=new QueryStatusMonitor();
      queryMonitor.setEmailUtils(new EmailUtils());
      queryMonitor.setQueryDBUtils(spDBUtils);
      queryMonitor.setStatusMonitorPeriod(200000);
   }
   
   @Before
   public void setUp() {
   }

//      @Test
   public void testFindObservationsBySphereLocation() throws ParseException, InterruptedException {
      System.out.println("findObservationsBySphereLocation");
      
      System.loadLibrary("CXFormLib");
      Point center = new Point();
      
      center.setCoordinate(Point.PolarCoord.LAT_Cord.name(), new Double(37.0d));
      center.setCoordinate(Point.PolarCoord.LON_Cord.name(), new Double(20.0d));
      center.setCoordinate(Point.PolarCoord.R_Cord.name(), new Double(6370.0d));
      
      QShape querySpace = new SphereQShape(center,new Double(1.0d));
      querySpace.setEspasCRS(QueryCRS.GEOSpherical.espasValue());
      QueryCRS crs = QueryCRS.GEOSpherical;
      
      TimePeriodConstraint tCon = new TimePeriodConstraint();
      SimpleDateFormat dtFormater = new SimpleDateFormat("dd-MM-yyyy");
      tCon.setFromDate(dtFormater.parse("01-01-2013"));
      tCon.setToDate(dtFormater.parse("05-01-2013"));
      
      String userid = "george.athanasopoulos@gmail.com";
      QueryEngineImpl instance = new QueryEngineImpl();
      instance.setDiskMonitor(dskMonitor);
      instance.setEnableSatellite(Boolean.TRUE);
      instance.setQueryEnginePoolSize(2);
      instance.setdBUtils(spDBUtils);
      instance.init();
      String result = instance.findObservationsByLocation(querySpace, crs, tCon, userid);
      assertNotNull(result);
      while (instance.getQueryStatus(result, userid).getStatus()==QueryStatus.RUNNING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.PENDING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.SUBMITTED) {         
          
         Thread.sleep(10*100);
      }
          System.out.println("Query Status is : "+instance.getQueryStatus(result, userid).getStatus().name());
      // TODO review the generated test code and remove the default call to fail.
   }

//   @Test
   public void testFindObservationsByCircularLocation() throws ParseException, InterruptedException {
      System.out.println("findObservationsByCircularLocation");
      
      System.loadLibrary("CXFormLib");
      Point center = new Point();
      
      center.setCoordinate(Point.PolarCoord.LAT_Cord.name(), new Double(37.0d));
      center.setCoordinate(Point.PolarCoord.LON_Cord.name(), new Double(20.0d));
      center.setCoordinate(Point.PolarCoord.R_Cord.name(), new Double(5020.0d));
      
      QShape querySpace = new CircularQShape(center,new Double(10.0d));
      querySpace.setEspasCRS(QueryCRS.GEOSpherical.espasValue());
      QueryCRS crs = QueryCRS.GEOSpherical;
      
      TimePeriodConstraint tCon = new TimePeriodConstraint();
      SimpleDateFormat dtFormater = new SimpleDateFormat("dd-MM-yyyy");
      tCon.setFromDate(dtFormater.parse("01-01-2014"));
      tCon.setToDate(dtFormater.parse("05-01-2014"));
      
      String userid = "george.athanasopoulos@gmail.com";
      QueryEngineImpl instance = new QueryEngineImpl();
      instance.setDiskMonitor(dskMonitor);
      instance.setEnableSatellite(Boolean.TRUE);
      instance.setQueryEnginePoolSize(2);
      instance.setdBUtils(spDBUtils);
      instance.init();
      String result = instance.findObservationsByLocation(querySpace, crs, tCon, userid);
      assertNotNull(result);
      while (instance.getQueryStatus(result, userid).getStatus()==QueryStatus.RUNNING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.PENDING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.SUBMITTED) {         
         Thread.sleep(10*100);
      }
          System.out.println("Query Status is : "+instance.getQueryStatus(result, userid).getStatus().name());
      // TODO review the generated test code and remove the default call to fail.
   }

//      @Test
   public void testFindObservationsByCircularLocationCartesian() throws ParseException, InterruptedException {
      System.out.println("findObservationsByCircularLocation Cartesian");
      
      System.loadLibrary("CXFormLib");
      Point center = new Point();
      
      center.setCoordinate(Point.CartesianCoord.X_Cord.name(), new Double(3610000.0d));
      center.setCoordinate(Point.CartesianCoord.Y_Cord.name(), new Double(1532000.0d));
      center.setCoordinate(Point.CartesianCoord.Z_Cord.name(), new Double(5020000.0d));
      
      QShape querySpace = new CircularQShape(center,new Double(100.0d));
      querySpace.setEspasCRS(QueryCRS.GEOCartesian.espasValue());
      QueryCRS crs = QueryCRS.GEOCartesian;
      
      TimePeriodConstraint tCon = new TimePeriodConstraint();
      SimpleDateFormat dtFormater = new SimpleDateFormat("dd-MM-yyyy");
      tCon.setFromDate(dtFormater.parse("01-01-2013"));
      tCon.setToDate(dtFormater.parse("05-01-2013"));
      
      String userid = "george.athanasopoulos";
      QueryEngineImpl instance = new QueryEngineImpl();
      instance.setQueryEnginePoolSize(2);
      instance.setdBUtils(spDBUtils);
      instance.setDiskMonitor(dskMonitor);
      instance.setEnableSatellite(Boolean.TRUE);
      instance.init();
      String result = instance.findObservationsByLocation(querySpace, crs, tCon, userid);
      assertNotNull(result);
      while (instance.getQueryStatus(result, userid).getStatus()==QueryStatus.RUNNING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.PENDING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.SUBMITTED) {         
         Thread.sleep(10*100);
      }
      System.out.println("Query Status is : "+instance.getQueryStatus(result, userid).getStatus().name());
      // TODO review the generated test code and remove the default call to fail.
   }

   /**
    * Test of findObservationsByLocation method, of class QueryEngineImpl.
    */
   
//   @Test
   public void testFindObservationsByBoxLocation() throws ParseException, InterruptedException {
      System.out.println("findObservationsByBoxLocation");
      
      System.loadLibrary("CXFormLib");
      Point lowerLeft = new Point();
      
      lowerLeft.setCoordinate(Point.PolarCoord.LAT_Cord.name(), new Double(37.0d));
      lowerLeft.setCoordinate(Point.PolarCoord.LON_Cord.name(), new Double(20.0d));
      lowerLeft.setCoordinate(Point.PolarCoord.R_Cord.name(), new Double(6371000.0-10000.0d));

      Point upperRight = new Point();
      upperRight.setCoordinate(Point.PolarCoord.LAT_Cord.name(), new Double(39.0d));
      upperRight.setCoordinate(Point.PolarCoord.LON_Cord.name(), new Double(25.0d));
      upperRight.setCoordinate(Point.PolarCoord.R_Cord.name(), new Double(6371000.0+10000.0d));
      
      QShape querySpace = new BBoxQShape(lowerLeft, upperRight);
      querySpace.setEspasCRS(QueryCRS.GEOSpherical.espasValue());
      QueryCRS crs = QueryCRS.GEOSpherical;
      
      TimePeriodConstraint tCon = new TimePeriodConstraint();
      SimpleDateFormat dtFormater = new SimpleDateFormat("dd-MM-yyyy");
      tCon.setFromDate(dtFormater.parse("01-01-2014"));
      tCon.setToDate(dtFormater.parse("06-01-2014"));
      
      String userid = "george.athanasopoulos";
      QueryEngineImpl instance = new QueryEngineImpl();
      instance.setDiskMonitor(dskMonitor);
      instance.setEnableSatellite(Boolean.TRUE);
      instance.setQueryEnginePoolSize(2);
      instance.setdBUtils(spDBUtils);
      instance.init();
      String result = instance.findObservationsByLocation(querySpace, crs, tCon, userid);
      assertNotNull(result);
      while (instance.getQueryStatus(result, userid).getStatus()==QueryStatus.RUNNING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.PENDING||
              instance.getQueryStatus(result, userid).getStatus()==QueryStatus.SUBMITTED) {
         Thread.sleep(100*100);
      }
          System.out.println("Query Status is : "+instance.getQueryStatus(result, userid).getStatus().name());
      // TODO review the generated test code and remove the default call to fail.
   }

   /**
    * Test of getQueryStatus method, of class QueryEngineImpl.
    */
   
//   @Test
   public void testGetQueryStatus() {
      System.out.println("getQueryStatus");
      String queryId = "";
      String userid = "";
      QueryEngineImpl instance = new QueryEngineImpl();
      instance.setDiskMonitor(dskMonitor);
      instance.setEnableSatellite(Boolean.TRUE);
      SpatialQueryStatus expResult = null;
      SpatialQueryStatus result = instance.getQueryStatus(queryId, userid);
      assertEquals(expResult, result);
      // TODO review the generated test code and remove the default call to fail.
      fail("The test case is a prototype.");
   } 

//  @Test
   public void testDateTimeTranslation() throws ParseException{
      System.out.println("Datetime  test");
      String gmlXML2Res = "<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>-10,35,6871000 -10,55,6871000 40,55,6871000 40,35,6871000 -10,35,6871000 -10,55,6871000 40,55,6871000 40,35,6871000 -10,35,6871000 40,55,6871000 40,35,6871000 -10,35,6871000 40,35,6871000 -10,35,6871000 -10,35,6871000</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>";
            String gmlXML2 = (gmlXML2Res!=null ? gmlXML2Res.trim().split("\\s|>|/", 2)[0]+" xmlns:gml=\""+MetadataHandler.GML32_NAMESPACE+"\""+
              gmlXML2Res.trim().substring(gmlXML2Res.trim().indexOf(gmlXML2Res.trim().split("\\s|>|/", 2)[1])-1):"");
            gmlXML2= gmlXML2.replaceAll("srsName=\".*\"", "srsName=\"GEO\"");
      System.out.println("updated xml is \n"+gmlXML2);
      DateTime time = ISODateTimeFormat.dateTime().parseDateTime("1994-11-05T13:15:30.000Z");//1962-11-19T20:07:14+00:00");
      System.out.println("DateTime is :"+time.toString());
   }
   
}
