"""Authorize and enqueue the provider-neutral P2HS-owned SMS fallback."""
from __future__ import annotations

from typing import Any
from uuid import UUID

from src.domain.cloud.schemas import AuthorizeRequest, AuthorizeRequestMeta, AuthorizeResponseDenied
from src.domain.cloud.service import CloudInternalService, _expected_client_id
from src.domain.connectors.idempotency import execute_idempotency_key
from src.integrations.cloud_control_client import CloudControlClient


async def enqueue_authorized_sms_send(
    *, cloud_svc: CloudInternalService, cloud_client: CloudControlClient, project: Any,
    workspace_id: UUID, payload: dict[str, Any], idempotency_key: str | None = None,
    handshake_id: str = "core_capability_invoke",
) -> dict[str, Any]:
    idem = execute_idempotency_key(idempotency_key)
    auth = await cloud_svc.authorize(
        AuthorizeRequest(
            workspace_id=str(workspace_id), project_id=str(project.id),
            client_id=_expected_client_id(project), handshake_id=handshake_id,
            request_type="integration.execute", idempotency_key=idem,
            action="p2hs.sms.send",
            request_meta=AuthorizeRequestMeta(origin="", payload_hash="", estimated_units=1),
        )
    )
    if isinstance(auth, AuthorizeResponseDenied):
        return {"ok": False, "reason_code": auth.reason_code, "message": auth.message}
    result = await cloud_client.enqueue_control_job(
        project_id=str(project.id), workspace_id=str(workspace_id),
        client_id=_expected_client_id(project), request_type="integration.execute",
        idempotency_key=idem, payload={"action": "p2hs.sms.send", "input": payload},
        authorization_id=auth.authorization_id, grant_jwt=auth.grant.jwt,
        grant_expires_at=auth.grant.expires_at,
        policy_snapshot=auth.policy_snapshot.model_dump(mode="json"),
    )
    if not result.get("ok"):
        return {"ok": False, "reason_code": "provider_unavailable",
                "message": f"Failed to queue SMS job: {result.get('error') or 'cloud_enqueue_failed'}"}
    return {"ok": True, "job_id": str(result.get("job_id") or ""),
            "status": str(result.get("status") or "queued")}
