""" Model definitions for the quiz """

from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models


class CriterionRating(models.Model):
    """
    This is the relation between Sport and Criterion.
    You can use it to add a rating for a specific criterion to a sport.
    To see it's usage check Sport.rate() and Sport.get_rating()
    """

    rating = models.IntegerField(
        validators=[MaxValueValidator(10), MinValueValidator(0)]
    )
    criterion = models.ForeignKey("Criterion", on_delete=models.CASCADE)
    sport = models.ForeignKey("Sport", on_delete=models.CASCADE)


class Sport(models.Model):
    """
    Defines a Sport with name, url that leads to the booking page.
    A sport includes ratings for all criterions.
    (e.g. How much it corresponds to the criterion "Martial Arts")
    """

    name = models.TextField()
    url = models.URLField()
    criteria_ratings = models.ManyToManyField("Criterion", through="CriterionRating")

    def __str__(self):
        return self.name

    def rate(self, criterion, rating):
        """Defines how much (rating) the sport meets the given criterion"""
        rating = CriterionRating(sport=self, criterion=criterion, rating=rating)
        rating.save()

    def get_rating(self, criterion):
        """Returns how much the sport meets the given criterion"""
        criterion_rating = CriterionRating.objects.get(sport=self, criterion=criterion)
        return criterion_rating.rating


class Criterion(models.Model):
    """
    Defines a Sport property that is used a a criterion for our quiz.
    (e.g. Individual or Team sport)
    """

    name = models.TextField()