import java.io.*;
import java.net.*;
import java.util.*;

public class SensorReader {
   private String url;
   
   public SensorReader(String _url) {
      this.url = _url;
   }

   public ArrayList getDataList() {
      BufferedReader reader = openURL();
      ArrayList result = readDataLines(reader);
      return result;
   }
   
   private ArrayList readDataLines(BufferedReader reader) {
      ArrayList result = new ArrayList();
      try {
         // the first two lines are garbage, throw them away!
         reader.readLine();
         reader.readLine();
         // read lines, add to result list
         String line;
         while ((line = reader.readLine()) != null) {
            SensorData data = parseDataLine(line);
            result.add(data);
         }
         reader.close();
      } catch (Exception ioe) {
         System.out.println("Error reading from webpage: " + ioe);
         System.exit(0);
      }
      return result;
   }

   private BufferedReader openURL() {
      BufferedReader result = null;
      try {
         URL urlObject = new URL(this.url);
         URLConnection connection = urlObject.openConnection();
         InputStream in = connection.getInputStream();
         result = new BufferedReader(new InputStreamReader(in));
      } catch (MalformedURLException murle) {
         System.out.println("URL string is invalid");
         System.exit(0);
      } catch (IOException ioe) {
         System.out.println("Error opening URL connection");
         System.exit(0);
      }
      return result;
   }

   private SensorData parseDataLine(String line) {
      SensorData data = new SensorData();
      String[] tokens = line.split("\\s+");

      // Input uses months starting at 1=Jan
      // Calendar uses months starting at 0=Jan
      // So we have to subtract 1 from input month when we set Calendar month
      Calendar measurementDate = Calendar.getInstance();
      measurementDate.set(Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1]) - 1, Integer.parseInt(tokens[2]), Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]), 0);
      data.setMeasurementDate(measurementDate);
      data.setOverallWaveHeight(Double.parseDouble(tokens[5]));
      data.setSwellWaveHeight(Double.parseDouble(tokens[6]));
      data.setSwellWavePeriod(Double.parseDouble(tokens[7]));
      data.setWindWaveHeight(Double.parseDouble(tokens[8]));
      data.setWindWavePeriod(Double.parseDouble(tokens[9]));
      data.setSwellWaveDirection(tokens[10]);
      data.setWindWaveDirection(tokens[11]);
      data.setSteepness(tokens[12]);
      data.setOverallWavePeriod(Double.parseDouble(tokens[13]));
      data.setOverallWaveDirection(Integer.parseInt(tokens[14]));

      return data;
   }
}
