import os
import flask
import pandas as pd
import tensorflow as tf
from keras.models import load_model
import requests
import datetime
from sklearn import preprocessing
import numpy as np
from sklearn.preprocessing import StandardScaler
import json
import pickle
from sklearn.pipeline import Pipeline
from keras.optimizers import Adam

# instantiate flask 
app = flask.Flask(__name__)

# Load the model without compilation
model = load_model('final_model.h5', compile=False)

# Recompile the model with the appropriate optimizer
optimizer = Adam(learning_rate=0.001)  # Adjust learning_rate as needed
model.compile(optimizer=optimizer, loss='mean_squared_error')  # Adjust the loss function as needed

holidays_tt = ["2020-01-01",
               "2020-01-15",
               "2020-01-26",
               "2020-02-21",
               "2020-03-10",
               "2020-03-25",
               "2020-04-02",
               "2020-04-06",
               "2020-04-10",
               "2020-05-01",
               "2020-05-07",
               "2020-05-25",
               "2020-06-23",
               "2020-08-01",
               "2020-08-03",
               "2020-08-12",
               "2020-08-15",
               "2020-08-22",
               "2020-08-30",
               "2020-08-31",
               "2020-10-02",
               "2020-10-25",
               "2020-10-30",
               "2020-11-14",
               "2020-11-30",
               "2020-12-25"
              ]
url = "https://api.openweathermap.org/data/2.5/weather?q=Bengaluru,in&APPID=b1a275b64af38a8f9823800a58345b93"

# homepage
@app.route("/", methods=["GET","POST"])
def homepage():
    return flask.render_template("index.html")

# define a predict function as an endpoint 
@app.route("/predict", methods=["POST"])
def predict():
    dat = flask.request.form['date']
    time = flask.request.form['time']
    
    #holiday
    holiday = 1 if str(dat) in holidays_tt else 0
    
    response = requests.get(url).json()
    temp = float(response["main"]["temp"]) - 273.15
    temp_min = float(response["main"]["temp_min"]) - 283.15 #made it 283.15 from 273.15
    temp_max = float(response["main"]["temp_max"]) - 273.15
    pressure = response["main"]["pressure"]
    humidity = response["main"]["humidity"]
    
    # week
    date_time_obj = datetime.datetime.strptime(dat, '%Y-%m-%d')
    week = datetime.date(date_time_obj.year, date_time_obj.month, date_time_obj.day).isocalendar()[1]
    if week < 26:
        week += 25
    
    # hour
    hour = int(time[:-3])
    
    # population dictionary
    dic = {
       "HSR Division": 105265,
       "Koramangala Division": 63987,
       "Indiranagar": 58830,
       "Shivajinagar": 57437,
       "Hebbal": 54301,
       "Whitefield": 84428,
       "Malleshwaram": 57107,
       "Rajaji Nagara Division": 55250,
       "Jayanagar": 56658,
       "Jalahalli": 63391,
       "Kengeri Division": 68087,
       "R R NAGAR": 82848,
       "Vidhanasoudha": 69057,
       "Peenya Division": 96549
    }
    
    lb = preprocessing.LabelBinarizer()
    lb.fit(list(dic.keys()))
    lt = list(dic.keys())
    df = pd.DataFrame(lt)
    divs = lb.transform(df)
    divs = pd.DataFrame(divs)
    
    # Preparing data
    week_col = [week] * 14
    temp_max_col = [temp_max] * 14
    temp_min_col = [temp_min] * 14
    holiday_col = [holiday] * 14
    pop_col = [dic[x] for x in lt]
    hour_col = [hour] * 14
    
    divs = pd.concat([pd.DataFrame(temp_max_col), divs], axis=1)
    divs = pd.concat([pd.DataFrame(temp_min_col), divs], axis=1)
    divs = pd.concat([pd.DataFrame(week_col), divs], axis=1)
    divs = pd.concat([divs, pd.DataFrame(holiday_col)], axis=1)
    divs = pd.concat([divs, pd.DataFrame(pop_col)], axis=1)
    divs = pd.concat([divs, pd.DataFrame(hour_col)], axis=1)
    
    smol = pd.read_excel('smol.xlsx').iloc[:, 1:]
    df = pd.DataFrame(np.concatenate((divs.values, smol.values), axis=0))
    
    sc_X = StandardScaler()
    df = sc_X.fit_transform(df)
    
    prd = model.predict(df)
    prd = abs(prd[0:14])
    newprd = prd.tolist()
    
    return flask.render_template("index.html", data=newprd)