from flask import Flask, jsonify, abort, make_response, request
import firebase_admin
from firebase_admin import credentials, db
import datetime

FIREBASE_DB_URL = "<URL to Firebase database>"
FIREBASE_CERTIFICATE_PATH = "firebase-admin.json"

cred = credentials.Certificate(FIREBASE_CERTIFICATE_PATH)
firebase_admin.initialize_app(cred, {'databaseURL': FIREBASE_DB_URL})

NOT_FOUND = 'Not found'
BAD_REQUEST = 'Bad request'

app = Flask(__name__)

sensors = [
    {
        "id": 1,
        "description": "espclient1",
        "sensor_name": "temperature_dht11",
        "value": 25,
    },
    {
        "id": 2,
        "description": "espclient1",
        "sensor_name": "humidity_dht11",
        "value": 30,
    },
    {
        "id": 3,
        "description": "espclient2",
        "sensor_name": "ultrasonic_sensor",
        "value": 20,
    },
]

def _get_sensor(id, limit=20):
    # Firebase path `/data/<id>/`
    sensor_ref = db.reference('/data').child(id)
    # Take last `limit` entries
    query = sensor_ref.order_by_key()
    query = query.limit_to_last(limit)
    return query.get()

def _record_exists(sensor_name):
    return [
        sensor for sensor in sensors if sensor["sensor_name"] == sensor_name
    ]

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': NOT_FOUND}), 404)

@app.errorhandler(400)
def bad_request(error):
    return make_response(jsonify({'error': BAD_REQUEST}), 400)

@app.route('/api/sensors', methods=['GET'])
def get_sensors():
    # Firebase path `/sensors/`
    result = db.reference('/sensors').get()
    return jsonify(result), 201

@app.route('/api/sensors/<id>', methods=['GET'])
def get_sensor(id):
    sensor = _get_sensor(id)
    if not sensor:
        abort(404)
    return jsonify(sensor)


@app.route('/api/sensors', methods=['POST'])
def create_sensor():
    if not request.json or 'description' not in request.json or 'sensor_name' not in request.json:
        abort(400)
    description = request.json.get('description')
    sensor_name = request.json.get('sensor_name')

    # Add `sensor_info` to Firebase `/sensors/<sensor_id>`
    sensor_info = {"sensor_name": sensor_name, "description": description}
    sensor_id = db.reference('/sensors').push(sensor_info).key  # type: ignore
    return str(sensor_id), 201

@app.route('/api/sensors/<id>', methods=['PUT'])
def update_sensor(id):
    if not request.json:
        abort(400)
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")
    # Firebase path `/data/<id>/<timestamp>`
    entry_ref = db.reference('/data').child(id).child(timestamp)
    entry_ref.set(request.json)
    return jsonify({}), 200

@app.route('/api/sensors/<id>', methods=['DELETE'])
def delete_sensor(id):
    # Firebase path `/sensors/<id>`
    db.reference('/sensors').child(id).delete()
    # Firebase path `/data/<id>`
    db.reference('/data').child(id).delete()
    return jsonify({}), 204


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

