from django.conf import settings
from django.core.paginator import Paginator
from django.shortcuts import render
from django_downloadview import ObjectDownloadView
from guardian.shortcuts import get_objects_for_user

from .models import Contract, ContractFile


class ContractFileDownloadView(ObjectDownloadView):
    model = ContractFile
    file_field = "file"
    attachment = False

    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)

        if not self.current_user.has_perm("contracts.view_confidential"):
            queryset = queryset.filter(is_public=True)

        return queryset

    def get(self, request, *args, **kwargs):
        self.current_user = request.user

        return super().get(request, *args, **kwargs)


def index(request):
    filter = {
        "is_approved": True
    }

    if not request.user.has_perm("contracts.view_confidential"):
        filter["is_public"] = True

    contracts = (
        get_objects_for_user(request.user, "contracts.view_contract")
        .filter(**filter)
        .order_by("valid_start_date")
        .all()
    )
    paginator = Paginator(contracts, 25)

    page = paginator.get_page(request.GET.get("page"))

    return render(
        request,
        "contracts/index.html",
        {
            "site_url": settings.SITE_URL,
            "user": request.user,
            "title": "Seznam smluv",
            "description": "Description",
            "paginator": paginator,
            "page": page,
        },
    )


def view_contract(request, id: int):
    filter = {
        "is_approved": True
    }

    if not request.user.has_perm("contracts.view_confidential"):
        filter["is_public"] = True

    contract = (
        get_objects_for_user(request.user, "contracts.view_contract")
        .filter(**filter)
        .get(id=id)
    )

    return render(
        request,
        "contracts/view_contract.html",
        {
            "site_url": settings.SITE_URL,
            "user": request.user,
            "title": contract.name,
            "description": contract.summary,
            "contract": contract,
        },
    )