import os

from django.conf import settings
from django.contrib.auth.decorators import login_required, permission_required
from django.http import FileResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from calendarweek import CalendarWeek
from constance import config

from aleksis.core.util import messages

from .forms import PosterUploadForm
from .models import Poster
from .settings import BASE_DIR


@login_required
@permission_required("resint.add_poster")
def upload(request):
    if request.method == 'POST':
        form = PosterUploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()

            messages.success(request, _("The poster was uploaded successfully."))
            return redirect('poster_index')
    else:
        form = PosterUploadForm()
    return render(request, 'resint/upload.html', {
        'form': form
    })


@login_required
@permission_required("resint.add_poster")
def delete(request, id):
    poster = get_object_or_404(Poster, pk=id)
    poster.delete()

    messages.success(request, _("The poster was deleted successfully."))
    return redirect("poster_index")


@login_required
@permission_required("poster.add_poster")
def index(request):
    posters = Poster.objects.all().order_by("calendar_week", "year")
    return render(request, 'resint/index.html', {"posters": posters})


def return_pdf(filename):
    """Read and response a PDF file"""

    file = open(filename, "rb")
    return FileResponse(file, content_type="application/pdf")


def return_default_pdf():
    """Response the default PDF"""

    return return_pdf(os.path.join(BASE_DIR, "default.pdf"))


def show_current(request):
    # Get current date with year and calendar week
    current_date = timezone.datetime.now()
    cw = CalendarWeek.from_date(current_date)

    # Create datetime with the friday of the week and the toggle time
    friday = cw[int(config.RESINT_NEW_WEEK_DAY)]
    friday = timezone.datetime.combine(friday, config.RESINT_NEW_WEEK_TIME)

    # Check whether to show the poster of the next week or the current week
    if current_date > friday:
        cw += 1

    # Look for matching PDF in DB
    try:
        obj = Poster.objects.get(year=cw.year, calendar_week=cw.week)
        return return_pdf(os.path.join(settings.MEDIA_ROOT, str(obj.pdf)))

    # Or show the default PDF
    except Poster.DoesNotExist:
        return return_default_pdf()