from pathlib import Path

from autoshorts.comfyui_client import ComfyUIClient


class FakeTransport:
    def __init__(self):
        self.uploads = []
        self.posts = []
        self.downloads = []
        self.prompt_id = "prompt-123"

    def upload_image(self, base_url, path, *, remote_name, overwrite=True):
        self.uploads.append((base_url, str(path), remote_name, overwrite))
        return {"name": remote_name, "subfolder": "", "type": "input"}

    def post_json(self, base_url, endpoint, payload):
        self.posts.append((base_url, endpoint, payload))
        if endpoint == "/prompt":
            return {"prompt_id": self.prompt_id, "node_errors": {}}
        return {}

    def wait_for_completion(self, base_url, prompt_id, *, poll_seconds, timeout_seconds):
        assert prompt_id == self.prompt_id
        return {
            "status": {"status_str": "success", "completed": True},
            "outputs": {
                "12": {
                    "images": [
                        {
                            "filename": "clip_00001_.mp4",
                            "subfolder": "",
                            "type": "output",
                        }
                    ]
                }
            },
        }

    def download_view(self, base_url, output, destination):
        self.downloads.append((base_url, output, str(destination)))
        destination.parent.mkdir(parents=True, exist_ok=True)
        destination.write_bytes(b"mp4")
        return destination


def test_comfyui_client_runs_workflow_uploads_keyframe_and_downloads_output(tmp_path):
    keyframe = tmp_path / "scene_01.png"
    keyframe.write_bytes(b"png")
    output = tmp_path / "seed_001.mp4"
    transport = FakeTransport()
    client = ComfyUIClient("http://comfy.local:8188", transport=transport)

    result = client.run_i2v_workflow(
        workflow={"1": {"class_type": "Test", "inputs": {}}},
        keyframe_path=keyframe,
        remote_image_name="scene_01.png",
        output_path=output,
        poll_seconds=0,
        timeout_seconds=10,
    )

    assert result["status"] == "success"
    assert result["prompt_id"] == "prompt-123"
    assert result["output_path"] == str(output)
    assert output.read_bytes() == b"mp4"
    assert transport.uploads == [("http://comfy.local:8188", str(keyframe), "scene_01.png", True)]
    assert transport.posts[0][1] == "/prompt"
    assert transport.posts[0][2]["client_id"] == "autoshorts-i2v"
    assert transport.downloads[0][1]["filename"] == "clip_00001_.mp4"
