"""
Push quotation lifecycle events from ERP to the CRM.

When sales staff create or update a quotation in the ERP, the CRM receives a
matching quote so both systems stay aligned. Mirrors the CRM -> ERP order push
in the opposite direction for quotations.
"""
from __future__ import annotations

import logging
import threading

import requests

logger = logging.getLogger(__name__)


def _post(url, secret, payload):
    try:
        response = requests.post(
            url,
            json=payload,
            headers={"X-Webhook-Secret": secret or ""},
            timeout=12,
        )
        if response.status_code >= 400:
            logger.warning(
                "CRM quotation webhook HTTP %s: %s",
                response.status_code,
                response.text[:500],
            )
            return None
        try:
            return response.json()
        except Exception:
            return {"status": "ok"}
    except Exception as exc:  # noqa: BLE001
        logger.warning("CRM quotation webhook failed: %s", exc)
        return None


def _resolve_webhook_config():
    from system_administration.host_policy import resolve_crm_webhook

    return resolve_crm_webhook("crm_quotation_webhook_url")


def notify_crm_quotation(payload, wait_for_response=False):
    """Queue (or run) a CRM quotation sync event."""
    url, secret = _resolve_webhook_config()
    if not url:
        return None

    if wait_for_response:
        return _post(url, secret, payload)

    threading.Thread(target=_post, args=(url, secret, payload), daemon=True).start()
    return True


def apply_crm_quotation_response(quotation, response_json):
    """Persist CRM quote uuid returned from the webhook response."""
    if not quotation or not response_json:
        return
    try:
        data = response_json.get("data") or response_json.get("payload") or response_json
        crm_uuid = (data.get("crm_quote_uuid") or data.get("uuid") or "").strip()
        if crm_uuid:
            quotation.crm_quote_uuid = crm_uuid
            quotation.synced_to_crm = True
            quotation.save(update_fields=["crm_quote_uuid", "synced_to_crm"])
    except Exception as exc:  # noqa: BLE001
        logger.warning("failed to apply CRM quotation response: %s", exc)
