import streamlit as st
import keras
import numpy as np
from PIL import Image
import io
import urllib.request
import os
st.set_page_config(layout="wide")


st.markdown("""
        <style>
               .block-container {
                    padding-top: 1rem;
                    padding-bottom: 0rem;
                    padding-left: 5rem;
                    padding-right: 5rem;
                }
        </style>
        """, unsafe_allow_html=True)

#title
col1, col2 = st.columns(2)
with col1:
    buffer, col = st.columns(2)
    with col:
        st.header('Overpass Identifier')
with col2:
    buffer1, col, buffer2 = st.columns(3)
    with col:
        st.image('overpass.jpg', width = 190)

st.write("---")

#load model and initialize image size required by model. uploaded images are resized to indicated size
img_height = 640
img_width = 640

state = st.session_state


if "loaded_model" not in state:
    with st.spinner('Loading model. This may take a few seconds...'):
        state.loaded_model = keras.models.load_model("0.0008-0.92.keras")

if "lat" not in state:
    state.lat = 39.11

if "lng" not in state:
    state.lng = -86.56 

if "coords_submitted" not in state:
    state.coords_submitted = False

#if "img_submitted" not in state:
    #state.img_submitted = False

if "img" not in state:
    state.img = None

col1, col2, col3 = st.columns(3)
with col3:
    #header
    st.subheader('Enter latitude/longitude coordinates:') 
                 
    coll, colr= st.columns(2)
    with coll:
        state.lat = st.number_input('Latitude', value=39.11, min_value=-90., max_value=90., step=.01) 
        st.write('The current lat/long are:')     
    with colr:        
        state.lng = st.number_input('Longitude', value=-86.56, min_value=-180., max_value=180., step=.01) 
        st.write(str(state.lat)+', '+str(state.lng))      
        with st.form("my_form"):
            submit_button = st.form_submit_button(
            label="Get Image and Prediction", on_click=lambda: state.update(coords_submitted=True))
        #header
    #st.subheader('Upload a satellite image:') 
    #img_buffer = st.file_uploader("Upload a satellite image file (format: .png, .jpeg, or .jpg).",type=['png', 'jpeg', 'jpg'])
    #if img_buffer is not None:
        #state.img = Image.open(img_buffer).convert("RGB")
    

with col2:
    if state.coords_submitted:
        state.coords_submitted = False
        try:
            api_key = os.getenv["goog_api"]
            url = "https://maps.googleapis.com/maps/api/staticmap?center="+str(state.lat)+","+str(state.lng)+"&zoom=16&size=640x640&maptype=satellite&key="+api_key
            buffer = io.BytesIO(urllib.request.urlopen(url).read())
            state.img = Image.open(buffer).convert("RGB")     
        except Exception as e:
            st.write("Error! Could not access Google Static API. Error code:",e)
        if state.img is not None:
            st.image(state.img, use_column_width = True)

with col1:
    st.subheader("Prediction")
    if state.img is not None:
        img_array = np.array(state.img)
        batch_size = 1
        img_array = np.reshape(img_array,[batch_size,img_height,img_width,3])
        result = state.loaded_model.predict(img_array)
        crossing_chance = result[0][1]*100
        status = None
        while status is None:
            if crossing_chance >= 0:
                status = "extremely un"
            if crossing_chance >= 10:
                status = "highly un"
            if crossing_chance >= 20:
                status = "pretty un"
            if crossing_chance >= 30:
                status = "slightly un"
            if crossing_chance >= 40:
                status = "a tiny bit more unlikely than "
            if crossing_chance >= 50:
                status = "a tiny bit more likely than un"
            if crossing_chance >= 60:
                status = "slightly "
            if crossing_chance >= 70:
                status = "pretty "
            if crossing_chance >= 80:
                status = "highly "
            if crossing_chance >= 90:
                status = "extremely "


        st.write(f"It's {status}likely there's at least one overpass here.")
        st.write("")
        st.write(f"In fact, the likelihood of at least one overpass is {np.round(crossing_chance,decimals=2)}%.")