from django.db import models

from authentication.models import BaseModel
from authentication.models import UserProfile, Group


# from numpy import char


# Create your models here.


class NotificationActions(BaseModel):
    name = models.CharField(max_length=100, default="", null=True)

    def __str__(self) -> str:
        return self.name

    def save(self, *args, **kwargs):
        super(NotificationActions, self).save(*args, **kwargs)

    pass


class NotificationButton(BaseModel):
    content = models.CharField(max_length=20, default="", null=True)
    order = models.IntegerField(default=0, null=True)
    action = models.ForeignKey(
        NotificationActions,
        on_delete=models.CASCADE,
        default=None,
        null=True,
        related_name="btn_actions",
    )

    def __str__(self) -> str:
        return self.content

    def save(self, *args, **kwargs):
        super(NotificationButton, self).save(*args, **kwargs)

    pass


class NotificationType(BaseModel):
    notif_types = (
        ("user", "USER"),
        ("alluser", "AllUSER"),
        ("group", "GROUP"),
        ("allgroup", "AllGROUP"),
        ("usergroup", "UserGroup"),
        ("poultry", "Poultry"),
        ("province_accept", "ProvinceAccept"),
        ("province_rejected", "ProvinceRejected"),
        ("city_operator_accept", "CityOperatorAccept"),
        ("city_operator_rejected", "CityOperatorRejected"),
        ("assignment_accepted", "AssignmentAccepted"),
        ("assignment_rejected", "AssignmentRejected"),
    )
    name = models.CharField(choices=notif_types, max_length=50, default="", null=True)

    def __str__(self) -> str:
        return self.name

    def save(self, *args, **kwargs):
        super(NotificationType, self).save(*args, **kwargs)

    pass


class NotificationToken(BaseModel):
    token = models.CharField(max_length=100)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name="notification_user", null=True)

    def __str__(self) -> str:
        return self.token

    def save(self, *args, **kwargs):
        super(NotificationToken, self).save(*args, **kwargs)

    pass


class Notification(BaseModel):
    s = (
        ("read", "Read"),
        ("pending", "Pending"),
        ("sent", "Sent"),
        ("unread", "Unread"),
        ("silent", "Silent"),
    )
    notif_type = models.ForeignKey(
        NotificationType,
        on_delete=models.CASCADE,
        null=True,
        default=None,
        related_name="types",
    )
    notif_action = models.ForeignKey(
        NotificationActions,
        on_delete=models.CASCADE,
        null=True,
        default=None,
        related_name="actions",
    )
    notif_button = models.ForeignKey(
        NotificationButton,
        on_delete=models.CASCADE,
        null=True,
        default=None,
        related_name="buttons",
    )
    notification_user = models.ManyToManyField(
        NotificationToken,
        null=True,
        related_name="notification_token"
    )
    notification_group = models.ManyToManyField(
        Group,
        null=True,
        related_name="group"
    )
    title = models.CharField(max_length=200, default="", null=True)
    content = models.CharField(max_length=500, default="", null=True)
    image = models.CharField(max_length=100, null=True)
    icon = models.CharField(max_length=100, null=True)
    app_ids = models.CharField(max_length=200, default="", null=True)
    device_ids = models.CharField(max_length=200, default="", null=True)
    hash_id = models.CharField(max_length=20, default="", null=True)
    status = models.CharField(choices=s, max_length=10, default="", null=True)

    def __str__(self) -> str:
        return self.title

    def save(self, *args, **kwargs):
        super(Notification, self).save(*args, **kwargs)

    pass


class DashboardNotification(BaseModel):
    role = models.ManyToManyField(Group,
                                  null=True,
                                  related_name="dashboard_notification")
    title = models.CharField(max_length=250, null=True)
    text = models.TextField(null=True)
    date = models.DateTimeField(null=True)
    status = models.CharField(max_length=100, null=True)

    def save(self, *args, **kwargs):
        super(DashboardNotification, self).save(*args, **kwargs)