from django.db import models
from django.contrib.auth.models import User


class Module(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=160)
    code = models.CharField(max_length=160, unique=True)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Permission(models.Model):
    id = models.BigAutoField(primary_key=True)
    module = models.ForeignKey(Module, on_delete=models.CASCADE, null=True, blank=True, related_name='permissions')
    name = models.CharField(max_length=160)
    code = models.CharField(max_length=160, unique=True)    
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Role(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=160)
    code = models.CharField(max_length=160, unique=True)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    permissions = models.ManyToManyField(
        Permission,
        through='PermissionRole',
        related_name='roles',
        blank=True
    )

    def __str__(self):
        return self.name


class PermissionRole(models.Model):
    id = models.BigAutoField(primary_key=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name='permission_roles', null=True, blank=True)
    permission = models.ForeignKey(Permission, on_delete=models.CASCADE, related_name='permission_roles', null=True, blank=True)

    class Meta:
        unique_together = ('role', 'permission')

    def __str__(self):
        return f"{self.role} - {self.permission}"


class Admin(models.Model):
    id = models.BigAutoField(primary_key=True)
    role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True, blank=True, related_name='admins')
    name = models.CharField(max_length=160)
    mobile = mobile = models.CharField(max_length=20, null=True, blank=True)
    email = models.EmailField(max_length=160, unique=True)
    admin_code = models.CharField(max_length=160, unique=True)
    password = models.CharField(max_length=160)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Master(models.Model):
    TYPE_CHOICES = (
        (1, 'Interest'),
        (2, 'Language'),
        (3, 'Report'),
        (4, 'Feedback'),
        (5, 'Faqs'),
        (6, 'Delete Reasons'),
        (7, 'Withdraw notes'),
        (8, 'Default profile male'),
        (9, 'Default profile female'),
        (10, 'Review'),
    )

    id = models.BigAutoField(primary_key=True)
    type = models.SmallIntegerField(choices=TYPE_CHOICES)
    name = models.CharField(max_length=255, unique=True)
    value1 = models.TextField(null=True, blank=True)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name
    
class Banner(models.Model):
    id = models.BigAutoField(primary_key=True)
    type = models.SmallIntegerField()  #0 - Default, 1 - Referal, 2 - Coin Plan, 3 - Female Reward
    image = models.CharField(max_length=255, null=True, blank=True)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.type}"


class Gift(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=160, unique=True)
    icon = models.CharField(max_length=160)
    male_coins = models.FloatField(default=0)
    female_coins = models.FloatField(default=0)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name
    

class AppSetting(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255)
    code = models.CharField(max_length=255, unique=True)
    value = models.FloatField()
    notes = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.name} - {self.code}"
    

class Transaction(models.Model):
    payment_id = models.CharField(max_length=200, verbose_name="Payment ID")
    order_id = models.CharField(max_length=200, verbose_name="Order ID")
    signature = models.CharField(max_length=500, verbose_name="Signature", blank=True, null=True)
    amount = models.IntegerField(verbose_name="Amount")
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.id)
    

class FemaleReward(models.Model):
    id = models.BigAutoField(primary_key=True)
    type = models.SmallIntegerField()  # 1 - Voice, 2 - Video
    user_type = models.SmallIntegerField()  # 1 - Normal, 2 - Premium
    duration = models.CharField(max_length=255)
    start_min = models.FloatField()
    end_min = models.FloatField()
    coins = models.FloatField(default=0)
    status = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.type} - {self.user_type} - {self.duration}"