import logging
from typing import Optional, Union

from django.db import models

logger = logging.getLogger(__name__)


class Preference(models.Model):
    user = models.ForeignKey(
        "core.User",
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        db_column="subjid",
    )
    key = models.CharField(
        max_length=255,
        unique=True,
        blank=True,
        null=True,
        db_column="keystr",
    )
    value = models.TextField(
        blank=True,
        null=True,
        db_column="valstr",
    )

    class Meta:
        managed = False
        db_table = "cc_pref"
        unique_together = (("user", "key"),)


class StreamSetting(models.Model):
    key = models.CharField(
        primary_key=True,
        max_length=64,
        db_column="keyname",
    )
    raw_value = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_column="value",
    )
    type = models.CharField(
        max_length=16,
    )

    @property
    def value(self) -> Optional[Union[bool, int, str]]:
        # Ignore if value is an empty string
        if not self.raw_value:
            return None

        if self.type == "boolean":
            return self.raw_value.lower() == "true"
        if self.type == "integer":
            return int(self.raw_value)
        if self.type == "string":
            return self.raw_value

        logger.warning(f"StreamSetting {self.key} has invalid type {self.type}")
        return self.raw_value

    class Meta:
        managed = False
        db_table = "cc_stream_setting"