"""Hydrate FormFileDirectory from canonical [P] cloud_files (11D2).

Forms stays reference-only. This adapter asks Cloud whether a file_id is an
active project-scoped row. Pending/purged/cross-project refs are omitted so
verify_file_fields fails closed with invalid_file.
"""
from __future__ import annotations

from collections.abc import Awaitable, Callable, Mapping
from typing import Any

from src.domain.forms.canonical import FormDefinition, parse_form_file_ref
from src.domain.forms.files import FormFileRecord, InMemoryFormFileDirectory

ActiveFileLookup = Callable[[str, str], Awaitable[Mapping[str, Any] | None]]


def collect_form_file_refs(
    definition: FormDefinition, values: Mapping[str, Any]
) -> tuple[tuple[str, str], ...]:
    """Return (field_key, file_id) for well-shaped file fields only."""
    found: list[tuple[str, str]] = []
    for field in definition.fields:
        if field.type != "file" or field.key not in values:
            continue
        parsed = parse_form_file_ref(values[field.key])
        if parsed is None:
            continue
        found.append((field.key, parsed.file_id))
    return tuple(found)


def _is_active_project_file(
    row: Mapping[str, Any] | None, *, project_id: str, file_id: str
) -> bool:
    if not row:
        return False
    status = str(row.get("status") or "")
    if status != "active":
        return False
    row_project = str(row.get("project_id") or "")
    row_id = str(row.get("file_id") or row.get("id") or "")
    if row_id and row_id != file_id:
        return False
    if row_project and row_project != project_id:
        return False
    return True


async def hydrate_form_file_directory(
    *,
    project_id: str,
    definition: FormDefinition,
    values: Mapping[str, Any],
    lookup: ActiveFileLookup,
) -> InMemoryFormFileDirectory:
    """Build a sync directory from Cloud active-file lookups."""
    directory = InMemoryFormFileDirectory()
    for _field, file_id in collect_form_file_refs(definition, values):
        row = await lookup(project_id, file_id)
        if _is_active_project_file(row, project_id=project_id, file_id=file_id):
            directory.put(FormFileRecord(project_id=project_id, file_id=file_id))
    return directory


async def cloud_form_file_lookup(project_id: str, file_id: str) -> Mapping[str, Any] | None:
    from src.integrations.cloud_control_client import CloudControlClient

    return await CloudControlClient().get_active_storage_file(
        project_id=project_id, file_id=file_id
    )
