from django import forms

from .i18n import normalize_language


FORM_TEXT = {
    "sl": {
        "name": "Ime in priimek", "name_ph": "Vaše ime in priimek", "email": "E-pošta", "email_ph": "ime@primer.si",
        "phone": "Telefon", "phone_ph": "Neobvezno", "subject": "Zadeva",
        "subject_ph": "Kratek naslov sporočila", "message": "Sporočilo",
        "message_ph": "Na kratko opišite, pri čem potrebujete pomoč …",
        "consent": "Strinjam se, da Odvetniška pisarna Weindorfer moje podatke uporabi za odgovor na to sporočilo.",
        "control": "Vsebina vsebuje nedovoljene znake.",
        "phone_error": "Vnesite veljavno telefonsko številko.",
        "message_short": "Sporočilo naj vsebuje vsaj 20 znakov.",
    },
    "en": {
        "name": "Full name", "name_ph": "Your full name", "email": "Email", "email_ph": "name@example.com",
        "phone": "Telephone", "phone_ph": "Optional", "subject": "Subject",
        "subject_ph": "Short message subject", "message": "Message",
        "message_ph": "Briefly describe how we can help …",
        "consent": "I agree that Odvetniška pisarna Weindorfer may use my data to reply to this message.",
        "control": "The content contains invalid characters.",
        "phone_error": "Enter a valid telephone number.",
        "message_short": "The message must contain at least 20 characters.",
    },
    "hr": {
        "name": "Ime i prezime", "name_ph": "Vaše ime i prezime", "email": "E-pošta", "email_ph": "ime@primjer.hr",
        "phone": "Telefon", "phone_ph": "Neobvezno", "subject": "Predmet",
        "subject_ph": "Kratak naslov poruke", "message": "Poruka",
        "message_ph": "Ukratko opišite kako vam možemo pomoći …",
        "consent": "Slažem se da Odvetniška pisarna Weindorfer upotrijebi moje podatke za odgovor na ovu poruku.",
        "control": "Sadržaj sadrži nedopuštene znakove.",
        "phone_error": "Unesite valjani telefonski broj.",
        "message_short": "Poruka mora sadržavati najmanje 20 znakova.",
    },
    "de": {
        "name": "Vor- und Nachname", "name_ph": "Ihr Vor- und Nachname", "email": "E-Mail", "email_ph": "name@beispiel.de",
        "phone": "Telefon", "phone_ph": "Optional", "subject": "Betreff",
        "subject_ph": "Kurzer Betreff", "message": "Nachricht",
        "message_ph": "Beschreiben Sie kurz, wie wir helfen können …",
        "consent": "Ich stimme zu, dass Odvetniška pisarna Weindorfer meine Daten zur Beantwortung dieser Nachricht verwendet.",
        "control": "Der Inhalt enthält unzulässige Zeichen.",
        "phone_error": "Geben Sie eine gültige Telefonnummer ein.",
        "message_short": "Die Nachricht muss mindestens 20 Zeichen enthalten.",
    },
}


def _without_control_characters(value, error_message):
    value = " ".join(value.split())
    if any(ord(character) < 32 for character in value):
        raise forms.ValidationError(error_message)
    return value


class ContactForm(forms.Form):
    name = forms.CharField(label="Ime in priimek", max_length=120, widget=forms.TextInput(attrs={
        "autocomplete": "name", "placeholder": "Vaše ime in priimek",
    }))
    email = forms.EmailField(label="E-pošta", max_length=254, widget=forms.EmailInput(attrs={
        "autocomplete": "email", "placeholder": "ime@primer.si",
    }))
    phone = forms.CharField(label="Telefon", max_length=60, required=False, widget=forms.TextInput(attrs={
        "autocomplete": "tel", "placeholder": "Neobvezno",
    }))
    subject = forms.CharField(label="Zadeva", max_length=180, widget=forms.TextInput(attrs={
        "placeholder": "Kratek naslov sporočila",
    }))
    message = forms.CharField(label="Sporočilo", max_length=5000, widget=forms.Textarea(attrs={
        "rows": 8, "placeholder": "Na kratko opišite, pri čem potrebujete pomoč …",
    }))
    consent = forms.BooleanField(
        label="Strinjam se, da Odvetniška pisarna Weindorfer moje podatke uporabi za odgovor na to sporočilo.",
        required=True,
    )
    website = forms.CharField(required=False, widget=forms.HiddenInput, label="Spletna stran")
    form_token = forms.CharField(required=True, widget=forms.HiddenInput)

    def __init__(self, *args, language_code="sl", **kwargs):
        super().__init__(*args, **kwargs)
        self.language_code = normalize_language(language_code)
        text = FORM_TEXT[self.language_code]
        self.fields["name"].label = text["name"]
        self.fields["name"].widget.attrs["placeholder"] = text["name_ph"]
        self.fields["email"].label = text["email"]
        self.fields["email"].widget.attrs["placeholder"] = text["email_ph"]
        self.fields["phone"].label = text["phone"]
        self.fields["phone"].widget.attrs["placeholder"] = text["phone_ph"]
        self.fields["subject"].label = text["subject"]
        self.fields["subject"].widget.attrs["placeholder"] = text["subject_ph"]
        self.fields["message"].label = text["message"]
        self.fields["message"].widget.attrs["placeholder"] = text["message_ph"]
        self.fields["consent"].label = text["consent"]

    def clean_name(self):
        return _without_control_characters(
            self.cleaned_data["name"].strip(), FORM_TEXT[self.language_code]["control"],
        )

    def clean_phone(self):
        phone = self.cleaned_data.get("phone", "").strip()
        allowed = set("0123456789+()/- .")
        if phone and any(character not in allowed for character in phone):
            raise forms.ValidationError(FORM_TEXT[self.language_code]["phone_error"])
        return phone

    def clean_subject(self):
        return _without_control_characters(
            self.cleaned_data["subject"].strip(), FORM_TEXT[self.language_code]["control"],
        )

    def clean_message(self):
        message = self.cleaned_data["message"].strip()
        if len(message) < 20:
            raise forms.ValidationError(FORM_TEXT[self.language_code]["message_short"])
        return message
