"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 06.10.21

"""
from dal import autocomplete
from django import forms
from user.models import User
from django.db import transaction
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _

from compensation.forms.forms import AbstractCompensationForm, CompensationResponsibleFormMixin
from ema.models import Ema, EmaDocument
from intervention.models import Responsibility, Handler
from konova.forms import SimpleGeomForm, NewDocumentModalForm
from user.models import UserActionLogEntry


class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin):
    """ Form for creating new EMA objects.

    Inherits basic form fields from AbstractCompensationForm and additional from CompensationResponsibleFormMixin.
    Second holds self.instance.response related fields

    """
    field_order = [
        "identifier",
        "title",
        "conservation_office",
        "conservation_file_number",
        "handler_type",
        "handler_detail",
        "comment",
    ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form_title = _("New EMA")

        self.action_url = reverse("ema:new")
        self.cancel_redirect = reverse("ema:index")

        tmp = Ema()
        identifier = tmp.generate_new_identifier()
        self.initialize_form_field("identifier", identifier)
        self.fields["identifier"].widget.attrs["url"] = reverse_lazy("ema:new-id")
        self.fields["title"].widget.attrs["placeholder"] = _("Compensation XY; Location ABC")

    def save(self, user: User, geom_form: SimpleGeomForm):
        with transaction.atomic():
            # Fetch data from cleaned POST values
            identifier = self.cleaned_data.get("identifier", None)
            title = self.cleaned_data.get("title", None)
            handler_type = self.cleaned_data.get("handler_type", None)
            handler_detail = self.cleaned_data.get("handler_detail", None)
            conservation_office = self.cleaned_data.get("conservation_office", None)
            conservation_file_number = self.cleaned_data.get("conservation_file_number", None)
            comment = self.cleaned_data.get("comment", None)

            # Create log entry
            action = UserActionLogEntry.get_created_action(user)
            # Process the geometry form
            geometry = geom_form.save(action)

            handler = Handler.objects.create(
                type=handler_type,
                detail=handler_detail
            )
            responsible = Responsibility.objects.create(
                handler=handler,
                conservation_file_number=conservation_file_number,
                conservation_office=conservation_office,
            )

            # Finally create main object
            acc = Ema.objects.create(
                identifier=identifier,
                title=title,
                responsible=responsible,
                created=action,
                geometry=geometry,
                comment=comment,
            )

            # Add the creating user to the list of shared users
            acc.share_with_user(user)

            # Add the log entry to the main objects log list
            acc.log.add(action)
        return acc


class EditEmaForm(NewEmaForm):
    """ Form for editing EMAs

    """
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form_title = _("Edit EMA")

        self.action_url = reverse("ema:edit", args=(self.instance.id,))
        self.cancel_redirect = reverse("ema:detail", args=(self.instance.id,))

        self.fields["identifier"].widget.attrs["url"] = reverse_lazy("ema:new-id")
        self.fields["title"].widget.attrs["placeholder"] = _("Compensation XY; Location ABC")

        # Initialize form data
        form_data = {
            "identifier": self.instance.identifier,
            "title": self.instance.title,
            "handler_type": self.instance.responsible.handler.type,
            "handler_detail": self.instance.responsible.handler.detail,
            "conservation_office": self.instance.responsible.conservation_office,
            "conservation_file_number": self.instance.responsible.conservation_file_number,
            "comment": self.instance.comment,
        }
        disabled_fields = []
        self.load_initial_data(
            form_data,
            disabled_fields
        )

    def save(self, user: User, geom_form: SimpleGeomForm):
        with transaction.atomic():
            # Fetch data from cleaned POST values
            identifier = self.cleaned_data.get("identifier", None)
            title = self.cleaned_data.get("title", None)
            handler_type = self.cleaned_data.get("handler_type", None)
            handler_detail = self.cleaned_data.get("handler_detail", None)
            conservation_office = self.cleaned_data.get("conservation_office", None)
            conservation_file_number = self.cleaned_data.get("conservation_file_number", None)
            comment = self.cleaned_data.get("comment", None)

            # Create log entry
            action = UserActionLogEntry.get_edited_action(user)
            # Process the geometry form
            geometry = geom_form.save(action)

            # Update responsible data
            self.instance.responsible.handler.type = handler_type
            self.instance.responsible.handler.detail = handler_detail
            self.instance.responsible.handler.save()
            self.instance.responsible.conservation_office = conservation_office
            self.instance.responsible.conservation_file_number = conservation_file_number
            self.instance.responsible.save()

            # Update main oject data
            self.instance.identifier = identifier
            self.instance.title = title
            self.instance.geometry = geometry
            self.instance.comment = comment
            self.instance.modified = action
            self.instance.save()

            # Add the log entry to the main objects log list
            self.instance.log.add(action)
        return self.instance


class NewEmaDocumentModalForm(NewDocumentModalForm):
    document_model = EmaDocument