from django.forms.utils import ErrorList
from django.utils.translation import gettext as _

from wagtail.admin.modal_workflow import render_modal_workflow
from wagtail.embeds import embeds
from wagtail.embeds.exceptions import EmbedNotFoundException, EmbedUnsupportedProviderException
from wagtail.embeds.finders.embedly import AccessDeniedEmbedlyException, EmbedlyException
from wagtail.embeds.format import embed_to_editor_html
from wagtail.embeds.forms import EmbedForm


def chooser(request):
    form = EmbedForm(initial=request.GET.dict(), prefix='embed-chooser')

    return render_modal_workflow(
        request, 'wagtailembeds/chooser/chooser.html', None,
        {'form': form},
        json_data={'step': 'chooser'}
    )


def chooser_upload(request):
    if request.method == 'POST':
        form = EmbedForm(request.POST, request.FILES, prefix='embed-chooser')

        if form.is_valid():
            error = None
            try:
                embed_html = embed_to_editor_html(form.cleaned_data['url'])
                embed_obj = embeds.get_embed(form.cleaned_data['url'])
                embed_data = {
                    'embedType': embed_obj.type,
                    'url': embed_obj.url,
                    'providerName': embed_obj.provider_name,
                    'authorName': embed_obj.author_name,
                    'thumbnail': embed_obj.thumbnail_url,
                    'title': embed_obj.title,
                }
                return render_modal_workflow(
                    request, None, None,
                    None, json_data={'step': 'embed_chosen', 'embed_html': embed_html, 'embed_data': embed_data}
                )
            except AccessDeniedEmbedlyException:
                error = _("There seems to be a problem with your embedly API key. Please check your settings.")
            except (EmbedNotFoundException, EmbedUnsupportedProviderException):
                error = _("Cannot find an embed for this URL.")
            except EmbedlyException:
                error = _(
                    "There seems to be an error with Embedly while trying to embed this URL."
                    " Please try again later."
                )

            if error:
                errors = form._errors.setdefault('url', ErrorList())
                errors.append(error)
                return render_modal_workflow(
                    request, 'wagtailembeds/chooser/chooser.html', None,
                    {'form': form},
                    json_data={'step': 'chooser'}
                )
    else:
        form = EmbedForm(prefix='embed-chooser')

    return render_modal_workflow(
        request, 'wagtailembeds/chooser/chooser.html', None,
        {'form': form},
        json_data={'step': 'chooser'}
    )
