
import traceback

from decouple import config as load_data
from flask import request, jsonify, Blueprint
from lib.Stech import Logger, Stech, Validate
from lib.ExceptionsJson import ExceptionsJson
from lib.ExceptionsHTTP import HTTP404Error

from sqlalchemy import text
from sqlalchemy.exc import SQLAlchemyError
from src.utils.Utils import Utils

main_company_vehicle_report = Blueprint('main_company_vehicle_report', __name__)

@main_company_vehicle_report.route('/', methods=['POST'])
def get_company_vehicle_report():

    try:
        
        data = request.get_json()
        list_vehicle_report = []

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

        company_id = data.get('company_id')

        session_company = Stech.get_session(load_data('ENVIRONMENTS_EMPRESAS'))
        query_car_company = text("""SELECT 
                                        detveh_patente
                                        , detveh_marca
                                        , detveh_modelo
                                        , detveh_color
                                    FROM detalles_vehiculos 
                                    WHERE detveh_empresa = :company_id""")
        response_query_car_company = session_company.execute(query_car_company, {'company_id': company_id}).fetchall()
        session_company.close()

        if not response_query_car_company:
            raise HTTP404Error('Cliente no tiene vehículos asociados a su empresa.')
        
        # Transformar a lista de cadenas
        lista_plate_number = [tuple_ for tuple_ in response_query_car_company]

        for data in lista_plate_number:
            session = Stech.get_session(load_data('ENVIRONMENTS'))
            # Consulta SQL para obtener información de dispositivos asociados al usuario y sus imágenes
            sql_devices = text(f"""SELECT 
                                dis_idreporte
                                , dis_patente
                                , dis_confirmado
                                , dis_protocolo
                                , dis_activo
                                , dis_fecha_servidor
                                , dis_fecha_gps
                                , dis_latitud
                                , dis_longitud
                                , dis_altitud
                                , dis_angulo
                                , dis_velocidad
                                , dis_img
                                , dis_desc
                                , dis_resp
                                , dis_dir
                                , dis_marca
                                , dis_modelo
                                , dis_color
                                , dis_anio
                                , dis_more_info
                                , dis_estado
                                , dis_montorepar
                                , dis_idcomuna
                                , dis_idregion
                                , dis_conteocolab
                                , dis_fecha_incidente 
                                FROM public.app_dispos_empresa('{data[0]}')""")
            result_devices = session.execute(sql_devices).fetchall()
            session.close()

            try:

                for row in result_devices:

                    fields = ["Color".capitalize(), "Marca".capitalize(), "Modelo".capitalize(), "Observacion".capitalize()]
                    defaults = {"Color".capitalize(): "Sin Color", "Marca".capitalize(
                    ): "Sin Marca", "Modelo".capitalize(): "Sin Modelo", "Observacion".capitalize(): "Sin Observaciones"}

                    # Convertir el objeto Row a un diccionario
                    row_dict = dict(row[20])

                    if all(row_dict.get(field) == "" for field in fields):
                        row_dict.update(defaults)

                    dict_dispositivo = {
                        "dis_idreporte": row[0],
                        "dis_patente": row[1],
                        "dis_confirmado": row[2],
                        "dis_protocolo": row[3],
                        "dis_activo": row[4],
                        "dis_fecha_servidor": (row[5]).strftime("%Y-%m-%d %H:%M:%S"),
                        "dis_fecha_gps": (row[6]).strftime("%Y-%m-%d %H:%M:%S"),
                        "dis_latitud": row[7],
                        "dis_longitud": row[8],
                        "dis_altitud": row[9],
                        "dis_angulo": row[10],
                        "dis_velocidad": row[11],
                        "dis_img": row[12],
                        "dis_desc": row[13],
                        "dis_resp": row[14],
                        "dis_dir": row[15],
                        "dis_marca": row[16],
                        "dis_modelo": row[17],
                        "dis_color": row[18],
                        "dis_anio": row[19],
                        "dis_more_info": row_dict,
                        "dis_estado": row[21],
                        "dis_montorepar": row[22],
                        "dis_idcomuna": row[23],
                        "dis_idregion": row[24],
                        "dis_conteocolab": row[25],
                        "dis_fecha_incidente": (row[26]).strftime("%Y-%m-%d %H:%M:%S")
                    }

                    data_list_eleimgs = text(f"SELECT * FROM public.list_images('{row[1]}')")
                    result_list_eleimgs = session.execute(data_list_eleimgs).fetchall()

                    string_urls = result_list_eleimgs[0][0]

                    # Eliminar elementos vacíos usando filter y una comprensión de listas
                    url_list = list(filter(None, string_urls[1:-1].split(',')))       
                    dict_dispositivo['eleimgs'] = url_list
                    list_vehicle_report.append(dict_dispositivo)
                    
            except Exception as ex:
                pass
            
        data_response = {
            "success": True,
            "list_vehicle_report": list_vehicle_report       
        }
        return jsonify(data_response), 200

    except ExceptionsJson as ex:
        return ex.args[0], 400

    except HTTP404Error as ex:
        return Utils.create_response(str(ex), False, 404)

    except (SQLAlchemyError, ValueError) as ex:
        return Utils.create_response(str(ex), False, 404)

    except Exception as ex:
        message = f"{str(ex)} - {str(traceback.format_exc())}"
        return Utils.create_response(message, False, 500)
