from __future__ import annotations

import logging
from typing import Any

from .common import _normalize_error, _utc_timestamp

logger = logging.getLogger("dscons.desktop_automation.zalo_msg")


class DesktopZaloMessagingMixin:
    """Zalo message sending and confirmation workflows."""

    async def zalo_send_message_to_target(
        self,
        target_type: str,
        message: str,
        target_name: str | None = None,
        verify_before_send: bool = True,
    ) -> dict[str, Any]:
        """Safely send a message to a verified Zalo target."""
        if target_type == "my_document":
            verify_result = None
            if verify_before_send:
                verify_result = await self.zalo_verify_active_chat(
                    expected_name="My Documents",
                    allow_partial_match=True,
                )
                if verify_result and not verify_result.get("ok"):
                    return {
                        "ok": False,
                        "action": "zalo_send_message_to_target",
                        "timestamp": _utc_timestamp(),
                        "data": {
                            "target_type": target_type,
                            "target_name": target_name,
                            "message_preview": message[:80],
                            "verify_before_send": verify_before_send,
                            "backend": "local_contract",
                            "implemented": False,
                        },
                        "artifacts": {
                            "verify_chat": verify_result,
                        },
                        "error": _normalize_error(verify_result.get("error")),
                    }

            try:
                result = await self._run_mcp_server_tool(
                    "zalo_send_message_to_my_documents",
                    {
                        "message": message,
                        "press_enter": True,
                        "search_term": target_name or "My Documents",
                    },
                )
                result.setdefault("data", {})
                result["data"].update(
                    {
                        "target_type": target_type,
                        "target_name": "My Documents",
                        "message_preview": message[:80],
                        "message_length": len(message),
                        "verify_before_send": verify_before_send,
                        "delivery_mode": "live_mcp",
                        "backend": "local_mcp_direct",
                        "implemented": True,
                    }
                )
                if verify_result is not None:
                    result["artifacts"] = {
                        "verify_chat": verify_result,
                        "mcp_result": result.get("artifacts", []),
                    }
                return result
            except Exception as exc:
                return {
                    "ok": False,
                    "action": "zalo_send_message_to_target",
                    "timestamp": _utc_timestamp(),
                    "data": {
                        "target_type": target_type,
                        "target_name": target_name,
                        "message_preview": message[:80],
                        "verify_before_send": verify_before_send,
                        "backend": "mcp_error",
                    },
                    "artifacts": {
                        "verify_chat": verify_result,
                    },
                    "error": {
                        "code": "zalo_send_message_failed",
                        "message": str(exc),
                        "details": {"supported_target_type": "my_document"},
                    },
                }

        return {
            "ok": False,
            "action": "zalo_send_message_to_target",
            "timestamp": _utc_timestamp(),
            "data": {
                "target_type": target_type,
                "target_name": target_name,
                "message_preview": message[:80],
                "verify_before_send": verify_before_send,
                "backend": "unsupported",
            },
            "artifacts": {},
            "error": {
                "code": "unsupported_target",
                "message": "Contact send flow is not available in the current DSCons desktop backend.",
                "details": {"supported_target_type": "my_document"},
            },
        }
