"""Backward compatibility facade for InvoiceProcessingService."""

from app.modules.invoices.application.invoice_processing import (
    DSCONS_DEFAULT_COMPANY_NAME,
    DSCONS_DEFAULT_TAX_CODE,
    InvoiceAutoSyncSchedulerService,
    InvoiceProcessingService,
    clean_signer_info,
    get_invoice_auto_sync_service,
    start_invoice_auto_sync_scheduler_loop,
    to_decimal,
)

__all__ = [
    "DSCONS_DEFAULT_COMPANY_NAME",
    "DSCONS_DEFAULT_TAX_CODE",
    "InvoiceAutoSyncSchedulerService",
    "InvoiceProcessingService",
    "clean_signer_info",
    "get_invoice_auto_sync_service",
    "start_invoice_auto_sync_scheduler_loop",
    "to_decimal",
]

# Add a monkey patch to InvoiceProcessingService to handle project matching for Pub/Sub Outbox
def match_invoice_to_project(self, invoice_id: str, project_id: str, wbs_id: str | None = None) -> dict:
    from app.core.module_framework.event_bus import event_bus
    
    with self.get_connection() as conn:
        with conn.cursor() as cur:
            # 1. Verify invoice exists and get total amount
            cur.execute("SELECT total_amount_vnd FROM erp_invoices WHERE id = %s", (invoice_id,))
            inv_row = cur.fetchone()
            if not inv_row:
                raise ValueError(f"Invoice {invoice_id} not found")
                
            total_amount = float(inv_row["total_amount_vnd"] or 0)
            
            # 2. Get items
            cur.execute("SELECT id, item_name, total_item_amount_vnd, business_category FROM erp_invoice_items WHERE invoice_id = %s", (invoice_id,))
            items = [dict(row) for row in cur.fetchall()]
            for item in items:
                item["id"] = str(item["id"])
                item["total_item_amount_vnd"] = float(item["total_item_amount_vnd"] or 0)

            # 3. Update the invoice
            cur.execute(
                """
                UPDATE erp_invoices
                SET matched_project_id = %s, matched_wbs_id = %s, updated_at = CURRENT_TIMESTAMP
                WHERE id = %s
                """,
                (project_id, wbs_id, invoice_id)
            )
            
            # 4. Write to Outbox (Transactional)
            payload = {
                "invoice_id": invoice_id,
                "project_id": project_id,
                "wbs_id": wbs_id,
                "items": items,
                "total_amount": total_amount
            }
            event_bus.publish_outbox(cur, "invoice.matched_to_wbs", payload)
            
        conn.commit()
    
    return {"status": "success", "invoice_id": invoice_id, "project_id": project_id}

setattr(InvoiceProcessingService, "match_invoice_to_project", match_invoice_to_project)
