import requests
import base64
import os
import subprocess
import tempfile

def optimizar_pdf_con_ghostscript(ruta_pdf):
    """
    Optimiza un PDF usando Ghostscript.
    Retorna la ruta del PDF optimizado.
    """
    try:
        # Crear archivo temporal para el PDF optimizado
        temp_dir = tempfile.gettempdir()
        nombre_base = os.path.splitext(os.path.basename(ruta_pdf))[0]
        ruta_optimizada = os.path.join(temp_dir, f"{nombre_base}_optimizado.pdf")
        
        # Comando de Ghostscript para optimizar
        comando = [
            "gs",
            "-sDEVICE=pdfwrite",
            "-dCompatibilityLevel=1.4",
            "-dPDFSETTINGS=/ebook",
            "-dNOPAUSE",
            "-dQUIET",
            "-dBATCH",
            "-dDetectDuplicateImages",
            "-r150x150",
            f"-sOutputFile={ruta_optimizada}",
            ruta_pdf
        ]
        
        # Ejecutar Ghostscript
        resultado = subprocess.run(comando, capture_output=True, text=True)
        
        if resultado.returncode != 0:
            print(f"Error al optimizar PDF: {resultado.stderr}")
            return None
        
        return ruta_optimizada
    except FileNotFoundError:
        print("ERROR: Ghostscript no está instalado. Instálalo con:")
        print("  - Windows: https://www.ghostscript.com/download/gsdnld.html")
        print("  - Linux: sudo apt-get install ghostscript")
        print("  - macOS: brew install ghostscript")
        return None

def obtener_tamaño_formateado(bytes_size):
    """Convierte bytes a formato legible (KB, MB)."""
    for unit in ['B', 'KB', 'MB']:
        if bytes_size < 1024.0:
            return f"{bytes_size:.2f} {unit}"
        bytes_size /= 1024.0
    return f"{bytes_size:.2f} GB"

def calcular_reduccion(tamaño_original, tamaño_optimizado):
    """Calcula el porcentaje de reducción."""
    if tamaño_original == 0:
        return 0
    return ((tamaño_original - tamaño_optimizado) / tamaño_original) * 100

# Leer ID de solicitud
with open("solicitud_id.txt", "r") as f:
    ID_SOLICITUD = f.read().strip()

# Ruta del documento original
ruta_original = "docs/doc.pdf"

print("=" * 60)
print("OPTIMIZANDO DOCUMENTO PDF")
print("=" * 60)

# Obtener tamaño original
tamaño_original = os.path.getsize(ruta_original)
print(f"Tamaño original: {obtener_tamaño_formateado(tamaño_original)}")

# Optimizar con Ghostscript
ruta_optimizada = optimizar_pdf_con_ghostscript(ruta_original)

if ruta_optimizada is None:
    print("\nNo se pudo optimizar. Usando documento original...")
    ruta_a_usar = ruta_original
    tamaño_a_usar = tamaño_original
    print(f"Subiendo documento original: {obtener_tamaño_formateado(tamaño_original)}")
else:
    # Obtener tamaño optimizado
    tamaño_optimizado = os.path.getsize(ruta_optimizada)
    reduccion = calcular_reduccion(tamaño_original, tamaño_optimizado)
    
    print(f"Tamaño optimizado: {obtener_tamaño_formateado(tamaño_optimizado)}")
    print(f"Reducción: {reduccion:.1f}%")
    print(f"Ahorro: {obtener_tamaño_formateado(tamaño_original - tamaño_optimizado)}")
    print()
    
    ruta_a_usar = ruta_optimizada
    tamaño_a_usar = tamaño_optimizado

# Leer y codificar el PDF (optimizado o original)
with open(ruta_a_usar, "rb") as f:
    pdf_base64 = base64.b64encode(f.read()).decode('utf-8')

# Preparar payload
url = "https://wsomnimsgrest.recargasypagos.com/api/v1/SolicitudeCreateDocument"
payload = {
    "UserName": "1709922841",
    "Password": "designerAV2033$$!",
    "IDSolicitud": int(ID_SOLICITUD),
    "NombreDocumento": "doc.pdf",
    "DocumentoBase64": pdf_base64,
    "numeroPagina": "1"
}

print("=" * 60)
print("SUBIENDO DOCUMENTO A OMNISWITCH")
print("=" * 60)
print(f"Documento a subir: {obtener_tamaño_formateado(tamaño_a_usar)}")

# Subir documento
response = requests.post(url, json=payload)
resultado = response.json()

print("RESPUESTA:", resultado)

# Limpiar archivo optimizado si se creó
if ruta_optimizada and os.path.exists(ruta_optimizada):
    os.remove(ruta_optimizada)
    print("\nArchivo temporal de optimización eliminado.")

print("=" * 60)