from django.db import models


class SmartBlock(models.Model):
    created_at = models.DateTimeField(blank=True, null=True, db_column="utime")
    updated_at = models.DateTimeField(blank=True, null=True, db_column="mtime")

    name = models.CharField(max_length=255)
    description = models.CharField(max_length=512, blank=True, null=True)
    length = models.DurationField(blank=True, null=True)

    class Kind(models.TextChoices):
        STATIC = "static", "Static"
        DYNAMIC = "dynamic", "Dynamic"

    kind = models.CharField(
        choices=Kind.choices,
        default=Kind.DYNAMIC,
        max_length=7,
        blank=True,
        null=True,
        db_column="type",
    )

    owner = models.ForeignKey(
        "core.User",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
        db_column="creator_id",
    )

    def get_owner(self):
        return self.owner

    class Meta:
        managed = False
        db_table = "cc_block"
        permissions = [
            (
                "change_own_smartblock",
                "Change the smartblocks where they are the owner",
            ),
            (
                "delete_own_smartblock",
                "Delete the smartblocks where they are the owner",
            ),
        ]


class SmartBlockContent(models.Model):
    block = models.ForeignKey(
        "schedule.SmartBlock",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
    )
    file = models.ForeignKey(
        "storage.File",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
    )

    position = models.IntegerField(blank=True, null=True)
    offset = models.FloatField(db_column="trackoffset")
    length = models.DurationField(blank=True, null=True, db_column="cliplength")
    cue_in = models.DurationField(blank=True, null=True, db_column="cuein")
    cue_out = models.DurationField(blank=True, null=True, db_column="cueout")
    fade_in = models.TimeField(blank=True, null=True, db_column="fadein")
    fade_out = models.TimeField(blank=True, null=True, db_column="fadeout")

    def get_owner(self):
        return self.block.get_owner()

    class Meta:
        managed = False
        db_table = "cc_blockcontents"
        permissions = [
            (
                "change_own_smartblockcontent",
                "Change the content of smartblocks where they are the owner",
            ),
            (
                "delete_own_smartblockcontent",
                "Delete the content of smartblocks where they are the owner",
            ),
        ]


class SmartBlockCriteria(models.Model):
    block = models.ForeignKey("schedule.SmartBlock", on_delete=models.DO_NOTHING)
    group = models.IntegerField(
        blank=True,
        null=True,
        db_column="criteriagroup",
    )

    criteria = models.CharField(max_length=32)
    condition = models.CharField(max_length=16, db_column="modifier")
    value = models.CharField(max_length=512)
    extra = models.CharField(max_length=512, blank=True, null=True)

    def get_owner(self):
        return self.block.get_owner()

    class Meta:
        managed = False
        db_table = "cc_blockcriteria"
        permissions = [
            (
                "change_own_smartblockcriteria",
                "Change the criteria of smartblocks where they are the owner",
            ),
            (
                "delete_own_smartblockcriteria",
                "Delete the criteria of smartblocks where they are the owner",
            ),
        ]