#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
    openslides.application.forms
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Forms for the application app.

    :copyright: 2011, 2012 by OpenSlides team, see AUTHORS.
    :license: GNU GPL, see LICENSE for more details.
"""

from django import forms
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _, ugettext_noop

from openslides.utils.forms import CssClassMixin
from openslides.application.models import Application


class UserModelChoiceField(forms.ModelChoiceField):
    """
    Extend ModelChoiceField for users so that the choices are
    listed as 'first_name last_name' instead of just 'username'.
    """
    def label_from_instance(self, obj):
        return obj.get_full_name()


class UserModelMultipleChoiceField(forms.ModelMultipleChoiceField):
    """
    Extend ModelMultipleChoiceField for users so that the choices are
    listed as 'first_name last_name' instead of just 'username'.
    """
    def label_from_instance(self, obj):
        return obj.get_full_name()


class ApplicationForm(forms.Form, CssClassMixin):
    title = forms.CharField(widget=forms.TextInput(), label=_("Title"))
    text = forms.CharField(widget=forms.Textarea(), label=_("Text"))
    reason = forms.CharField(widget=forms.Textarea(), required=False,
        label=_("Reason"))


class ApplicationFormTrivialChanges(ApplicationForm):
    trivial_change = forms.BooleanField(required=False,
        label=_("Trivial change"),
        help_text=_("Trivial changes don't create a new version."))


class ApplicationManagerForm(forms.ModelForm, CssClassMixin):
    submitter = UserModelChoiceField(
        queryset=User.objects.all().exclude(profile=None).
        order_by("first_name"),
        label=_("Submitter"),
    )

    class Meta:
        model = Application
        exclude = ('number', 'status', 'permitted', 'log', 'supporter')


class ApplicationManagerFormSupporter(ApplicationManagerForm):
    supporter = UserModelMultipleChoiceField(
        queryset=User.objects.all().exclude(profile=None).
        order_by("first_name"),
        required=False, label=_("Supporters"),
    )


class ApplicationImportForm(forms.Form, CssClassMixin):
    csvfile = forms.FileField(
        widget=forms.FileInput(attrs={'size':'50'}),
        label=_("CSV File"),
    )
    import_permitted = forms.BooleanField(
        required=False,
        label=_("Import applications with status \"permitted\""),
        help_text=_('Set the initial status for each application to ' \
        'permitted"'),
    )


class ConfigForm(forms.Form, CssClassMixin):
    application_min_supporters = forms.IntegerField(
        widget=forms.TextInput(attrs={'class':'small-input'}),
        label=_("Number of (minimum) required supporters for a application"),
        initial=4,
        min_value=0,
        max_value=8,
        help_text=_("Choose 0 to disable the supporting system"),
    )
    application_preamble = forms.CharField(
        widget=forms.TextInput(),
        required=False,
        label=_("Application preamble")
    )
    application_pdf_ballot_papers_selection = forms.ChoiceField(
        widget=forms.Select(),
        required=False,
        label=_("Number of ballot papers (selection)"),
        choices=[
            ("NUMBER_OF_DELEGATES", _("Number of all delegates")),
            ("NUMBER_OF_ALL_PARTICIPANTS", _("Number of all participants")),
            ("CUSTOM_NUMBER", _("Use the following custom number")),
        ]
    )
    application_pdf_ballot_papers_number = forms.IntegerField(
        widget=forms.TextInput(attrs={'class':'small-input'}),
        required=False,
        min_value=1,
        label=_("Custom number of ballot papers")
    )
    application_pdf_title = forms.CharField(
        widget=forms.TextInput(),
        required=False,
        label=_("Title for PDF document (all applications)")
    )
    application_pdf_preamble = forms.CharField(
        widget=forms.Textarea(),
        required=False,
        label=_("Preamble text for PDF document (all applications)")
    )

    application_allow_trivial_change = forms.BooleanField(
        label=_("Allow trivial changes"),
        help_text=_('Warning: Trivial changes undermine the application ' \
        'permission system.'),
        required=False,
    )
