from django.db import models
from django.db.models.fields import TextField
from django.contrib.postgres.search import SearchVectorField, SearchVector
from django.contrib.postgres.indexes import GinIndex
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
import uuid
# Create your models here.


#-------------------------------------------------------------------------------
class Publisher(models.Model):
	name = models.CharField(max_length=128)
	shortName = models.CharField(max_length=32, default="")
	crawler = models.CharField(max_length=64, default="")
	type = models.CharField(max_length=32, default='')
	url = models.URLField(default="")
	active = models.BooleanField(default=True)
	country = models.CharField(max_length=32, default='')
	region = models.CharField(max_length=32, default='')
	def __str__(self):
		return self.shortName

	class Meta:
		verbose_name = 'Medio'
		verbose_name_plural = 'Medios'
		ordering = ('name',)

#-------------------------------------------------------------------------------
class Topic(models.Model):
	name = models.CharField(verbose_name='Tema', max_length=256)

	def __str__(self):
		return self.name

	class Meta:
		verbose_name = 'Tema'
		verbose_name_plural = 'Temas'
		ordering = ('name',)
		
#-------------------------------------------------------------------------------
class PostManager(models.Manager):
	def with_documents(self):
		vector = SearchVector('text')
		return self.get_queryset().annotate(document=vector)
		
#-------------------------------------------------------------------------------
class News(models.Model):
	title = models.CharField(max_length=512)
	publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, default='')
	topic = models.ManyToManyField(Topic, verbose_name='Topic(s)', blank=True)
	topic_raw = models.CharField(max_length=1024, default='')
	date = models.DateTimeField(verbose_name='Publication Date')
	text = TextField(verbose_name='News Text', default='', blank=True)
	url = models.URLField(verbose_name='URL', max_length=512)
	search_vector = SearchVectorField(null=True)
	objects = PostManager()
	
	def save(self, *args, **kwargs):
		super(News, self).save(*args, **kwargs)
		if 'update_fields' not in kwargs or 'search_vector' not in kwargs['update_fields']:
			instance = self._meta.default_manager.with_documents().get(pk=self.pk)
			instance.search_vector = instance.document
			instance.save(update_fields=['search_vector'])

	def __str__(self):
		return self.title

	class Meta:
		verbose_name = 'Noticia'
		verbose_name_plural = 'Noticias'
		ordering = ('date',)
		indexes = [ GinIndex(fields=['search_vector']) ]
#-------------------------------------------------------------------------------
class Search(models.Model):
	user = models.ForeignKey(User, on_delete=models.CASCADE)
	startDate = models.DateTimeField(verbose_name='Start Date')
	endDate = models.DateTimeField(verbose_name='End Date')
	text = models.CharField(max_length=128,blank=True)
	publishers = models.ManyToManyField(Publisher,blank=True)

#-------------------------------------------------------------------------------
class Profile(models.Model):
	user = models.OneToOneField(User, on_delete=models.CASCADE)
	subscriptions = models.ManyToManyField(Publisher)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
	if created:
		Profile.objects.create(user=instance)#, subscriptions=Publisher.objects.all())
		print ("profile created")

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
	instance.profile.save()
	
#-------------------------------------------------------------------------------
class Apikey(models.Model):
	key = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
	user = models.ForeignKey(User, on_delete=models.CASCADE)
	endDate = models.DateTimeField(verbose_name='Expiration date')
	
#-------------------------------------------------------------------------------
class audioTime(models.Model):
	publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
	startDate = models.DateTimeField(verbose_name='Start Date')
	endDate = models.DateTimeField(verbose_name='End Date')
	minutes =  models.BigIntegerField(default=0)