__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.db import models
from django.urls import reverse

from .constants import TOPIC_RELATIONS_ASYM, TOPIC_RELATIONS_SYM


class Tag(models.Model):
    """
    Tags can be attached to a Topic to specify which category it fits.
    Examples: Concept, Device, Model, Theory, ...
    """
    name = models.CharField(max_length=32, unique=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name


class Topic(models.Model):
    """
    A Topic represents one of the nodes in the ontology.
    """
    name = models.CharField(max_length=256, unique=True)
    slug = models.SlugField(unique=True, allow_unicode=True)
    tags = models.ManyToManyField('ontology.Tag', blank=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

    def get_abolute_url(self):
        return reverse('ontology:topic_details', kwargs={'slug': self.slug})


class RelationAsym(models.Model):
    """
    An asymmetric Relation between two Topics.
    """
    A = models.ForeignKey('ontology.Topic', on_delete=models.CASCADE,
                          related_name='relation_LHS')
    relation = models.CharField(max_length=32, choices=TOPIC_RELATIONS_ASYM)
    B = models.ForeignKey('ontology.Topic', on_delete=models.CASCADE,
                          related_name='relation_RHS')

    def __str__(self):
        return '%s %s %s' % (self.A, self.get_relation_display(), self.B)


class RelationSym(models.Model):
    """
    A symmetric relation between multiple Topics.
    """
    topics = models.ManyToManyField('ontology.Topic')
    relation = models.CharField(max_length=32, choices=TOPIC_RELATIONS_SYM)

    def __str__(self):
        text = ', '.join(self.topics.values_list('name', flat=True))
        text += self.get_relation_display()
        return text