# apps/wp_invoices/api/v1/routes.py
import os
from flask import render_template, request, redirect, url_for, flash, current_app, send_file
from .blueprint import bp
from ...services.file_store import save_staging, save_json
from ...services.extractor import run_extraction
from ...services.analyzer import analyze
from ...services.pdf_utils import is_dev_revision_enabled
import json
from ...services.invoice_revision_pdf import create_invoice_revision_pdf
from typing import Dict, Any
from apps.wp_invoices.integrations.tax_lookup import run_basic_tax_lookup
from shared.wp_invoices_auth import check_credentials
from apps.wp_invoices.services.pipeline import process_invoice_bytes

@bp.get("/")
def upload_form():
    # templates/v1/upload.html
    return render_template("v1/upload.html")

@bp.route("/form", methods=["GET", "POST"])
def upload_form_with_auth():
    if request.method == "GET":
        # Muestra un formulario simple
        return render_template("v1/upload_form_with_auth.html")

    # POST: procesar
    user = request.form.get("user", "").strip()
    pwd = request.form.get("pass", "").strip()
    engine = request.form.get("engine", "mini")

    if not check_credentials(user, pwd):
        # puedes manejarlo como prefieras
        return "Unauthorized: invalid USER/PASS", 401

    file = request.files.get("file")
    if not file:
        return "No file provided", 400

    file_bytes = file.read()
    filename = file.filename or "invoice.pdf"
    mimetype = file.mimetype or "application/pdf"

    # Usar el mismo pipeline del mail-bot
    result = process_invoice_bytes(
        file_bytes=file_bytes,
        filename=filename,
        content_type=mimetype,
        engine=engine,
    )

    extracted = result["extracted"]
    checks = result["checks"]

    tax_lookup_basic = run_basic_tax_lookup(extracted)
    print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ")
    print(tax_lookup_basic)
    if tax_lookup_basic:
        checks["tax_lookup_basic"] = tax_lookup_basic

    # Generar el PDF de revisión (usa la misma carpeta 'revisions')
    from pathlib import Path
    from apps.wp_invoices.integrations.mail_intake import MAIL_REVISIONS_DIR  # reutilizamos el mismo dir

    pdf_path = create_invoice_revision_pdf(
        extracted=extracted,
        output_dir=str(MAIL_REVISIONS_DIR),
        original_filename=filename,
        checks=checks,
    )

    # En esta v1 simplemente devolvemos el PDF directamente
    return send_file(pdf_path, as_attachment=True)

@bp.post("/process")
def process():
    print("📥 /invoices/v1/process: inicio")
    f = request.files.get("file")
    engine = request.form.get("engine", "mini")

    if not f:
        print("⚠️ No se recibió archivo")
        flash("Selecciona un archivo", "error")
        return redirect(url_for("wpinv_v1.upload_form"))

    data = f.read()
    filename = f.filename or "invoice"
    mimetype = f.mimetype or "application/octet-stream"
    print(f"📄 Archivo recibido: {filename} ({mimetype}), engine={engine}")

    meta = save_staging(data, filename, mimetype)
    print(f"📂 Guardado en staging: {meta['folder']}")

    # extracción
    result = run_extraction(data=data, filename=filename, mimetype=mimetype, engine=engine)
    print("📊 Extracción completada")

    analysis = analyze(result)
    print("📈 Análisis completado")

    save_json(meta["folder"], "raw", result)
    save_json(meta["folder"], "analysis", analysis)
    print("💾 Artefactos guardados en staging")

    json_text = json.dumps(result, ensure_ascii=False, indent=2)

    #Guardar pdf con resumen de la extracción
    # Crear PDF de revisión solo si la variable de entorno está activa
    if is_dev_revision_enabled():
        revisions_dir = current_app.config.get(
            'INVOICE_REVISIONS_DIR',
            os.path.join(current_app.root_path, 'revisions')
        )

    checks = result["totals"]["validations"]
    # Lookup ABN básico (V0)
    tax_lookup_basic = run_basic_tax_lookup(result)
    print(tax_lookup_basic)
    if tax_lookup_basic:
        checks["tax_lookup_basic"] = tax_lookup_basic

    try:
        create_invoice_revision_pdf(
            extracted=result,
            output_dir=revisions_dir,
            original_filename=filename,
            checks=checks if isinstance(checks, dict) else None,
        )
    except Exception as e:
        # No queremos que el fallo del PDF rompa el flujo normal
        current_app.logger.exception("Error creating invoice revision PDF: %s", e)
        flash('No se pudo generar el PDF de revisión (ver logs).', 'warning')
    print("📤 Renderizando template v1/result.html")


    return render_template(
        "v1/result.html",
        json_text=json_text,
        filename=filename,
        mimetype=mimetype,
        engine=engine,
        analysis=analysis,
        staging_folder=meta["folder"],
        staging_id=meta["id"],
    )

@bp.get("/health")
def health():
    return {"ok": True, "app": "wp_invoices", "version": "v1"}, 200

