#
# Copyright 2019
# - Sli <antoine@bartuccio.fr>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#

from django import forms
from django.utils.translation import gettext_lazy as _

from core.models import User
from core.views.widgets.markdown import MarkdownInput
from pedagogy.models import UV, UVComment, UVCommentReport


class UVForm(forms.ModelForm):
    """Form handeling creation and edit of an UV."""

    class Meta:
        model = UV
        fields = (
            "code",
            "author",
            "credit_type",
            "semester",
            "language",
            "department",
            "credits",
            "hours_CM",
            "hours_TD",
            "hours_TP",
            "hours_THE",
            "hours_TE",
            "manager",
            "title",
            "objectives",
            "program",
            "skills",
            "key_concepts",
        )
        widgets = {
            "objectives": MarkdownInput,
            "program": MarkdownInput,
            "skills": MarkdownInput,
            "key_concepts": MarkdownInput,
            "author": forms.HiddenInput,
        }

    def __init__(self, author_id, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["author"].queryset = User.objects.filter(id=author_id).all()
        self.fields["author"].initial = author_id


class StarList(forms.NumberInput):
    template_name = "pedagogy/starlist.jinja"

    def __init__(self, nubmer_of_stars=0):
        super().__init__(None)
        self.number_of_stars = nubmer_of_stars

    def get_context(self, name, value, attrs):
        context = super().get_context(name, value, attrs)
        context["number_of_stars"] = range(0, self.number_of_stars)
        context["translations"] = {"do_not_vote": _("Do not vote")}
        return context


class UVCommentForm(forms.ModelForm):
    """Form handeling creation and edit of an UVComment."""

    class Meta:
        model = UVComment
        fields = (
            "author",
            "uv",
            "grade_global",
            "grade_utility",
            "grade_interest",
            "grade_teaching",
            "grade_work_load",
            "comment",
        )
        widgets = {
            "comment": MarkdownInput,
            "author": forms.HiddenInput,
            "uv": forms.HiddenInput,
            "grade_global": StarList(5),
            "grade_utility": StarList(5),
            "grade_interest": StarList(5),
            "grade_teaching": StarList(5),
            "grade_work_load": StarList(5),
        }

    def __init__(self, author_id, uv_id, is_creation, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["author"].queryset = User.objects.filter(id=author_id).all()
        self.fields["author"].initial = author_id
        self.fields["uv"].queryset = UV.objects.filter(id=uv_id).all()
        self.fields["uv"].initial = uv_id
        self.is_creation = is_creation

    def clean(self):
        self.cleaned_data = super().clean()
        uv = self.cleaned_data.get("uv")
        author = self.cleaned_data.get("author")

        if self.is_creation and uv and author and uv.has_user_already_commented(author):
            self.add_error(
                None,
                forms.ValidationError(
                    _("This user has already commented on this UV"), code="invalid"
                ),
            )

        return self.cleaned_data


class UVCommentReportForm(forms.ModelForm):
    """Form handeling creation and edit of an UVReport."""

    class Meta:
        model = UVCommentReport
        fields = ("comment", "reporter", "reason")
        widgets = {
            "comment": forms.HiddenInput,
            "reporter": forms.HiddenInput,
            "reason": MarkdownInput,
        }

    def __init__(self, reporter_id, comment_id, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["reporter"].queryset = User.objects.filter(id=reporter_id).all()
        self.fields["reporter"].initial = reporter_id
        self.fields["comment"].queryset = UVComment.objects.filter(id=comment_id).all()
        self.fields["comment"].initial = comment_id


class UVCommentModerationForm(forms.Form):
    """Form handeling bulk comment deletion."""

    accepted_reports = forms.ModelMultipleChoiceField(
        UVCommentReport.objects.all(),
        label=_("Accepted reports"),
        widget=forms.CheckboxSelectMultiple,
        required=False,
    )

    denied_reports = forms.ModelMultipleChoiceField(
        UVCommentReport.objects.all(),
        label=_("Denied reports"),
        widget=forms.CheckboxSelectMultiple,
        required=False,
    )