package net.agmodel.metsoap;

import java.util.*;
import javax.xml.rpc.Stub;

/**
 * Title:
 * Description:
 * Copyright:    Copyright (c) 2002
 * Company:
 * @author
 * @version 1.0
 */

public class MetSoapRemoteClient {

  private static Stub createProxy() {
  // Note: MetSoap_Impl is implementation-specific.
   return (Stub)(new MetSOAP_Impl().getMetSoapRemoteInterfacePort());
  }

  public static void main(String[] args) {
    try {
      Stub genstub = createProxy();
      genstub._setProperty( javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, args[0]);
      MetSoapRemoteInterface stub = (MetSoapRemoteInterface) genstub;

      String language=Locale.getDefault().getLanguage();

      System.out.println("Getting list of databases");
      MetSource[] databases=stub.listMetSources(language);
      for (int dbIndex=0;dbIndex<databases.length;dbIndex++)
        System.out.println(databases[dbIndex].getName());

      System.out.println("Getting a list of regions for a database");
      Region[] regions=stub.listRegionsForSource(language,"sasa");
      for (int regionIndex=0;regionIndex<regions.length;regionIndex++)
        System.out.println(regions[regionIndex].getName());

      System.out.println("Getting a list of stations for a database region");
      WeatherStation[] stations=stub.listStationsForRegion(language,"clidb","A");
      for (int stationIndex=0;stationIndex<stations.length;stationIndex++)
        System.out.println(stations[stationIndex].getStationName()+" from "+stations[stationIndex].getOperational().getStarting().getTime());

      //sample area is in HawkesBay region of New Zealand.
      GeographicalBox box=new GeographicalBox();

      Location2D nw=new Location2D();
      nw.setLatitude(-39.4); //Southern Hemisphere
      nw.setLongitude(176);//East of Greenwich
      box.setNorthWest(nw);

      Location2D se=new Location2D();
      se.setLatitude(-40);//
      se.setLongitude(177);
      box.setSouthEast(se);

      System.out.println("Getting list of databases covering an area");
      MetSource[] databases2=stub.listMetSourcesInArea(language,box);
      for (int dbIndex=0;dbIndex<databases2.length;dbIndex++)
        System.out.println(databases2[dbIndex].getName());

      System.out.println("Getting a list of stations for an area");

      WeatherStation[] stations2=stub.listStationsInArea(language,box);
      for (int stationIndex=0;stationIndex<stations2.length;stationIndex++)
        System.out.println(stations2[stationIndex].getStationName()+" from "+stations2[stationIndex].getOperational().getStarting().getTime());

      System.out.println("Getting some data with old call");

      Calendar c=Calendar.getInstance();
      c.set(Calendar.MINUTE,0);
      c.set(Calendar.SECOND,0);
      c.set(Calendar.MILLISECOND,0);

      Calendar start=(Calendar) c.clone();
      start.add(Calendar.DATE,-3);

      StationData result=stub.getStationDataOld("amedas","40341",
          null,null,start,c,new int[] {1,0},1,language,true); //rain,air temp, hourly, allow summarising

      WeatherStation station=result.getStation();
      System.out.println("Received data from "+station.getStationName());
      System.out.println("This station records the following data:");
      CatalogEntry[] catalog=station.getCatalog();
      for (int catIndex=0;catIndex<catalog.length;catIndex++) {
        CatalogEntry anEntry=catalog[catIndex];
        System.out.print("Resolution code "+anEntry.getResolution()+" element codes:");
        int[] elements=anEntry.getElements();
        for (int elementIndex=0;elementIndex<elements.length;elementIndex++)
          System.out.print(" "+elements[elementIndex]);
        System.out.println();
      }

      ElementData[] stationData=result.getElementData();
      for (int i=0;i<stationData.length;i++) {
        if (stationData[i]!=null) {
          DataStore[] dataStore=stationData[i].getData();
          for (int j=0;j<dataStore.length;j++) {
            System.out.println(dataStore[j].getStoreName());
            float[] data=dataStore[j].getContents();
            for (int k=0;k<data.length;k++)
              System.out.print(data[k]+",");
          }
        }
      }

      System.out.println("Getting some data with new call");

      StationMetRequest request=new StationMetRequest();
      request.setSourceID("amedas");
      request.setStationID("40341");

      TimeInterval interval=new TimeInterval();
      interval.setStarting(start);
      interval.setEnding(c);
      request.setInterval(interval);

      request.setRequestedElements(new int[] {1,0});//rainfall and temperature
      request.setResolution(1);//hourly
      request.setLanguage(language);
      request.setSummarisingAllowed(true);

      result=stub.getStationData(request);
      System.out.println("Received data from "+result.getStation().getStationName());

      stationData=result.getElementData();
      for (int i=0;i<stationData.length;i++) {
        if (stationData[i]!=null) {
          DataStore[] dataStore=stationData[i].getData();
          for (int j=0;j<dataStore.length;j++) {
            System.out.println(dataStore[j].getStoreName());
            float[] data=dataStore[j].getContents();
            for (int k=0;k<data.length;k++)
              System.out.print(data[k]+",");
          }
        }
      }



    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}
