import uuid
import django.contrib.postgres.fields as postgres
from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag
from common.utils import ChoicesDictGenerator
from boofilsic.settings import GAME_MEDIA_PATH_ROOT, DEFAULT_GAME_IMAGE
from django.utils import timezone


def game_cover_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    root = ''
    if GAME_MEDIA_PATH_ROOT.endswith('/'):
        root = GAME_MEDIA_PATH_ROOT
    else:
        root = GAME_MEDIA_PATH_ROOT + '/'
    return root + timezone.now().strftime('%Y/%m/%d') + f'{filename}'


class Game(Entity):
    """
    """

    title = models.CharField(_("名称"), max_length=500)

    other_title = postgres.ArrayField(
        models.CharField(blank=True,default='', max_length=500),
        null=True,
        blank=True,
        default=list,
        verbose_name=_("别名")
    )

    developer = postgres.ArrayField(
        models.CharField(blank=True, default='', max_length=500),
        null=True,
        blank=True,
        default=list,
        verbose_name=_("开发商")
    )

    publisher = postgres.ArrayField(
        models.CharField(blank=True, default='', max_length=500),
        null=True,
        blank=True,
        default=list,
        verbose_name=_("发行商")
    )

    release_date = models.DateField(
        _('发行日期'),
        auto_now=False,
        auto_now_add=False,
        null=True,
        blank=True
    )

    genre = postgres.ArrayField(
        models.CharField(blank=True, default='', max_length=50),
        null=True,
        blank=True,
        default=list,
        verbose_name=_("类型")
    )

    platform = postgres.ArrayField(
        models.CharField(blank=True, default='', max_length=50),
        null=True,
        blank=True,
        default=list,
        verbose_name=_("平台")
    )

    cover = models.ImageField(_("封面"), upload_to=game_cover_path, default=DEFAULT_GAME_IMAGE, blank=True)



    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("games:retrieve", args=[self.id])

    def get_tags_manager(self):
        return self.game_tags

    @property
    def verbose_category_name(self):
        return _("游戏")


class GameMark(Mark):
    game = models.ForeignKey(
        Game, on_delete=models.CASCADE, related_name='game_marks', null=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['owner', 'game'], name='unique_game_mark')
        ]


class GameReview(Review):
    game = models.ForeignKey(
        Game, on_delete=models.CASCADE, related_name='game_reviews', null=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['owner', 'game'], name='unique_game_review')
        ]


class GameTag(Tag):
    game = models.ForeignKey(
        Game, on_delete=models.CASCADE, related_name='game_tags', null=True)
    mark = models.ForeignKey(
        GameMark, on_delete=models.CASCADE, related_name='gamemark_tags', null=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['content', 'mark'], name="unique_gamemark_tag")
        ]