from flask import request, jsonify, render_template, redirect, url_for, send_file
from flask_login import LoginManager, login_user, logout_user, login_required
from app import app, db
from app.models import Person, Device, Role, Users
from app import service
from datetime import datetime

login_manager = LoginManager(app)
login_manager.login_view = 'login'


@login_manager.user_loader
def load_user(user_id):
    return Users.query.get(int(user_id))


@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']

    if Users.query.filter_by(username=username).first():
        return render_template('register.html', message='Bunday foydalanuvchi tizimda mavjud')

    new_user = Users(username=username)
    new_user.set_password(password)
    new_user.set_role(1)

    db.session.add(new_user)
    db.session.commit()
    login_user(new_user)
    return redirect(url_for('protected'))


@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']

    user = Users.query.filter_by(username=username).first()

    if not user or not user.check_password(password) is True:
        return jsonify({"msg": "Invalid username or password"}), 401

    login_user(user)
    return redirect(url_for('switch_device'))


@app.route('/')
def home():
    return render_template('index.html')


@app.route('/index')
def index():
    return redirect(url_for('home'))


@app.route('/user/info', methods=['GET'])
@login_required
def protected():
    return render_template('index.html')


@app.route('/login', methods=['GET'])
def login_page():
    return render_template('login.html')


@app.route('/register', methods=['GET'])
def register_form():
    return render_template('register.html')


@app.route('/logout', methods=['GET'])
@login_required
def logout():
    logout_user()
    return redirect(url_for('home'))


@app.route('/patcient', methods=['GET', 'POST'])
@login_required
def switch_device():
    return render_template('person_data.html')


@app.route('/api/v1/puls/<passport_number>', methods=['GET'])
@login_required
def get_data_url_image(passport_number):
    result = service.drow_graphic(f'{passport_number}')
    if result is False:
        return jsonify({'message': f'{passport_number} bunday foydalanuvchi mavjud emas'})
    else:
        return jsonify({
            'x': result[0],
            'y': result[1],
        })


def generate_formatted_time():
    now = datetime.now()
    formatted_time = now.strftime("%d-%m-%Y %H:%M:%S")
    return formatted_time


# time, qrs_complex, rr_interval, st_segment, p_wave, t_wave, pr_interval, qt_interval
@app.route('/api/v1/postdata', methods=['POST'])
def post_data():
    data = request.get_json()
    device_name = data['device_name']
    time = generate_formatted_time()
    qrs_complex = data['qrs_complex']
    rr_interval = data['rr_interval']
    st_segment = data['st_segment']
    p_wave = data['p_wave']
    t_wave = data['t_wave']
    pr_interval = data['pr_interval']
    qt_interval = data['qt_interval']
    hearbeats = data['hearbeats']

    device1 = Device.query.filter_by(name=device_name).first()
    person = Person.query.filter_by(device_id=device1.id).first()
    result = service.write_csv(f'{person.passport_number}', time, qrs_complex, rr_interval, st_segment, p_wave, t_wave,
                               pr_interval, qt_interval,hearbeats)
    if result is True:
        return jsonify({'message': 'Ma`lumotlar qabul qilindi'}), 200


@app.route('/api/v1/clear/<username>', methods=['DELETE'])
def clear_data(username):
    try:
        role_name = request.args.get('role_name')
        role = Role.query.filter_by(name=role_name).first()
        if role.id == 2:
            person = Person.query.filter_by(name=username).first()
            result = service.delete_person(person)
            return jsonify({'message': f'{result}'})
    except Exception as e:
        return jsonify({'message': 'Bunday person mavjud emas'})


@app.route('/api/v1/addperson', methods=['POST'])
def add_person():
    data = request.get_json()
    name = data['name']
    surname = data['surname']
    age = data['age']
    passport_number = data['passport']
    person = Person.query.filter_by(passport_number=passport_number).first()
    print(person)
    if person is None:
        new_person = Person(name=name, surname=surname, age=age, role_id=2, passport_number=passport_number)
        service.add_person(new_person)
        service.create_file(passport_number)
        return jsonify({'message': 'Person created'})
    else:
        return jsonify({'message': 'Bunday passportli mijoz mavjud'})


@app.route('/api/v1/getallperson', methods=['GET'])
def get_all_user():
    persons = Person.query.all()
    person_list = []
    for person in persons:
        person_data = {
            'name': person.name,
            'passport_number': person.passport_number,
            'surname': person.surname
        }
        person_list.append(person_data)
    return jsonify({'persons': person_list})


@app.route('/api/v1/device', methods=['POST'])
def plug_device():
    data = request.get_json()
    passport_number = data['passport_number']
    device_name = data['message']
    device1 = Device.query.filter_by(name=device_name).first()
    person = Person.query.filter_by(passport_number=passport_number).first()
    print(person.device_id)
    if person.device_id is None:
        new_person = Person.query.filter_by(device_id=device1.id).first()
        if new_person is not None:
            print(new_person.name)
            new_person.device_id = None
            db.session.commit()
            person.device_id = device1.id
            db.session.commit()
        else:
            person.device_id = device1.id
            db.session.commit()

    return jsonify({'message': 'device connected'})


@app.route('/api/v1/adddevice', methods=['POST'])
def add_device():
    data = request.get_json()
    device_name = data['device_name']


@app.route('/api/v1/deletedata/<passport>', methods=['DELETE'])
def delete_data(passport):
    print(passport)
    person = Person.query.filter_by(passport_number=passport).first()
    service.delete_person(person)
    service.delete_data(passport)
    return jsonify({'message': 'Person deleted'})


@app.route('/device', methods=['GET'])
@login_required
def device():
    return render_template('device.html')


@app.route('/api/v1/devices', methods=['GET'])
def get_devices():
    devices = Device.query.all()
    device_list = []
    for device1 in devices:
        print(device1.id)
        person = Person.query.filter_by(device_id=device1.id).first()
        if person is not None:
            device_data = {
                'name': device1.name,
                'person_name': person.name,
                'person_surname': person.surname,
                'passport': person.passport_number
            }
            device_list.append(device_data)

        else:
            device_data = {
                'name': device1.name,
                'person_name': 'NuLL',
                'person_surname': 'NuLL',
                'passport': 'NuLL'
            }
            device_list.append(device_data)
    return jsonify(device_list)


@app.route('/api/v1/deletedevice/<device_name>', methods=['DELETE'])
def delete_device(device_name):
    device1 = Device.query.filter_by(name=device_name).first()
    if device1 is not None:
        service.delete_person(device1)
        return jsonify({'message': 'Device deleted'})


@app.route('/api/v1/getfile/<passport>', methods=['GET'])
def get_file(passport):
    person = Person.query.filter_by(passport_number=passport).first()
    print(person.name)
    if person is not None:
        file = service.send_file(passport)
        if file is not False:
            return send_file(file, as_attachment=True)
        else:
            return jsonify({'message': 'file not exist'})
