from django import forms

from .registry import CLEANUP_GROUPS, FULL_RESET_GROUPS


class CleanupPreviewForm(forms.Form):
    MODE_CHOICES = (
        ("selective", "Eliminar dados selecionados"),
        ("full", "Limpeza total dos dados do portal"),
    )

    mode = forms.ChoiceField(choices=MODE_CHOICES, widget=forms.RadioSelect)
    groups = forms.MultipleChoiceField(
        choices=[(key, definition["label"]) for key, definition in CLEANUP_GROUPS.items()],
        required=False,
        widget=forms.CheckboxSelectMultiple,
    )
    create_backup = forms.BooleanField(
        label="Criar cópia de segurança JSON antes da limpeza",
        required=False,
        initial=True,
    )
    delete_files = forms.BooleanField(
        label="Eliminar também os ficheiros físicos associados",
        required=False,
        initial=False,
        help_text="Remove comprovativos, documentos, anexos, ficheiros Excel e fotografias abrangidos pela seleção.",
    )
    preserve_configuration = forms.BooleanField(
        label="Preservar a configuração global do portal",
        required=False,
        initial=True,
    )
    preserve_templates = forms.BooleanField(
        label="Preservar templates de email, conteúdos e formulários",
        required=False,
        initial=True,
    )
    preserve_automation = forms.BooleanField(
        label="Preservar tarefas periódicas do Celery Beat",
        required=False,
        initial=True,
    )
    preserve_other_staff = forms.BooleanField(
        label="Preservar os restantes utilizadores administrativos",
        required=False,
        initial=True,
    )

    def __init__(self, *args, full_reset_allowed=True, **kwargs):
        super().__init__(*args, **kwargs)
        self.full_reset_allowed = full_reset_allowed
        if not full_reset_allowed:
            self.fields["mode"].choices = (("selective", "Eliminar dados selecionados"),)

    def clean(self):
        cleaned = super().clean()
        mode = cleaned.get("mode")
        groups = cleaned.get("groups") or []
        if mode == "full" and not self.full_reset_allowed:
            raise forms.ValidationError("A limpeza total está desativada neste ambiente.")
        if mode == "full" and not cleaned.get("create_backup"):
            raise forms.ValidationError("A limpeza total exige uma cópia de segurança automática.")
        if mode == "selective" and not groups:
            raise forms.ValidationError("Selecione pelo menos um grupo de dados.")
        if mode == "full":
            cleaned["groups"] = list(FULL_RESET_GROUPS)
        return cleaned


class CleanupExecutionForm(forms.Form):
    confirmation = forms.CharField(
        label="Frase de confirmação",
        max_length=80,
        widget=forms.TextInput(attrs={"autocomplete": "off"}),
    )
    password = forms.CharField(
        label="Palavra-passe do administrador",
        widget=forms.PasswordInput(attrs={"autocomplete": "current-password"}),
    )
    acknowledge = forms.BooleanField(
        label="Confirmo que compreendo que esta operação é destrutiva e não pode ser anulada pelo portal.",
        required=True,
    )
