"""Dispatch Azure DevOps Service Hook events — sync mirror state with DB."""
from __future__ import annotations

from typing import Any

import structlog
from sqlalchemy.ext.asyncio import AsyncSession

from src.domain.azure_user_mirror.repository import ProjectUserAzureMirrorRepository

logger = structlog.get_logger()


async def dispatch(db: AsyncSession, event_type: str, payload: dict[str, Any]) -> dict[str, Any]:
    if not event_type:
        return {"action": "ignored", "reason": "no_event_type"}

    repo = ProjectUserAzureMirrorRepository(db)
    resource = payload.get("resource") or {}

    # git.push — note affected mirrors (no action needed, informational)
    if event_type == "git.push":
        repo_data = resource.get("repository") or {}
        project = (repo_data.get("project") or {}).get("name") or ""
        repo_name = repo_data.get("name") or ""
        full_name = f"{project}/{repo_name}" if project and repo_name else ""
        if full_name:
            mirrors = await repo.list_by_target_repo(full_name)
            logger.info("azure_push_noted", repo=full_name, mirror_count=len(mirrors))
        return {"action": "push_noted", "repo": full_name}

    # git.repository.deleted — no standard service hook event type for this yet;
    # included for completeness when Azure adds it
    if event_type in ("git.repository.deleted", "ms.vss-code.git-repository-deleted"):
        repo_data = resource.get("repository") or resource
        project = (repo_data.get("project") or {}).get("name") or ""
        repo_name = repo_data.get("name") or ""
        full_name = f"{project}/{repo_name}" if project and repo_name else ""
        if full_name:
            count = await repo.disable_by_target_repo(
                full_name,
                "Azure DevOps repository was deleted.",
            )
            logger.info("azure_repo_deleted", repo=full_name, mirrors_disabled=count)
        return {"action": "repo_deleted", "repo": full_name}

    return {"action": "ignored", "event_type": event_type}
