"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22

"""
from django.http import HttpRequest
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from compensation.models import EcoAccount
from konova.contexts import BaseContext
from konova.forms import SimpleGeomForm
from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER
from konova.utils.generators import generate_qr_code


def report_view(request: HttpRequest, id: str):
    """ Renders the public report view

    Args:
        request (HttpRequest): The incoming request
        id (str): The id of the intervention

    Returns:

    """
    # Reuse the compensation report template since EcoAccounts are structurally identical
    template = "compensation/report/eco_account/report.html"
    acc = get_object_or_404(EcoAccount, id=id)

    tab_title = _("Report {}").format(acc.identifier)
    # If intervention is not recorded (yet or currently) we need to render another template without any data
    if not acc.is_ready_for_publish():
        template = "report/unavailable.html"
        context = {
            TAB_TITLE_IDENTIFIER: tab_title,
        }
        context = BaseContext(request, context).context
        return render(request, template, context)

    # Prepare data for map viewer
    geom_form = SimpleGeomForm(
        instance=acc
    )
    parcels = acc.get_underlying_parcels()

    qrcode_url = request.build_absolute_uri(reverse("compensation:acc:report", args=(id,)))
    qrcode_img = generate_qr_code(qrcode_url, 10)
    qrcode_lanis_url = acc.get_LANIS_link()
    qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7)

    # Order states by surface
    before_states = acc.before_states.all().order_by("-surface").select_related("biotope_type__parent")
    after_states = acc.after_states.all().order_by("-surface").select_related("biotope_type__parent")
    actions = acc.actions.all().prefetch_related("action_type__parent")

    # Reduce amount of db fetched data to the bare minimum we need in the template (deduction's intervention id and identifier)
    deductions = acc.deductions.all()\
        .distinct("intervention")\
        .select_related("intervention")\
        .values_list("intervention__id", "intervention__identifier", "intervention__title", named=True)

    context = {
        "obj": acc,
        "qrcode": {
            "img": qrcode_img,
            "url": qrcode_url,
        },
        "qrcode_lanis": {
            "img": qrcode_img_lanis,
            "url": qrcode_lanis_url,
        },
        "has_access": False,  # disables action buttons during rendering
        "before_states": before_states,
        "after_states": after_states,
        "geom_form": geom_form,
        "parcels": parcels,
        "actions": actions,
        "deductions": deductions,
        "tables_scrollable": False,
        TAB_TITLE_IDENTIFIER: tab_title,
    }
    context = BaseContext(request, context).context
    return render(request, template, context)
