from django.db import models


class Show(models.Model):
    name = models.CharField(max_length=255)
    description = models.CharField(max_length=8192, blank=True, null=True)
    genre = models.CharField(max_length=255, blank=True, null=True)
    url = models.CharField(max_length=255, blank=True, null=True)

    image = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_column="image_path",
    )
    foreground_color = models.CharField(
        max_length=6,
        blank=True,
        null=True,
        db_column="color",
    )
    background_color = models.CharField(
        max_length=6,
        blank=True,
        null=True,
    )

    live_auth_registered = models.BooleanField(
        default=False,
        blank=True,
        null=True,
        db_column="live_stream_using_airtime_auth",
    )
    live_auth_custom = models.BooleanField(
        default=False,
        blank=True,
        null=True,
        db_column="live_stream_using_custom_auth",
    )
    live_auth_custom_user = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_column="live_stream_user",
    )
    live_auth_custom_password = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_column="live_stream_pass",
    )

    @property
    def live_enabled(self) -> bool:
        return any((self.live_auth_registered, self.live_auth_custom))

    # A show is linkable if it has never been linked before. Once
    # a show becomes unlinked it can not be linked again.
    linked = models.BooleanField()
    linkable = models.BooleanField(db_column="is_linkable")

    auto_playlist = models.ForeignKey(
        "schedule.Playlist",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
        db_column="autoplaylist_id",
    )
    auto_playlist_enabled = models.BooleanField(db_column="has_autoplaylist")
    auto_playlist_repeat = models.BooleanField(db_column="autoplaylist_repeat")

    hosts = models.ManyToManyField(  # type: ignore[var-annotated]
        "core.User",
        through="ShowHost",
    )

    def get_owner(self):
        return self.hosts.all()

    class Meta:
        managed = False
        db_table = "cc_show"


class ShowHost(models.Model):
    show = models.ForeignKey(
        "schedule.Show",
        on_delete=models.DO_NOTHING,
    )
    user = models.ForeignKey(
        "core.User",
        on_delete=models.DO_NOTHING,
        db_column="subjs_id",
    )

    class Meta:
        managed = False
        db_table = "cc_show_hosts"


# TODO: Replace record choices with a boolean
class Record(models.IntegerChoices):
    NO = 0, "No"
    YES = 1, "Yes"


class ShowDays(models.Model):
    show = models.ForeignKey("schedule.Show", on_delete=models.DO_NOTHING)

    first_show_on = models.DateField(
        db_column="first_show",
    )
    last_show_on = models.DateField(
        blank=True,
        null=True,
        db_column="last_show",
    )
    start_time = models.TimeField()

    timezone = models.CharField(max_length=1024)
    duration = models.CharField(max_length=1024)

    record_enabled = models.SmallIntegerField(
        choices=Record.choices,
        default=Record.NO,
        blank=True,
        null=True,
        db_column="record",
    )

    class WeekDay(models.IntegerChoices):
        MONDAY = 0, "Monday"
        TUESDAY = 1, "Tuesday"
        WEDNESDAY = 2, "Wednesday"
        THURSDAY = 3, "Thursday"
        FRIDAY = 4, "Friday"
        SATURDAY = 5, "Saturday"
        SUNDAY = 6, "Sunday"

    week_day = models.SmallIntegerField(
        choices=WeekDay.choices,
        blank=True,
        null=True,
        db_column="day",
    )

    class RepeatKind(models.IntegerChoices):
        WEEKLY = 0, "Every week"
        WEEKLY_2 = 1, "Every 2 weeks"
        WEEKLY_3 = 4, "Every 3 weeks"
        WEEKLY_4 = 5, "Every 4 weeks"
        MONTHLY = 2, "Every month"

    repeat_kind = models.SmallIntegerField(
        choices=RepeatKind.choices,
        db_column="repeat_type",
    )
    repeat_next_on = models.DateField(
        blank=True,
        null=True,
        db_column="next_pop_date",
    )

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

    class Meta:
        managed = False
        db_table = "cc_show_days"


class ShowInstance(models.Model):
    created_at = models.DateTimeField(db_column="created")

    show = models.ForeignKey("schedule.Show", on_delete=models.DO_NOTHING)
    instance = models.ForeignKey(
        "self",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
    )

    starts_at = models.DateTimeField(db_column="starts")
    ends_at = models.DateTimeField(db_column="ends")
    filled_time = models.DurationField(blank=True, null=True, db_column="time_filled")

    last_scheduled_at = models.DateTimeField(
        blank=True,
        null=True,
        db_column="last_scheduled",
    )

    description = models.CharField(max_length=8192, blank=True, null=True)
    modified = models.BooleanField(db_column="modified_instance")
    rebroadcast = models.SmallIntegerField(blank=True, null=True)

    auto_playlist_built = models.BooleanField(db_column="autoplaylist_built")

    record_enabled = models.SmallIntegerField(
        choices=Record.choices,
        default=Record.NO,
        blank=True,
        null=True,
        db_column="record",
    )
    record_file = models.ForeignKey(
        "storage.File",
        on_delete=models.DO_NOTHING,
        blank=True,
        null=True,
        db_column="file_id",
    )

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

    class Meta:
        managed = False
        db_table = "cc_show_instances"


class ShowRebroadcast(models.Model):
    show = models.ForeignKey("schedule.Show", on_delete=models.DO_NOTHING)
    day_offset = models.CharField(max_length=1024)
    start_time = models.TimeField()

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

    class Meta:
        managed = False
        db_table = "cc_show_rebroadcast"