# Copyright (C) 2018-2022  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
from typing import Optional
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect
from swh.web.browse.browseurls import browse_route
from swh.web.browse.snapshot_context import (
    browse_snapshot_branches,
    browse_snapshot_directory,
    browse_snapshot_log,
    browse_snapshot_releases,
    get_snapshot_context,
)
from swh.web.utils import redirect_to_new_route, reverse
from swh.web.utils.exc import BadInputExc
[docs]
def get_snapshot_from_request(request: HttpRequest) -> str:
    snapshot = request.GET.get("snapshot")
    if snapshot:
        return snapshot
    if request.GET.get("origin_url") is None:
        raise BadInputExc("An origin URL must be provided as a query parameter.")
    return get_snapshot_context(
        origin_url=request.GET.get("origin_url"),
        timestamp=request.GET.get("timestamp"),
        visit_type=request.GET.get("visit_type"),
    )["snapshot_id"] 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/",
    view_name="browse-snapshot",
    checksum_args=["snapshot_id"],
)
def snapshot_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
    """Django view for browsing the content of a snapshot.
    The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/`
    """
    browse_snapshot_url = reverse(
        "browse-snapshot-directory",
        url_args={"snapshot_id": snapshot_id},
        query_params=request.GET.dict(),
    )
    return redirect(browse_snapshot_url) 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/directory/",
    view_name="browse-snapshot-directory",
    checksum_args=["snapshot_id"],
)
def snapshot_directory_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
    """Django view for browsing the content of a directory collected
    in a snapshot.
    The URL that points to it is :http:get:`/browse/snapshot/(snapshot_id)/directory/`
    """
    return browse_snapshot_directory(
        request,
        snapshot_id=snapshot_id,
        path=request.GET.get("path"),
        origin_url=request.GET.get("origin_url"),
    ) 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/directory/(?P<path>.+)/",
    view_name="browse-snapshot-directory-legacy",
    checksum_args=["snapshot_id"],
)
def snapshot_directory_browse_legacy(
    request: HttpRequest, snapshot_id: str, path: Optional[str] = None
) -> HttpResponse:
    """Django view for browsing the content of a directory collected
    in a snapshot.
    The URL that points to it is
    :http:get:`/browse/snapshot/(snapshot_id)/directory/(path)/`
    """
    origin_url = request.GET.get("origin_url", None)
    if not origin_url:
        origin_url = request.GET.get("origin", None)
    return browse_snapshot_directory(
        request, snapshot_id=snapshot_id, path=path, origin_url=origin_url
    ) 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/content/",
    view_name="browse-snapshot-content",
    checksum_args=["snapshot_id"],
)
def snapshot_content_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
    """
    This route is deprecated; use http:get:`/browse/content` instead
    Django view that produces an HTML display of a content
    collected in a snapshot.
    The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/content/`
    """
    return redirect_to_new_route(request, "browse-content") 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/content/(?P<path>.+)/",
    view_name="browse-snapshot-content-legacy",
    checksum_args=["snapshot_id"],
)
def snapshot_content_browse_legacy(
    request: HttpRequest, snapshot_id: str, path: str
) -> HttpResponse:
    """
    This route is deprecated; use http:get:`/browse/content` instead
    Django view that produces an HTML display of a content
    collected in a snapshot.
    The url that points to it is
    :http:get:`/browse/snapshot/(snapshot_id)/content/(path)/`
    """
    return redirect_to_new_route(request, "browse-content") 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/log/",
    r"snapshot/log/",
    view_name="browse-snapshot-log",
    checksum_args=["snapshot_id"],
)
def snapshot_log_browse(
    request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
    """Django view that produces an HTML display of revisions history (aka
    the commit log) collected in a snapshot.
    The URLs that point to it are
    :http:get:`/browse/snapshot/(snapshot_id)/log/` and
    :http:get:`/browse/snapshot/log/`
    """
    if snapshot_id is None:
        # This case happens when redirected from /origin/log
        snapshot_id = get_snapshot_from_request(request)
        # Redirect to the same route with snapshot_id
        return redirect(
            reverse(
                "browse-snapshot-log",
                url_args={"snapshot_id": snapshot_id},
                query_params=request.GET,
            ),
        )
    return browse_snapshot_log(
        request,
        snapshot_id=snapshot_id,
        origin_url=request.GET.get("origin_url"),
        timestamp=request.GET.get("timestamp"),
    ) 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/branches/",
    r"snapshot/branches/",
    view_name="browse-snapshot-branches",
    checksum_args=["snapshot_id"],
)
def snapshot_branches_browse(
    request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
    """Django view that produces an HTML display of the list of branches
    collected in a snapshot.
    The URLs that point to it are
    :http:get:`/browse/snapshot/(snapshot_id)/branches/` and
    :http:get:`/browse/snapshot/branches/`
    """
    if snapshot_id is None:
        # This case happens when redirected from /origin/branches
        snapshot_id = get_snapshot_from_request(request)
        # Redirect to the same route with the newest snapshot_id
        # for the given origin
        return redirect(
            reverse(
                "browse-snapshot-branches",
                url_args={"snapshot_id": snapshot_id},
                query_params=request.GET,
            ),
        )
    return browse_snapshot_branches(
        request,
        snapshot_id=snapshot_id,
        origin_url=request.GET.get("origin_url"),
        timestamp=request.GET.get("timestamp"),
        branch_name_include=request.GET.get("name_include"),
    ) 
[docs]
@browse_route(
    r"snapshot/(?P<snapshot_id>[0-9a-f]+)/releases/",
    r"snapshot/releases/",
    view_name="browse-snapshot-releases",
    checksum_args=["snapshot_id"],
)
def snapshot_releases_browse(
    request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
    """Django view that produces an HTML display of the list of releases
    collected in a snapshot.
    The URLs that point to it are
    :http:get:`/browse/snapshot/(snapshot_id)/releases/`
    :http:get:`/browse/snapshot/releases/`
    """
    if snapshot_id is None:
        # This case happens when redirected from /origin/releases
        snapshot_id = get_snapshot_from_request(request)
        # Redirect to the same route with the newest snapshot_id
        # for the given origin
        return redirect(
            reverse(
                "browse-snapshot-releases",
                url_args={"snapshot_id": snapshot_id},
                query_params=request.GET,
            ),
        )
    return browse_snapshot_releases(
        request,
        snapshot_id=snapshot_id,
        origin_url=request.GET.get("origin_url"),
        timestamp=request.GET.get("timestamp"),
        release_name_include=request.GET.get("name_include"),
    )