"""High-level Zalo automation workflow contracts for DSCons."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from app.modules.integrations.application.desktop_automation_adapter import DesktopAutomationAdapter


@dataclass(slots=True)
class ZaloAutomationService:
    """Business-safe Zalo workflow layer built on the desktop adapter."""

    adapter: DesktopAutomationAdapter

    async def send_message_to_contact(
        self, contact_name: str, message: str
    ) -> dict[str, Any]:
        """Send a message to a verified Zalo contact."""
        result = await self.adapter.zalo_send_message_to_target(
            target_type="contact",
            target_name=contact_name,
            message=message,
            verify_before_send=True,
        )
        await self.adapter.log_action(
            action="zalo_send_message_to_contact",
            status="ok" if result.get("ok") else "error",
            details={
                "target_name": contact_name,
                "message_preview": message[:80],
                "result_action": result.get("action"),
            },
        )
        return result

    async def send_message_to_my_document(
        self,
        message: str,
        *,
        verify_before_send: bool = True,
        press_enter: bool = True,
        capture_evidence: bool = True,
        workflow_id: str | None = None,
        message_label: str | None = None,
    ) -> dict[str, Any]:
        """Send a message to the built-in My Document chat."""
        result = await self.adapter.zalo_send_message_to_target(
            target_type="my_document",
            message=message,
            verify_before_send=verify_before_send,
        )
        await self.adapter.log_action(
            action="zalo_send_message_to_my_document",
            status="ok" if result.get("ok") else "error",
            details={
                "workflow_id": workflow_id,
                "message_label": message_label,
                "message_preview": message[:80],
                "message_length": len(message),
                "press_enter": press_enter,
                "capture_evidence": capture_evidence,
                "verify_before_send": verify_before_send,
                "result_action": result.get("action"),
            },
        )
        return {
            **result,
            "data": {
                **result.get("data", {}),
                "press_enter": press_enter,
                "capture_evidence": capture_evidence,
                "workflow_id": workflow_id,
                "message_label": message_label,
            },
        }

    async def download_latest_file_to_project(
        self,
        target_name: str,
        project_path: str,
        subfolder: str = "incoming/zalo",
        download_dir: str = "/Users/pain/Downloads",
    ) -> dict[str, Any]:
        """Download the latest file from a verified chat and move it into a project folder."""
        open_result = await self.adapter.zalo_open_chat(
            target_type="contact", target_name=target_name
        )
        if not open_result.get("ok"):
            await self.adapter.log_action(
                action="download_latest_file_to_project",
                status="error",
                details={
                    "stage": "open_chat",
                    "target_name": target_name,
                    "project_path": project_path,
                    "subfolder": subfolder,
                    "error": open_result.get("error"),
                },
            )
            return open_result

        verify_result = await self.adapter.zalo_verify_active_chat(
            expected_name=target_name,
            allow_partial_match=True,
        )
        if not verify_result.get("ok"):
            await self.adapter.log_action(
                action="download_latest_file_to_project",
                status="error",
                details={
                    "stage": "verify_chat",
                    "target_name": target_name,
                    "project_path": project_path,
                    "subfolder": subfolder,
                    "error": verify_result.get("error"),
                },
            )
            return {
                "ok": False,
                "action": "download_latest_file_to_project",
                "timestamp": verify_result.get("timestamp"),
                "data": {
                    "target_name": target_name,
                    "project_path": project_path,
                    "subfolder": subfolder,
                },
                "artifacts": {
                    "open_chat": open_result,
                    "verify_chat": verify_result,
                },
                "error": verify_result.get("error"),
            }

        download_result = await self.adapter.zalo_download_latest_file(
            download_dir=download_dir,
            timeout_seconds=60.0,
        )
        source_path = str(download_result.get("downloaded_file_path", ""))
        move_result = await self.adapter.move_file_to_project_folder(
            source_path=source_path,
            project_root=project_path,
            subfolder=subfolder,
            rename_to=None,
            create_dirs=True,
        )
        status = (
            "ok" if download_result.get("ok") and move_result.get("ok") else "error"
        )
        await self.adapter.log_action(
            action="download_latest_file_to_project",
            status=status,
            details={
                "target_name": target_name,
                "project_path": project_path,
                "subfolder": subfolder,
                "source_path": source_path,
                "destination_path": move_result.get("destination_path"),
            },
        )
        return {
            "ok": download_result.get("ok", False) and move_result.get("ok", False),
            "action": "download_latest_file_to_project",
            "timestamp": move_result.get("timestamp")
            or download_result.get("timestamp"),
            "data": {
                "target_name": target_name,
                "project_path": project_path,
                "subfolder": subfolder,
                "download_dir": download_dir,
                "destination_path": move_result.get("data", {}).get("destination_path"),
            },
            "artifacts": {
                "open_chat": open_result,
                "verify_chat": verify_result,
                "download": download_result,
                "move": move_result,
            },
            "error": move_result.get("error") or download_result.get("error"),
        }
