import random
from pathlib import Path

from django.core.files.base import ContentFile
from PIL import Image

from . import store
from ...conf import settings

DEFAULT_GALLERY = "__default__"


def get_available_galleries(include_default=False):
    """
    Returns list of dicts containing 'name' and list of images

    Only jpgs, gifs and pngs are supported avatar images.
    Galleries are
    """
    from ..models import AvatarGallery

    galleries = []
    galleries_dicts = {}

    for image in AvatarGallery.objects.all():
        if image.gallery == DEFAULT_GALLERY and not include_default:
            continue

        if image.gallery not in galleries_dicts:
            galleries_dicts[image.gallery] = {"name": image.gallery, "images": []}

            galleries.append(galleries_dicts[image.gallery])

        galleries_dicts[image.gallery]["images"].append(image)

    return galleries


def galleries_exist():
    from ..models import AvatarGallery

    return AvatarGallery.objects.exists()


def load_avatar_galleries():
    from ..models import AvatarGallery

    galleries = []
    for directory in Path(settings.MISAGO_AVATAR_GALLERY).iterdir():
        if not directory.is_dir():
            continue

        name = directory.name
        images = glob_gallery_images(directory)

        for image in images:
            with open(image, "rb") as image_file:
                galleries.append(
                    AvatarGallery.objects.create(
                        gallery=name, image=ContentFile(image_file.read(), "image")
                    )
                )
    return galleries


def glob_gallery_images(directory):
    images = []
    images.extend(directory.glob("*.gif"))
    images.extend(directory.glob("*.jpg"))
    images.extend(directory.glob("*.jpeg"))
    images.extend(directory.glob("*.png"))
    return images


def set_avatar(user, avatar):
    store.store_new_avatar(user, Image.open(avatar.image))


def set_random_avatar(user):
    galleries = get_available_galleries(include_default=True)
    if not galleries:
        raise RuntimeError("no avatar galleries are set")

    avatars_list = []
    for gallery in galleries:
        if gallery["name"] == DEFAULT_GALLERY:
            avatars_list = gallery["images"]
            break
        else:
            avatars_list += gallery["images"]

    random_avatar = random.choice(avatars_list)
    store.store_new_avatar(user, Image.open(random_avatar.image))