# apps/wp_invoices_mail_app/processor.py
import os
import base64
import traceback
import json
from typing import Any, Dict, List
from pathlib import Path
from bridge_platform.interapp.client import call_app

from jinja2 import Environment, FileSystemLoader, select_autoescape
from .renderers import render_results_email_html
from .storage_paths import ensure_tenant_mail_paths, resolve_tenant_id, safe_storage_stem, write_json

# Import “suave” de get_mail_theme, con fallback
try:
    from shared.branding.branding import get_mail_theme
except Exception:
    def get_mail_theme() -> dict:
        # Fallback seguro por si algo falla al importar branding
        return {
            "font_stack": "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
            "page_bg": "#020918",
            "card_bg": "#071429",
            "border_color": "#122647",
            "brand_color": "#0b3b73",
            "text_color": "#f5f7fb",
            "secondary_text": "#9ba4c4",
            "success_color": "#1fbf75",
            "error_color": "#f04444",
            "stat_bg": "#081937",
            "table_header_bg": "#0d2142",
            "tag_bg": "#132750",
            "tag_text": "#c3d1ff",
        }



def process_attachments_with_wp_invoices(attachments, context=None):
    """
    Procesa una lista de adjuntos usando la app wp_invoices.

    Devuelve una lista de dicts del tipo:
      - éxito:
        {
          "ok": True,
          "filename": "...",
          "revision_pdf_path": "...",
          "extracted": {...},   # si mail_intake lo incluye
          ...
        }
      - error:
        {
          "ok": False,
          "filename": "...",
          "error": "mensaje",
          "traceback": "stack...",
        }
    """
    results = []
    tenant_id = resolve_tenant_id(context)
    tenant_paths = ensure_tenant_mail_paths(tenant_id)

    for att in attachments:
        # Normalizar la forma del adjunto: tupla (filename, data, mimetype) o "objeto"
        if isinstance(att, tuple) and len(att) == 3:
            filename, data, mimetype = att
        else:
            filename = getattr(att, "filename", "unnamed")
            data = getattr(att, "content", None)
            mimetype = getattr(att, "mimetype", "application/octet-stream")

        if data is None:
            err_msg = "Adjunto sin contenido (data=None)"
            print(f"🔴 {err_msg} para {filename}")
            results.append(
                {
                    "ok": False,
                    "filename": filename,
                    "error": err_msg,
                }
            )
            continue

        print(f"🟢 Procesando adjunto con wp_invoices: {filename}")

        try:
            file_bytes_base64 = base64.b64encode(data).decode("utf-8")

            gateway_result = call_app(
                context={
                    "tenant": {"tenant_id": tenant_id},
                    "app_id": "wp_invoices_mail_app",
                    "user_id": "system_mail",
                },
                app="wp_invoices",
                action="process",
                payload={
                    "filename": filename,
                    "content_type": mimetype or "application/pdf",
                    "file_bytes_base64": file_bytes_base64,
                    "options": {
                        "tax_lookup": True,
                    },
                },
            )

            if gateway_result.get("status") != "ok":
                raise RuntimeError(gateway_result.get("message") or "wp_invoices process failed")

            pipeline_result = gateway_result.get("data") or gateway_result.get("result") or gateway_result
            write_json(
                tenant_paths["processed"] / f"{safe_storage_stem(filename)}.json",
                pipeline_result or {},
            )

            # pipeline_result puede traer:
            #  - revision_pdf_path
            #  - extracted
            #  - checks
            #  etc. → los mantenemos tal cual con **pipeline_result
            result = {
                "ok": True,
                "filename": filename,
                **(pipeline_result or {}),
            }
            results.append(result)

        except Exception as e:
            tb = traceback.format_exc()
            print(f"🔴 Error procesando adjunto {filename}: {e}")
            print(tb)
            write_json(
                tenant_paths["staging"] / f"{safe_storage_stem(filename)}.error.json",
                {
                    "filename": filename,
                    "error": str(e),
                    "traceback": tb,
                },
            )
            results.append(
                {
                    "ok": False,
                    "filename": filename,
                    "error": str(e),
                    "traceback": tb,
                }
            )

    return results

from typing import List, Dict, Any

def build_email_body_for_results(results: List[Dict[str, Any]]) -> str:
    """
    Wrapper para mantener compatibilidad.
    Ahora delega al motor de plantillas centralizado en renderers.py,
    que devuelve el HTML completo del correo de resultados.
    """
    return render_results_email_html(results)
