package org.insight_centre.aceis.io;

import com.csvreader.CsvReader;

import java.io.*;
import java.lang.Double;
import java.lang.String;
import java.lang.System;
import java.util.ArrayList;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.lang.String;
import java.lang.System;

import org.insight_centre.aceis.observations.AarhusTrafficObservation;

import com.csvreader.CsvReader;

/**
 * Created by sefki on 10/06/2014.
 */
public class ReadDocument {

	public static void main(String[] args) throws IOException {
		StreamAnnotation();

	}

	public static AarhusTrafficObservation getStreamData(String dataFile) throws NumberFormatException, IOException {
		CsvReader streamData = new CsvReader(String.valueOf(dataFile));
		streamData.readHeaders();
		// Reads csv document for traffic metadata
		try {
			CsvReader metaData = new CsvReader("dataset/MetaData/trafficMetaData.csv");
			metaData.readHeaders();
			AarhusTrafficObservation data = new AarhusTrafficObservation();
			while (streamData.readRecord()) {

				while (metaData.readRecord()) {
					if (streamData.get("REPORT_ID").equals(metaData.get("REPORT_ID"))) {
						data = new AarhusTrafficObservation(Double.parseDouble(streamData.get("REPORT_ID")),
								Double.parseDouble(streamData.get("avgSpeed")), Double.parseDouble(streamData
										.get("vehicleCount")), Double.parseDouble(streamData.get("avgMeasuredTime")),
								0, 0, metaData.get("POINT_1_STREET"), metaData.get("POINT_1_CITY"),
								Double.parseDouble(metaData.get("POINT_1_LAT")), Double.parseDouble(metaData
										.get("POINT_1_LNG")), metaData.get("POINT_2_STREET"),
								metaData.get("POINT_2_CITY"), Double.parseDouble(metaData.get("POINT_2_LAT")),
								Double.parseDouble(metaData.get("POINT_2_LNG")), metaData.get("POINT_1_COUNTRY"),
								metaData.get("POINT_2_COUNTRY"), metaData.get("TIMESTAMP"));
						Double distance = Double.parseDouble(metaData.get("DISTANCE_IN_METERS"));
						data.setEstimatedTime(distance / data.getAverageSpeed());
						data.setCongestionLevel(data.getVehicle_count() / distance);
					}
				}

			}
			streamData.close();
			metaData.close();
			return data;
		} catch (Exception e) {

			e.printStackTrace();
		}
		return null;
	}

	public static void StreamAnnotation() {
		ArrayList<AarhusTrafficObservation> List = new ArrayList<AarhusTrafficObservation>();
		try {

			File StreamDataDirectory = new File("dataset/Data/");
			File StreamDataFiles[] = StreamDataDirectory.listFiles();

			for (File csvStreamFile : StreamDataFiles) {
				// Reads csv document for trafficdata
				CsvReader streamData = new CsvReader(String.valueOf(csvStreamFile));
				streamData.readHeaders();
				// Reads csv document for traffic metadata
				CsvReader metaData = new CsvReader("dataset/MetaData/trafficMetaData.csv");
				metaData.readHeaders();

				while (streamData.readRecord()) {
					while (metaData.readRecord()) {
						if (streamData.get("REPORT_ID").equals(metaData.get("REPORT_ID"))) {
							List.add(new AarhusTrafficObservation(Double.parseDouble(streamData.get("REPORT_ID")),
									Double.parseDouble(streamData.get("avgSpeed")), Double.parseDouble(streamData
											.get("vehicleCount")),
									Double.parseDouble(streamData.get("avgMeasuredTime")), 0, 0, metaData
											.get("POINT_1_STREET"), metaData.get("POINT_1_CITY"), Double
											.parseDouble(metaData.get("POINT_1_LAT")), Double.parseDouble(metaData
											.get("POINT_1_LNG")), metaData.get("POINT_2_STREET"), metaData
											.get("POINT_2_CITY"), Double.parseDouble(metaData.get("POINT_2_LAT")),
									Double.parseDouble(metaData.get("POINT_2_LNG")), metaData.get("POINT_1_COUNTRY"),
									metaData.get("POINT_2_COUNTRY"), metaData.get("TIMESTAMP")));

						}
					}

				}
				streamData.close();
				metaData.close();
			}

			// Prints created StreamData instances in order to test the codes.
			for (AarhusTrafficObservation stream1 : List) {
				System.out.println(stream1);
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}