from flask import Flask, jsonify, request
from xmpp import cli
from flask_jwt_extended import JWTManager, jwt_required, get_jwt_identity, create_access_token
from datetime import timedelta

from config import Config
from SharixQuery import SharixQuery
#from OpenSSL import SSL

#context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
#context.use_privatekey_file('server.key')
#context.use_certificate_file('server.crt')
### ssl_context=context in run

#Инициализация класс для запросов к базе данны
db_query = SharixQuery()
#Инициализация Flask
app = Flask(__name__)
#Добавление секртного слова для шифрования JWT
app.config.from_object(Config)
#Инициализация класса шифрования
jwt = JWTManager(app)

#Переменные чтобы не ошибиться
data = 'data'
code = 'httpcode'

#Генерация токена (id - данные которые шифруются, min - время действия токена)
#Используются при авторизации или регистрации (возможно выдавать и при других обстоятельствах)
def gen_token(id, min):
    token = {"access_token" : create_access_token(identity=id, expires_delta=timedelta(minutes=min))}
    return jsonify(token)
#Ошибка сервера (возвращает ошибку и код ошибки)
def err_mes(ex):
    return jsonify({"msg":str(ex)}), 500

#Авторизация пользователя
@app.route('/auth', methods=['POST'])
def post_auth():
    try:
        result = db_query.auth_query(request.get_json())
        return gen_token(result[data]['id'], 5), result[code]
    except Exception as ex:
        return err_mes(ex)   

#Добавление пользователя и проверка на сходства
@app.route('/adduser', methods=['POST'])
def get_add():
    try:
        result = db_query.add_query(request.get_json())
        return jsonify(result[data]), result[code]
    except Exception as ex:
        err_mes(ex) 

#Запрос на получение данных об одном пользователе
@app.route('/user/<int:id>', methods=['GET'])
def get_user(id):
    try:
        result = db_query.get_user_query(id)
        return jsonify(result[data]), result[code]
    except Exception as ex:
        return err_mes(ex) 

#Запрос на получение данных всех пользователей
@app.route('/users', methods=['GET'])
def get_show_user():
    try:
        result = db_query.get_all_user_query()
        return jsonify(result[data]), result[code]
    except Exception as ex:
        return err_mes(ex) 

#Удаление пользователя
@app.route('/deleteuser', methods=['POST'])
def delete_user():
    try:
        result = db_query.delete_user_query(request.get_json())
        return jsonify(result[data]), result[code]
    except Exception as ex:
        return err_mes(ex) 

#Обновление данных пользователя
@app.route('/updateuser', methods=['POST'])
@jwt_required()
def test_api():
    try:
        result = db_query.update_user_query(request.get_json(), get_jwt_identity())
        return jsonify(result[data]), result[code]
    except Exception as ex:
        return err_mes(ex) 

#Отправка сообщения через XMPP
@app.route('/testmessage', methods=['POST'])
def send_mess():
    try:
        request_data = request.get_json()
        for to in request_data['to']:
            cli.send_message(request_data['from'], request_data['password'], to, request_data['message'])
        return jsonify({"msg":"Succes send!"}), 200
    except Exception as ex:
        return err_mes(ex) 


if __name__ == '__main__':
    #from waitress import serve
    #serve(app, host='127.0.0.2', port='8080')
    app.run(host='127.0.0.2', port='8080', debug=True, load_dotenv=True )