# retoor <retoor@molodetz.nl>

from __future__ import annotations

from ..spec import Action
from ._shared import body, path, query


JOB_ACTIONS: tuple[Action, ...] = (
    Action(
        name="zip_project",
        method="POST",
        path="/projects/{project_slug}/zip",
        summary="Build a downloadable zip archive of a whole project",
        description=(
            "Queues a background zip job and returns {uid, status_url}. Poll the status_url with "
            "zip_status until status is 'done', then give the user the download_url."
        ),
        params=(path("project_slug", "Project slug or uid."),),
        requires_auth=False,
    ),
    Action(
        name="project_files_zip",
        method="POST",
        path="/projects/{project_slug}/files/zip",
        summary="Build a downloadable zip archive of a project subdirectory",
        description=(
            "Queues a background zip job for a subpath inside the project and returns "
            "{uid, status_url}. Poll the status_url with zip_status until status is 'done', "
            "then give the user the download_url. When path is empty the whole project is zipped."
        ),
        params=(
            path("project_slug", "Project slug or uid."),
            query("path", "Relative subpath inside the project to zip; empty for the whole project."),
        ),
        requires_auth=False,
    ),
    Action(
        name="zip_status",
        method="GET",
        path="/zips/{uid}",
        summary="Check a zip job and obtain its download link once finished",
        description=(
            "Returns the job status and stats. When status is 'done', download_url points at the "
            "ready archive; while 'pending' or 'running', poll again shortly."
        ),
        params=(path("uid", "Zip job uid returned by zip_project."),),
        requires_auth=False,
    ),
    Action(
        name="fork_project",
        method="POST",
        path="/projects/{project_slug}/fork",
        summary="Fork a project into a new project owned by the current user",
        description=(
            "Queues a background fork job and returns {uid, status_url}. Poll the status_url with "
            "fork_status until status is 'done', then give the user the project_url of the new fork."
        ),
        params=(
            path("project_slug", "Slug or uid of the project to fork."),
            body("title", "Title for the new forked project.", required=True),
        ),
        requires_auth=True,
    ),
    Action(
        name="fork_status",
        method="GET",
        path="/forks/{uid}",
        summary="Check a fork job and obtain the new project once finished",
        description=(
            "Returns the job status. When status is 'done', project_url points at the new forked "
            "project; while 'pending' or 'running', poll again shortly."
        ),
        params=(path("uid", "Fork job uid returned by fork_project."),),
        requires_auth=False,
    ),
)
