import uuid

from django.db import models
from django.conf import settings
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.core.files.storage import default_storage


# Create your models here.

class UploadType(models.TextChoices):
    Local      = 'Local'
    YouTube    = 'YouTube'


class Status(models.TextChoices):
    Initialing = 'Initialing'
    Uploading  = 'Uploading'
    Processing = 'Processing'
    Completed  = 'Completed'
    Deleted    = 'Deleted'
    Failed     = 'Failed'


class File(models.Model):
    id_file      = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False)
    existingPath = models.CharField(unique=True, max_length=1000)
    name         = models.CharField(max_length=255)
    eof          = models.BooleanField()
    # user         = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

    def url_video(self):
        if self.existingPath is not None:
            return default_storage.url(self.existingPath)
        return self.existingPath



class Media(models.Model):
    id_media       = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    status         = models.CharField(max_length=255, choices=Status.choices, default=Status.Initialing)
    thumbnail      = models.ImageField(blank=True,null=True, upload_to='thumbnails/') #models.CharField(max_length=255, null=True)
    title          = models.CharField(max_length=255,null=True, blank=True)
    author         = models.CharField(max_length=255,null=True, blank=True)
    audio_path     = models.CharField(max_length=400,null=True, blank=True)
    size           = models.CharField(max_length=255,null=True,blank=True)
    duration       = models.FloatField(default=0)
    youtube_id     = models.CharField(max_length=255, null=True)

    upload_source  = models.CharField(max_length=255, choices=UploadType.choices, default=UploadType.Local)
    uploaded_at    = models.DateTimeField(auto_now_add=True)

    user           = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User'), on_delete=models.CASCADE,)
    original_file  = models.ForeignKey(File,on_delete=models.CASCADE, null=True)
    # generated_file = models.ManyToManyField(ProcessedMedia)

    def __str__(self):
        return f" File {self.title} Uploaded By {self.user}"

    class Meta:
        ordering = ['-uploaded_at']

    def url_video(self):
        if self.original_file.existingPath is not None:
            return default_storage.url(self.original_file.existingPath)
        return self.original_file.existingPath

class ProcessedMedia(models.Model):
    user           = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User'), on_delete=models.CASCADE)
    video_path     = models.CharField(max_length=255, null=True, blank=True)
    audio_path     = models.CharField(max_length=255, null=True, blank=True)
    converted_time = models.DateTimeField(auto_now_add=True)
    parts          = models.CharField(max_length=255, null=True, blank=True)
    status         = models.CharField(max_length=255, choices=Status.choices, default=Status.Initialing)
    media          = models.ForeignKey(Media, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return f"{self.video_path} converted in {self.converted_time}"

    class Meta:
        ordering = ['-converted_time']

    @classmethod
    def get_count_for_user(cls, user, date):
        start_time = timezone.make_aware(timezone.datetime.combine(date, timezone.datetime.min.time()), timezone=timezone.get_current_timezone())
        end_time = timezone.make_aware(timezone.datetime.combine(date, timezone.datetime.max.time()), timezone=timezone.get_current_timezone())
        return cls.objects.filter(user=user, converted_time__range=(start_time, end_time)).count()

    def url_video(self):
        if self.video_path is not None:
            return default_storage.url(self.video_path)
        return self.video_path

    # def video_count(self):
    #     proccessed_day = ProcessedMedia.objects.filter(converted_time=self.converted_time,user=self.user)
    #     return proccessed_day.count()
