from django import forms
from django.contrib.messages import ERROR, WARNING
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.models.collections import Collection

from .jekyll_import import JekyllArticleImporter


class JekyllImportForm(WagtailAdminPageForm):
    do_import = forms.BooleanField(
        initial=False, required=False, label="Provést import z Jekyllu"
    )
    collection = forms.ModelChoiceField(
        queryset=Collection.objects.all(), required=False, label="Kolekce obrázků"
    )
    dry_run = forms.BooleanField(
        initial=True,
        required=False,
        label="Jenom na zkoušku",
        help_text="Žádné články se neuloží, vypíše případné problémy či "
        "již existující články - 'ostrému' importu existující "
        "články nevadí, přeskočí je",
    )
    use_git = forms.BooleanField(
        initial=False,
        required=False,
        label="Použít Git",
        help_text="Umožňuje jednodušší zpracování, ale vyžaduje nainstalovaný Git.",
    )
    jekyll_repo_url = forms.URLField(
        max_length=512,
        required=False,
        help_text="V GitHubu tlačítko Code -> a odkaz z Download zip"
        "např. 'https://github.com/pirati-web/cb.pirati.cz/archive/refs/heads/gh-pages.zip',"
        "pokud máte nainstalovaný Git, zvolte Použít Git a vložte"
        "jednoduše URL repozitáře "
        "např. 'https://github.com/pirati-web/cb.pirati.cz'",
    )

    # def __init__(self):
    #     pass

    def clean(self):
        cleaned_data = super().clean()

        if not cleaned_data.get("do_import"):
            return cleaned_data
        else:
            if not cleaned_data.get("collection"):
                self.add_error("collection", "Pro import je toto pole povinné")
            if not cleaned_data.get("jekyll_repo_url"):
                self.add_error("jekyll_repo_url", "Pro import je toto pole povinné")

        if cleaned_data.get("use_git"):
            if cleaned_data.get("jekyll_repo_url", "").endswith(".zip"):
                self.add_error(
                    "jekyll_repo_url", "Vložte odkaz pouze na repozitář, ne na zip"
                )
        else:
            if not cleaned_data.get("jekyll_repo_url", "").endswith(".zip"):
                self.add_error("jekyll_repo_url", "Odkaz nesměřuje na soubor '.zip'")

        if len(self.errors):
            return cleaned_data

        if cleaned_data.get("dry_run"):
            import_message_list = self.handle_import()
            for message in import_message_list:
                if message["level"] in (WARNING, ERROR):
                    self.add_error("jekyll_repo_url", message["text"])

        return cleaned_data

    def handle_import(self):
        import_message_list = JekyllArticleImporter(
            article_parent_page=self.instance,
            collection=self.cleaned_data["collection"],
            url=self.cleaned_data["jekyll_repo_url"],
            dry_run=self.cleaned_data["dry_run"],
            use_git=self.cleaned_data["use_git"],
        ).perform_import()

        self.instance.import_message_list = import_message_list
        return import_message_list

    def save(self, commit=True):
        if self.cleaned_data.get("do_import") and not self.cleaned_data["dry_run"]:
            self.handle_import()

        return super().save(commit=commit)