# Archivo: CotizCreatedIng.py
# Ruta: src\App\Operaciones_Module\Ingenieria\Cotiz\CotizCreatedIng.py
# Descripción: Módulo para crear cotizaciones del área de ingeniería
# Autor: Equipo de Desarrollo IGSA
# Fecha: 2025

from datetime import datetime
import logging
from flask import  app, jsonify, render_template, request, session
from App.Security_Module.UserAccess import check_user_access

# Importar funciones SQL específicas
from Consultas_SQL.Operaciones.Ingenieria.Cotiz.CotizCreatedIngSQL import (
    buscar_tarea_crm, buscar_oportunidad_crm,
    data_for_email,enviarCorreoCostingCreado, generar_costing_headSQL, get_currencies, get_taxes, obtener_contexto_usuario, obtener_datos_formulario, upload_archivos_simple, uploadFileAuxiliar,
     update_costing_head_docsidSQL
)

# Configurar logging
logger = logging.getLogger('cotizaciones_especiales')

def cotizcreateding_solicitud(app, mail):
    """
    Función principal que registra todas las funciones y endpoints del módulo de cotizaciones de ingeniería.
    Args:
        app: Instancia de Flask
        mail: Instancia del sistema de mail
    """ 

    _BASE_URL = "/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng"

    #/Ingenieria/Cotiz/CotizCreatedIng/get_data_for_email
    @app.route(f"{_BASE_URL}/get_data_for_email", methods=['GET'])
    @app.login_required 
    def get_data_for_email():
        task_id = request.args.get("task_id", type=int)  # 👈 obtiene el parámetro desde la URL

        if not task_id:
            return {"error": "task_id es requerido"}, 400

        dataJson = enviarCorreoCostingCreado(task_id)
        return dataJson
    

    """
    http://localhost:5000/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng/user_id
    """
    @app.route(f"{_BASE_URL}/user_id", methods=["GET"])
    @app.login_required 
    def get_user_id():
        """
        Retorna el UserID actual de la sesión si está autenticado.
        """
        user_id = session.get("user_id")

        if user_id is None:
            return jsonify({"error": "No hay sesión activa"}), 401

        return jsonify({"user_id": user_id}), 200
    

    """
    http://localhost:5000/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng/currencies
    """
    @app.route(f"{_BASE_URL}/currencies", methods=['GET'])
    @app.login_required 
    def get_currencies_controller2():
        """
        Endpoint para obtener todas las monedas activas del sistema.
        Ruta final: /api/general/currencies
        """
        try:
            currencies = get_currencies()

            if currencies:
                return jsonify(currencies), 200
            else:
                return jsonify({"message": "No se encontraron monedas activas"}), 404

        except Exception as e:
            print(f"Error en currencies endpoint: {e}")
            return jsonify({"error": "Ocurrió un error interno en el servidor"}), 500


    """
    http://localhost:5000/Ingenieria/Cotiz/CotizCreatedIng/get_taxes?currency=USD
    """
    @app.route("/Ingenieria/Cotiz/CotizCreatedIng/get_taxes", methods=['GET'])
    @app.login_required 
    def get_taxes_controller2():
        """
        Endpoint para obtener impuestos activos filtrados por CurrencyCode (query param).
        Compatible con: fillTaxCurrencySelect(currencyCode)
        """
        try:
            currency_code = request.args.get("currency", None)

            if not currency_code:
                return jsonify({"error": "El parámetro 'currency' es requerido"}), 400

            taxes = get_taxes(currency_code)

            return jsonify(taxes), 200

        except Exception as e:
            print(f"Error en get_taxes endpoint: {e}")
            return jsonify({"error": "Ocurrió un error interno en el servidor"}), 500


    """
    http://localhost:5000/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng/uploadFile
    """
    @app.route(f"{_BASE_URL}/uploadFile", methods=['POST'])
    @app.login_required 
    def uploadFile():
        UserID = session.get('user_id')

        archivos  = request.files.getlist('archivos[]')  # lista de archivos
        categoria = request.form.get('categoria', 'CotizCreatedIng')
        CostingID = request.form.get("CostingID")

        # 🔁 Subir archivos y obtener resultado
        resultado = upload_archivos_simple(
            archivos=archivos,
            modulo_id="CotizCreatedIng",
            user_id=UserID,
            CostingID=CostingID,
            categoria=categoria
        )

        DocsID = resultado.get("DocsID")

        resultado = uploadFileAuxiliar(DocsID,CostingID,resultado)

        # 🔙 Respuesta final al frontend
        status_code = 200 if resultado.get('success') else 400
        return jsonify(resultado), status_code
    

    """
    http://localhost:5000/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng/Q_CostingHead/Completo
    """
    @app.route(f"{_BASE_URL}/Q_CostingHead/Completo", methods=["POST"])
    @app.login_required 
    def generar_costing_head():
        """
        Endpoint que crea Q_CostingHead y Q_CostingDetail en una transacción.
        Obtiene el último CostingNum, incrementa +1 y lo usa para insertar.
        """
        conn = None
        cursor = None
        
        data = request.get_json()

        return generar_costing_headSQL(data)


    """
    http://localhost:5000/api/Operaciones/Ingenieria/Cotiz/CotizCreatedIng/updateCostingHead-docsID
    """
    @app.route(f"{_BASE_URL}/updateCostingHead-docsID", methods=['POST'])
    @app.login_required 
    def update_costing_head_docsid():
        """
        Endpoint para actualizar el DocsID en Q_CostingHead.
        """
        data = request.get_json()
        return  update_costing_head_docsidSQL(data)