/*
 * Copyright 2018 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.sps.data;
 
// Imports the Google Cloud client library
import com.google.maps.GeocodingApi;
import com.google.maps.GeocodingApiRequest;
import com.google.maps.GeoApiContext;
import com.google.maps.GaeRequestHandler;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.LatLng;
import com.google.maps.TimeZoneApi;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.util.TimeZone;

/* Location object */
public class Location {
    private String address;
    private double latCoord;
    private double lngCoord;
    private LatLng coords;
    private TimeZone timeZoneObj;
    private String timeZoneID;

    public Location(String address) {
        this.address = address;
        try {
            setProperties();
        } catch (Exception e) {
            return;
        }
    }

    public void setProperties() throws Exception {
        GeoApiContext context = new GeoApiContext.Builder()
            .apiKey("AIzaSyD-yzkJXzUoSmD3IsclTXwugHGaqrb5ijk")
            .build();

        try {
            setCoordinates(context, address);
            setTimeZone(context, coords);
        } catch (Exception e) {
            return;
        }
    }

    public void setCoordinates(GeoApiContext context, String address) throws Exception {
        try {
            GeocodingResult[] results =  GeocodingApi.geocode(context,
                address).await();
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            this.latCoord = results[0].geometry.location.lat;
            this.lngCoord = results[0].geometry.location.lng;
            this.coords = new LatLng(latCoord, lngCoord);
        } catch (Exception e) {
            return;
        }
    }

    public void setTimeZone(GeoApiContext context, LatLng location) throws Exception {
        try {
            TimeZone results =  TimeZoneApi.getTimeZone(context,
                location).await();
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            this.timeZoneObj = results;
            this.timeZoneID = results.getID();
        } catch (Exception e) {
            return;
        }
    }

    public String getAddress() {
        return this.address;
    }
 
    public Double getLat() {
        return this.latCoord;
    }

    public Double getLng() {
        return this.lngCoord;
    }

    public LatLng getCoords() {
        return this.coords;
    }
 
    public String getTimeZoneID() {
        return this.timeZoneID;
    }

    public TimeZone getTimeZone() {
        return this.timeZoneObj;
    }
}
@@ -1029,32 +1029,138 @@
 leOutputStream;%0A
+import java.io.FileReader; %0Aimport java.io.File;%0Aimport java.nio.file.Files; %0Aimport java.nio.file.Paths;%0A
 import java.io.O
@@ -1228,16 +1228,17 @@
 eZone;%0A%0A
+%0A
 /* Locat
@@ -1452,16 +1452,21 @@
 eZoneID;
+%0A    
 %0A%0A    pu
@@ -1684,32 +1684,154 @@
 ows Exception %7B%0A
+        String apiKey = new String(Files.readAllBytes(Paths.get(getClass().getResource(%22/files/apikey.txt%22).getFile())));%0A
         GeoApiCo
@@ -1898,49 +1898,14 @@
 Key(
-%22AIzaSyD-yzkJXzUoSmD3IsclTXwugHGaqrb5ijk%22
+apiKey
 )%0A  

Add file path