"""11D2 — FormFileDirectory hydrates from canonical [P] cloud_files only."""
from __future__ import annotations

from src.domain.forms.canonical import quote_request_block_compatible_definition
from src.domain.forms.cloud_directory import (
    collect_form_file_refs,
    hydrate_form_file_directory,
)
from src.domain.forms.files import accept_form_submission_with_files

_FILE = "file_" + ("1" * 32)
_PROJECT = "prj_a"
_OTHER = "prj_b"


def _values(file_id: str = _FILE) -> dict:
    return {
        "name": "Ada",
        "email": "ada@example.com",
        "message": "Quote please",
        "attachment": {"file_id": file_id},
    }


async def test_hydrate_accepts_active_same_project() -> None:
    async def lookup(project_id: str, file_id: str):
        return {"ok": True, "file_id": file_id, "project_id": project_id, "status": "active"}

    directory = await hydrate_form_file_directory(
        project_id=_PROJECT,
        definition=quote_request_block_compatible_definition(),
        values=_values(),
        lookup=lookup,
    )
    assert directory.get(_PROJECT, _FILE) is not None


async def test_hydrate_rejects_pending_purged_and_cross_project() -> None:
    rows = {
        (_PROJECT, _FILE): {"ok": True, "file_id": _FILE, "project_id": _OTHER, "status": "active"},
    }

    async def lookup(project_id: str, file_id: str):
        return rows.get((project_id, file_id))

    stolen = await hydrate_form_file_directory(
        project_id=_PROJECT,
        definition=quote_request_block_compatible_definition(),
        values=_values(),
        lookup=lookup,
    )
    assert stolen.get(_PROJECT, _FILE) is None

    async def pending(_project_id: str, file_id: str):
        return {"ok": True, "file_id": file_id, "project_id": _PROJECT, "status": "pending"}

    waiting = await hydrate_form_file_directory(
        project_id=_PROJECT,
        definition=quote_request_block_compatible_definition(),
        values=_values(),
        lookup=pending,
    )
    assert waiting.get(_PROJECT, _FILE) is None

    async def missing(_project_id: str, _file_id: str):
        return None

    empty = await hydrate_form_file_directory(
        project_id=_PROJECT,
        definition=quote_request_block_compatible_definition(),
        values=_values(),
        lookup=missing,
    )
    result = accept_form_submission_with_files(
        quote_request_block_compatible_definition(),
        _values(),
        project_id=_PROJECT,
        files=empty,
    )
    assert result.accepted is False
    assert any(error.code == "invalid_file" for error in result.errors)


def test_collect_ignores_unshaped_file_values() -> None:
    refs = collect_form_file_refs(
        quote_request_block_compatible_definition(),
        {**_values(), "attachment": "https://cdn.example/x"},
    )
    assert refs == ()
