from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.utils import timezone

from analysis.forms import TimespanReportForm
from analysis.utils.excel.excel import TempExcelFile
from analysis.utils.report import TimespanReport
from codelist.models import KonovaCode
from konova.contexts import BaseContext
from konova.decorators import conservation_office_group_required
from konova.utils.message_templates import FORM_INVALID, PARAMS_INVALID


@login_required
@conservation_office_group_required
def index_reports_view(request: HttpRequest):
    """

    Args:
        request (HttpRequest): The incoming request

    Returns:

    """
    template = "analysis/reports/index.html"
    form = TimespanReportForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            redirect_url = form.save()
            return redirect(redirect_url)
        else:
            messages.error(
                request,
                FORM_INVALID,
                extra_tags="danger",
            )
    context = {
        "form": form
    }
    context = BaseContext(request, context).context
    return render(request, template, context)


@login_required
@conservation_office_group_required
def detail_report_view(request: HttpRequest, id: str):
    """ Renders the detailed report for a conservation office

    Args:
        request (HttpRequest): The incoming request
        id (str): The conservation_office KonovaCode id

    Returns:

    """
    # Try to resolve the requested office id
    cons_office = get_object_or_404(
        KonovaCode,
        id=id
    )
    # Try to resolve the date parameters into Date objects -> redirect if this fails
    try:
        df = request.GET.get("df", None)
        dt = request.GET.get("dt", None)
        date_from = timezone.make_aware(timezone.datetime.fromisoformat(df))
        date_to = timezone.make_aware(timezone.datetime.fromisoformat(dt))
    except ValueError:
        messages.error(
            request,
            PARAMS_INVALID,
            extra_tags="danger",
        )
        return redirect("analysis:reports")

    # Check whether the html default rendering is requested or an alternative
    format_param = request.GET.get("format", "html")
    report = TimespanReport(id, date_from, date_to)

    if format_param == "html":
        template = "analysis/reports/detail.html"
        context = {
            "office": cons_office,
            "report": report,
        }
        context = BaseContext(request, context).context
        return render(request, template, context)
    elif format_param == "excel":
        file = TempExcelFile(report.excel_template_path, report.excel_map)
        response = HttpResponse(
            content=file.stream,
            content_type="application/ms-excel",
        )
        response['Content-Disposition'] = f'attachment; filename={cons_office.long_name}_{df}_{dt}.xlsx'
        return response
    else:
        raise NotImplementedError