""":class:`PathDownloadView`."""
import os

from django.core.files import File

from django_downloadview.exceptions import FileNotFound
from django_downloadview.views.base import BaseDownloadView


class PathDownloadView(BaseDownloadView):
    """Serve a file using filename."""

    #: Server-side name (including path) of the file to serve.
    #:
    #: Filename is supposed to be an absolute filename of a file located on the
    #: local filesystem.
    path = None

    #: Name of the URL argument that contains path.
    path_url_kwarg = "path"

    def get_path(self):
        """Return actual path of the file to serve.

        Default implementation simply returns view's :py:attr:`path`.

        Override this method if you want custom implementation.
        As an example, :py:attr:`path` could be relative and your custom
        :py:meth:`get_path` implementation makes it absolute.

        """
        return self.kwargs.get(self.path_url_kwarg, self.path)

    def get_file(self):
        """Use path to return wrapper around file to serve."""
        filename = self.get_path()
        if not os.path.isfile(filename):
            raise FileNotFound(f'File "{filename}" does not exists')
        return File(open(filename, "rb"))
