import json
import logging
import urllib.request
from urllib.parse import urljoin

import bleach
import requests
from django.conf import settings
from django.core.files import File
from django.http import HttpResponse
from django.utils.translation import gettext_lazy
from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel
from wagtail.images.models import Image
from wagtail.models import Page

from tuning import admin_help

logger = logging.getLogger()


def create_image_from_url(url, filename):
    img_data = urllib.request.urlretrieve(url)
    img_obj = Image(title=filename)
    img_obj.file.save(filename, File(open(img_data[0], "rb")))
    img_obj.save()
    return img_obj


def get_subpage_url(page, dest_page_type):
    try:
        return page.get_descendants().type(dest_page_type).live().first().get_url()
    except (Page.DoesNotExist, AttributeError):
        return "#"


def make_promote_panels(
    help_content=None, *, seo_title=True, search_description=True, search_image=True
):
    if help_content is None:
        help_content = admin_help.build(
            admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
        )

    panels = [FieldPanel("slug")]
    if seo_title:
        panels.append(FieldPanel("seo_title"))
    if search_description:
        panels.append(FieldPanel("search_description"))
    if search_image:
        # TODO
        panels.append(FieldPanel("search_image"))  # , label="Obrázek pro embed"))
    panels.append(HelpPanel(help_content))
    panels.append(CommentPanel())

    return [MultiFieldPanel(panels, gettext_lazy("Metadata stránky"))]


def subscribe_to_newsletter(email, list_id):
    url = urljoin(settings.MAILTRAIN_API_URL, f"subscribe/{list_id}")
    data = {"EMAIL": email, "FORCE_SUBSCRIBE": False, "REQUIRE_CONFIRMATION": True}
    response = requests.post(
        url, data=data, headers={"access-token": settings.MAILTRAIN_API_TOKEN}
    )
    if response.status_code != 200:
        logger.error(
            "Failed to subscribe!", extra={"data": data, "response": response.text}
        )
    return response


def subscribe_to_newsletter_ajax(request):
    client_response = HttpResponse()
    if request.method == "POST":
        body = json.loads(request.body)
        response = subscribe_to_newsletter(body["email"], body["list_id"])
        if "error" in response.json():
            client_response.status_code = 500
        else:
            client_response.status_code = response.status_code

        return client_response

    client_response.status_code = 400
    return client_response


def strip_all_html_tags(value: str):
    """Drop all HTML tags from given value.

    :param value: string to sanitize
    """
    return bleach.clean(value, tags=[], attributes=[], strip=True, strip_comments=True)


def trim_to_length(value: str, max_length: int = 150):
    """Trim value to max length shall it exceed it.

    :param value: input string
    :param max_length: max allowed length
    """
    if len(value) > max_length:
        return value[:max_length] + "..."
    return value