import urllib.parse

from django import forms
from django.conf import settings


class DonateForm(forms.Form):
    CUSTOM_AMOUNT = -1
    DEFAULT_CUSTOM_AMOUNT = 1000
    ALLOWED_PERIODICITY = [730, 99999]
    PORTAL_ID_IN_SELECT = -1

    amount = forms.IntegerField()
    custom_amount = forms.IntegerField(required=False)
    periodicity = forms.IntegerField()
    portal_project_id = forms.IntegerField()
    select_portal_project_id = forms.IntegerField(required=False)

    def clean_periodicity(self):
        value = self.cleaned_data["periodicity"]
        if value not in self.ALLOWED_PERIODICITY:
            raise forms.ValidationError("Wrong periodicity!")
        return value

    def clean(self):
        cleaned_data = super().clean()
        if (
            cleaned_data["portal_project_id"] == self.PORTAL_ID_IN_SELECT
            and cleaned_data["select_portal_project_id"] is None
        ):
            raise forms.ValidationError("Není zadán účel daru.")
        return cleaned_data

    def get_amount(self):
        amount = self.cleaned_data["amount"]
        if amount == self.CUSTOM_AMOUNT:
            amount = (
                abs(self.cleaned_data["custom_amount"]) or self.DEFAULT_CUSTOM_AMOUNT
            )
        return amount

    def get_redirect_url(self):
        amount = self.get_amount()
        periodicity = self.cleaned_data["periodicity"]
        portal_project_id = self.cleaned_data["portal_project_id"]
        if portal_project_id == self.PORTAL_ID_IN_SELECT:
            portal_project_id = self.cleaned_data["select_portal_project_id"]
        query = urllib.parse.urlencode(
            {
                "amount": amount,
                "periodicity": periodicity,
                "projectAccount": portal_project_id,
                "source": settings.DONATE_PORTAL_REDIRECT_SOURCE,
            }
        )
        return f"{settings.DONATE_PORTAL_REDIRECT_URL}?{query}"