from flask import render_template, Blueprint, request, flash, redirect, url_for
import iot.theme as theme
from iot.blueprints.sensor.models import nbiotDevice
import iot.blueprints.sensor.utils as sensorUtils
from iot.blueprints.sensor.forms import updateNbioDeviceUpdateForm, updateNbioDeviceAddForm
import iot.blueprints.database.utils as dbUtils
import iot.blueprints.user.utils as userUtils
from iot.app import db
import json
import os

sensor = Blueprint('sensor', __name__, template_folder='templates')

DATA_FILE = 'data.json'


sensor.route('/callback', methods=['POST'])
def callback():
    data = request.json

    if not data:
        return jsonify({"error": "Invalid data"}), 400

    # Read existing data
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, 'r') as f:
            stored_data = json.load(f)
    else:
        stored_data = []

    # Append new data
    stored_data.append(data)

    # Write data back to file
    with open(DATA_FILE, 'w') as f:
        json.dump(stored_data, f, indent=4)

    return 'Callback received', 200


@sensor.route('/data', methods=['GET'])
def get_data():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, 'r') as f:
            stored_data = json.load(f)
    else:
        stored_data = []

    return jsonify(stored_data)


@sensor.route('/list', methods=['GET','POST'])
def list():
    page=request.args.get('page', 1, type=int)
    table=dbUtils.table_printable_paginate(nbiotDevice, page, 20, 'edit/', 'id')
    return(render_template('view.html', theme=theme, table=table, title="Devices List"))


@sensor.route("/edit/<int:deviceId>", methods=['GET', 'POST'])
def edit(deviceId):
    if deviceId:
        device = nbiotDevice.query.get_or_404(deviceId)
        form = updateNbioDeviceUpdateForm(current_device_id=device.id)
        form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(device.user_id)]
        form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(device.status_id)]
        form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(device.type_id)]
        form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(device.area_id)]
        if form.validate_on_submit():
            device.name=form.name.data
            device.device_id=form.device_id.data
            device.imsi=form.imsi.data
            device.iccid=form.iccid.data
            device.ip=form.ip.data
            device.port=form.port.data
            device.registration_date=form.registration_date.data
            device.activation_date=form.activation_date.data
            device.deactivation_date=form.deactivation_date.data
            device.user_id=form.user_id.data
            device.status_id=form.status_id.data
            device.type_id=form.type_id.data
            device.area_id=form.area_id.data
            db.session.commit()
            flash('Device has been successfully updated', 'success')
            return redirect(url_for('sensor.edit', deviceId=deviceId))
        elif request.method == 'GET':
            form.name.data = device.name
            form.device_id.data = device.device_id
            form.imsi.data = device.imsi
            form.iccid.data = device.iccid
            form.ip.data = device.ip
            form.port.data = device.port
            form.registration_date.data = device.registration_date
            form.activation_date.data = device.activation_date
            form.deactivation_date.data = device.deactivation_date

        return render_template('sensor/account.html',
                                theme=theme,
                                form=form)
    else:
        flash('You need to select a Device id', 'alarm')
        return redirect(url_for('sensor.list'))


@sensor.route('/add', methods=['GET', 'POST'])
def add():
    form = updateNbioDeviceAddForm()
    form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(1)]
    form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(1)]
    form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(1)]
    form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(1)]
    if form.validate_on_submit():
        dev = nbiotDevice(
            name=form.name.data,
            device_id=form.device_id.data,
            imsi=form.imsi.data,
            iccid=form.iccid.data,
            ip=form.ip.data,
            port=form.port.data,
            registration_date=form.registration_date.data,
            activation_date=form.activation_date.data,
            deactivation_date=form.deactivation_date.data,
            user_id=form.user_id.data,
            status_id=form.status_id.data,
            type_id=form.type_id.data,
            area_id=form.area_id.data)
        dbUtils.dbAddAndCommit(dev)
        flash('Device has been successfully added', 'success')

    return render_template('sensor/account.html',
                            theme=theme,
                            form=form)