import os
import requests
import tempfile
import win32print
import time
import pygetwindow as gw
from flask import Flask, request, jsonify

app = Flask(__name__)

def download_pdf(pdf_url):
    try:
        response = requests.get(pdf_url)
        response.raise_for_status()
        temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf")
        with open(temp_file.name, 'wb') as f:
            f.write(response.content)
        return temp_file.name
    except Exception as e:
        raise Exception(f"Error al descargar el PDF: {e}")

def print_pdf(pdf_file, printer_name):
    try:
        # Verificar que el archivo PDF exista
        if not os.path.isfile(pdf_file):
            return jsonify({"error": f"El archivo PDF '{pdf_file}' no existe."}), 404

        # Imprimir el archivo PDF usando la impresora especificada
        win32print.SetDefaultPrinter(printer_name)
        os.startfile(pdf_file, "print")

        # Esperar un tiempo breve para que el visor de PDF tenga tiempo de abrirse
        time.sleep(2)

        # Cerrar el visor de PDF
        for window in gw.getWindowsWithTitle('Adobe Acrobat'):
            window.close()

        return jsonify({"message": f"Se ha enviado la impresión del archivo '{pdf_file}' a la impresora '{printer_name}'. Visor de PDF cerrado."})

    except Exception as e:
        return jsonify({"error": f"Error al imprimir: {e}"}), 500

@app.after_request
def after_request(response):
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
    response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
    return response

@app.route('/printers', methods=['GET'])
def get_printers():
    try:
        # Enumerar impresoras locales y de red conectadas
        printers_info = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS)
        printers = [printer[2] for printer in printers_info]
        return jsonify({"printers": printers})
    except Exception as e:
        return jsonify({"error": f"Error al listar impresoras: {e}"}), 500

@app.route('/print/<printer_name>/<path:pdf_url>', methods=['GET'])
def print_pdf_url(printer_name, pdf_url):
    try:
        # Descargar el archivo PDF desde la URL
        pdf_file_path = download_pdf(pdf_url)

        # Imprimir el archivo PDF
        response = print_pdf(pdf_file_path, printer_name)

        # Eliminar el archivo temporal
        os.remove(pdf_file_path)

        return response

    except Exception as e:
        return jsonify({"error": f"Error al procesar la solicitud: {e}"}), 500

if __name__ == '__main__':
    # Habilitar el servidor para escuchar en todas las interfaces de red y no bloquearse
    app.run(host='0.0.0.0', port=5000, debug=False)
