# -*- mode: python; coding: utf-8 -*-
# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later

from django.core.validators import MinValueValidator
from django.db import models
from django.utils.translation import gettext_lazy as _

from .fields import ISBNField


class Author(models.Model):
    name = models.CharField(
        max_length=255,
        unique=True,
        verbose_name=_('name'),
    )

    note = models.IntegerField(
        default=0,
        verbose_name=_("note"),
    )

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = _("author")
        verbose_name_plural = _("authors")
        ordering = ['name']


class Comic(models.Model):
    isbn = ISBNField(
        _('ISBN'),
        help_text=_('You may be able to scan it from a bar code.'),
        unique=True,
        blank=True,
        null=True,
    )

    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    subtitle = models.CharField(
        verbose_name=_('subtitle'),
        max_length=255,
        blank=True,
    )

    external_url = models.URLField(
        verbose_name=_('external URL'),
        blank=True,
    )

    side_identifier = models.CharField(
        verbose_name=_('side identifier'),
        max_length=255,
    )

    authors = models.ManyToManyField(
        'Author',
        verbose_name=_('authors'),
    )

    number_of_pages = models.PositiveIntegerField(
        verbose_name=_('number of pages'),
        blank=True,
        null=True,
    )

    publish_date = models.DateField(
        verbose_name=_('publish date'),
        blank=True,
        null=True,
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        if self.subtitle:
            return "{} : {}".format(self.title, self.subtitle)
        else:
            return self.title

    class Meta:
        verbose_name = _("comic")
        verbose_name_plural = _("comics")
        ordering = ['title', 'subtitle']


class Manga(models.Model):
    isbn = ISBNField(
        _('ISBN'),
        help_text=_('You may be able to scan it from a bar code.'),
        unique=True,
        blank=True,
        null=True,
    )

    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    subtitle = models.CharField(
        verbose_name=_('subtitle'),
        max_length=255,
        blank=True,
    )

    external_url = models.URLField(
        verbose_name=_('external URL'),
        blank=True,
    )

    side_identifier = models.CharField(
        verbose_name=_('side identifier'),
        max_length=255,
    )

    authors = models.ManyToManyField(
        'Author',
        verbose_name=_('authors'),
    )

    number_of_pages = models.PositiveIntegerField(
        verbose_name=_('number of pages'),
        blank=True,
        null=True,
    )

    publish_date = models.DateField(
        verbose_name=_('publish date'),
        blank=True,
        null=True,
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = _("manga")
        verbose_name_plural = _("mangas")
        ordering = ['title']


class Novel(models.Model):
    isbn = ISBNField(
        _('ISBN'),
        help_text=_('You may be able to scan it from a bar code.'),
        unique=True,
        blank=True,
        null=True,
    )

    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    subtitle = models.CharField(
        verbose_name=_('subtitle'),
        max_length=255,
        blank=True,
    )

    external_url = models.URLField(
        verbose_name=_('external URL'),
        blank=True,
    )

    side_identifier = models.CharField(
        verbose_name=_('side identifier'),
        max_length=255,
    )

    authors = models.ManyToManyField(
        'Author',
        verbose_name=_('authors'),
    )

    number_of_pages = models.PositiveIntegerField(
        verbose_name=_('number of pages'),
        blank=True,
        null=True,
    )

    publish_date = models.DateField(
        verbose_name=_('publish date'),
        blank=True,
        null=True,
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = _("novel")
        verbose_name_plural = _("novels")
        ordering = ['title', 'subtitle']


class Vinyl(models.Model):
    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    side_identifier = models.CharField(
        verbose_name=_('side identifier'),
        max_length=255,
    )

    rpm = models.PositiveIntegerField(
        verbose_name=_('rounds per minute'),
        choices=[
            (33, _('33 RPM')),
            (45, _('45 RPM')),
        ],
    )

    authors = models.ManyToManyField(
        'Author',
        verbose_name=_('authors'),
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = _("vinyl")
        verbose_name_plural = _("vinyls")
        ordering = ['title']


class CD(models.Model):
    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    side_identifier = models.CharField(
        verbose_name=_('side identifier'),
        max_length=255,
    )

    authors = models.ManyToManyField(
        'Author',
        verbose_name=_('authors'),
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = _("CD")
        verbose_name_plural = _("CDs")
        ordering = ['title']


class Review(models.Model):
    title = models.CharField(
        verbose_name=_('title'),
        max_length=255,
    )

    number = models.PositiveIntegerField(
        verbose_name=_('number'),
    )

    year = models.PositiveIntegerField(
        verbose_name=_('year'),
        null=True,
        blank=True,
        default=None,
    )

    month = models.PositiveIntegerField(
        verbose_name=_('month'),
        null=True,
        blank=True,
        default=None,
    )

    day = models.PositiveIntegerField(
        verbose_name=_('day'),
        null=True,
        blank=True,
        default=None,
    )

    double = models.BooleanField(
        verbose_name=_('double'),
        default=False,
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    def __str__(self):
        return self.title + " n°" + str(self.number)

    class Meta:
        verbose_name = _("review")
        verbose_name_plural = _("reviews")
        ordering = ['title', 'number']


class FutureMedium(models.Model):
    isbn = ISBNField(
        _('ISBN'),
        help_text=_('You may be able to scan it from a bar code.'),
        unique=True,
        blank=True,
        null=True,
    )

    type = models.CharField(
        _('type'),
        choices=[
            ('bd', _('Comic')),
            ('manga', _('Manga')),
            ('roman', _('Roman')),
        ],
        max_length=8,
    )

    present = models.BooleanField(
        verbose_name=_("present"),
        help_text=_("Tell that the medium is present in the Mediatek."),
        default=False,
    )

    class Meta:
        verbose_name = _("future medium")
        verbose_name_plural = _("future media")

    def __str__(self):
        return "Future medium (ISBN: {isbn})".format(isbn=self.isbn, )


class Emprunt(models.Model):
    media = models.ForeignKey(
        'Comic',
        on_delete=models.PROTECT,
    )
    user = models.ForeignKey(
        'users.User',
        on_delete=models.PROTECT,
        verbose_name=_("borrower"),
    )
    date_emprunt = models.DateTimeField(
        verbose_name=_('borrowed on'),
    )
    date_rendu = models.DateTimeField(
        blank=True,
        null=True,
        verbose_name=_('given back on'),
    )
    permanencier_emprunt = models.ForeignKey(
        'users.User',
        on_delete=models.PROTECT,
        related_name='user_permanencier_emprunt',
        verbose_name=_('borrowed with'),
        help_text=_('The keyholder that registered this borrowed item.')
    )
    permanencier_rendu = models.ForeignKey(
        'users.User',
        on_delete=models.PROTECT,
        related_name='user_permanencier_rendu',
        blank=True,
        null=True,
        verbose_name=_('given back to'),
        help_text=_('The keyholder to whom this item was given back.')
    )

    def __str__(self):
        return str(self.media) + str(self.user)

    class Meta:
        verbose_name = _("borrowed item")
        verbose_name_plural = _("borrowed items")
        ordering = ['-date_emprunt']


class Game(models.Model):
    DURATIONS = (
        ('-1h', '-1h'),
        ('1-2h', '1-2h'),
        ('2-3h', '2-3h'),
        ('3-4h', '3-4h'),
        ('4h+', '4h+'),
    )

    name = models.CharField(
        max_length=255,
        verbose_name=_("name"),
    )
    owner = models.ForeignKey(
        'users.User',
        on_delete=models.PROTECT,
        verbose_name=_("owner"),
    )
    duration = models.CharField(
        choices=DURATIONS,
        max_length=255,
        verbose_name=_("duration"),
    )
    players_min = models.IntegerField(
        validators=[MinValueValidator(1)],
        verbose_name=_("minimum number of players"),
    )
    players_max = models.IntegerField(
        validators=[MinValueValidator(1)],
        verbose_name=_('maximum number of players'),
    )
    comment = models.CharField(
        max_length=255,
        blank=True,
        verbose_name=_('comment'),
    )

    def __str__(self):
        return str(self.name)

    class Meta:
        verbose_name = _("game")
        verbose_name_plural = _("games")
        ordering = ['name']