from datetime import datetime
import traceback
from flask import request, jsonify, Blueprint
from sqlalchemy import func, or_
from sqlalchemy.orm import aliased
from sqlalchemy.orm.exc import NoResultFound
from bcrypt import checkpw
from werkzeug.exceptions import BadRequest
from decouple import config as load_data

from lib.ExceptionsHTTP import HTTP404Error
from lib.Zeus import Zeus
from src.decorators import verify_token, write_token
from src.models.models import buscar_existe_gs_user_object, buscar_imei, get_access_user, insert_gs_user_object, insert_integraTAG, sacar_grupo_smartreport, update_group_id

api = Blueprint('api', __name__)

main_login = Blueprint('main_login', __name__)
main_integraTAG = Blueprint('main_integraTAG', __name__)

@main_login.route('/', methods=['POST'])
def login():
    try:
        data = request.get_json()
        try:
            #print(data)

            error_validate, is_validate = Zeus.validate_json_keys(data)
            if is_validate:
                raise ValueError(error_validate)

            get_user = get_access_user(data['username'], data['password'])

            if get_user:
                notSensibleData = {
                    'id': get_user[0]['id'],
                    'email': get_user[0]['email']
                }
                token = write_token(notSensibleData)
                if isinstance(token, bytes):
                    token = token.decode('utf-8')
                    return jsonify({'token': token}), 200
            else:
                return jsonify({'message': 'Usuario no encontrado'}), 404
            
        except NoResultFound:
            return jsonify({'message': 'Usuario no encontrado'}), 404
            
    except HTTP404Error as ex:
        response = jsonify(
            {'message': f"{ str(ex) }"})
        return response, 404

    except Exception as ex:
        response = jsonify(
            {'message': "Internal Server Error", "error": f"{str(ex)} - {str(traceback.format_exc())}"})
        return response, 500

@main_integraTAG.route('/', methods=['POST'])
@verify_token
def integraTAG():
    try:
        data = request.get_json()

        error_validate, is_validate = Zeus.validate_json_apitag(data)
        if is_validate:
            return jsonify({'message': error_validate}), 400
        
        fecha_actual = datetime.now()
        fecha_formateada = fecha_actual.strftime('%Y-%m-%d %H:%M:%S')

        insert_integraTAG(fecha_formateada, data['tipo_negocio'], data['ppu'], data['marca_vehiculo'], data['modelo_vehiculo'], data['anio_vehiculo'], data['color_vehiculo'], data['imei_gps'], data['usuario_solicitante'], data['tipo_actividad'])
        # Hasta aqui listo
        user_id = load_data('USER_ID')
        if (data['tipo_negocio'].upper() == 'RAC'):
            if(data['tipo_actividad'].lower() == 'alta'):
                imei_existe = buscar_imei(data['imei_gps'])
                if imei_existe:
                    existe_user_imei =buscar_existe_gs_user_object(user_id, data['imei_gps'])
                    if existe_user_imei:
                        update_group_id(existe_user_imei[0]['object_id'])
                    else:
                        insert_gs_user_object(user_id, data['imei_gps'])
                else:
                    return jsonify({'message': 'Error en los parámetros de entrada. Imei no encontrado'}), 400
            elif(data['tipo_actividad'].lower() == 'baja'):
                imei_existe = buscar_imei(data['imei_gps'])
                if imei_existe:
                    sacar_grupo_smartreport(user_id, data['imei_gps'] )
                else:
                    return jsonify({'message': 'Error en los parámetros de entrada. Imei no encontrado'}), 400
        else:
            return jsonify({'message': 'Error en los parámetros de entrada. No se permite otro tipo de negocio que no sea RAC'}), 400
        
        return jsonify({'message': 'Integración realizada con éxito'}), 200
    except Exception as ex:
        return jsonify({'message': 'Internal Server Error', "error": ex}), 500