from flask import Flask, request, render_template, redirect, url_for
from time import strftime
import datetime
import pendulum
from dotenv import dotenv_values
import influxdb_client
from influxdb_client.client.write_api import SYNCHRONOUS


config = dotenv_values(".env")

app = Flask(__name__)

client = influxdb_client.InfluxDBClient(
        url=config['DB_URL'],
        token=config['DB_TOKEN'],
        org=config['DB_ORG']
        )

@app.route('/success')
def success():
    return "Form success!"

@app.route('/', methods=['GET', 'POST'])
def main_page():
    query_api = client.query_api()
    query = 'from(bucket: "gas")\
  |> range(start: -96h)\
  |> filter(fn: (r) => r["_measurement"] == "2016_odyssey")\
  |> filter(fn: (r) => r["_field"] == "odometer")'
  
    #query = 'select TOP(odometer, 5) from odyssey'
    #data = client.query(query)
    result = query_api.query(org=config['DB_ORG'], query=query)
    # print(result)
    results = []
    for table in result:
        for record in table.records:
            results.append((record.get_time(), record.get_field(), record.get_value()))
    # print(results)
    data= results
    return render_template('index.html', data=data)

@app.route('/add_time', methods=['POST', 'GET'])
def add_time():
    today = strftime("%Y-%m-%d")
    now = strftime("%H:%M:%S")
#    database = request.form['db']
#    table = request.form['table']
    date = request.form['date']
    if date == '':
        date = today
    time = request.form['time']
    if time == '':
        time = now
    odometer = request.form['odometer']
    oilhealth= request.form['oilhealth']
    if oilhealth != '':
        oilhealth = float(oilhealth)
    fuel = request.form['fuel']
    if fuel != '':
        fuel = float(fuel)
    fuelcost = request.form['fuelcost']
    if fuelcost != '':
        fuelcost = float(fuelcost)
    winter = request.form['winter']
    if winter == 'TRUE':
        winter = True
    else:
        winter = False

    json_body = [
            {
                "time": date + "T" + time + "Z",
                "measurement": "odyssey",
                "fields": {
                    "odometer": float(odometer),
                    "oilhealth": oilhealth,
                    "fuel": fuel,
                    "fuelcost": fuelcost,
                    "winter": winter
                }
            }
    ]
    
    timestamp = date + "T" + time + "Z"
    dt = pendulum.parse(timestamp)
    print()
    print(dt)
    print()
    write_api = client.write_api(write_options=SYNCHRONOUS)
    p = influxdb_client.Point("2016_odyssey").time(timestamp).tag("oilhealth", oilhealth)\
        .tag("fuel", fuel).tag("fuelcost", fuelcost).tag("winter", winter).field("odometer", float(odometer))
    write_api.write(bucket="gas", org=config['DB_ORG'], record=p)
    print ("Submitting data to DB: {0}".format(json_body))
    #client.write_points(json_body)


    
    return redirect(url_for('main_page'))

@app.route('/repeat_last_odometer')
def repeat_last_odometer():
    query_api = client.query_api()
    query = 'from(bucket: "gas")\
  |> range(start: -7d)\
  |> filter(fn: (r) => r["_measurement"] == "2016_odyssey")\
  |> filter(fn: (r) => r["_field"] == "odometer")\
    |> last()'

    result = query_api.query(org=config['DB_ORG'], query=query)
    print()
    print()
    print(result)
    print()
    results = {}
    for table in result:
        for record in table.records:
            results[record.get_field()] = record.get_value()
            results['time'] = record.get_time()
            # .append((record.get_time(), record.get_field(), record.get_value()))
    print(results)
    print()

    date = strftime("%Y-%m-%d")
    time = strftime("%H:%M:%S")
    timestamp = date + "T" + time + "Z"

    print(results['odometer'])

    write_api = client.write_api(write_options=SYNCHRONOUS)
    p = influxdb_client.Point("2016_odyssey").time(timestamp).field("odometer", float(results['odometer']))
    write_api.write(bucket="gas", org=config['DB_ORG'], record=p)
    return redirect(url_for('main_page'))

@app.route('/admin')
def admin_index():
    return 'admin'

@app.route('/login')
def login():
    pass

@app.route('/logout')
def logout():
    pass

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port='9001')
