from django.db import models
from master.models import Master

class Verification(models.Model):
    id = models.BigAutoField(primary_key=True)
    country_code = models.CharField(max_length=20)
    mobile = models.CharField(max_length=20)
    otp = models.CharField(max_length=10)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.mobile
    
class User(models.Model):
    id = models.BigAutoField(primary_key=True)
    referer_id = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL)
    country_code = models.CharField(max_length=20)
    mobile = models.CharField(max_length=20, unique=True)
    gender = models.SmallIntegerField()  # 1 - male, 2 - female
    display_name = models.CharField(max_length=160, unique=True)
    real_name = models.CharField(max_length=160)
    about = models.TextField(null=True, blank=True)
    email = models.CharField(max_length=160)
    dob = models.DateField()
    age = models.IntegerField()
    referral_code = models.CharField(max_length=20, unique=True)
    language_id = models.ForeignKey(Master, null=True, on_delete=models.SET_NULL)
    display_image = models.CharField(max_length=160)
    default_image = models.CharField(max_length=160)
    profile_image = models.CharField(max_length=160)
    available_coins = models.BigIntegerField(default=0)
    available_minutes = models.FloatField(default=0)
    status = models.SmallIntegerField(default=1)  # 0 - Not Verified, 1 - Online, 2 - Busy, 3 - Offline
    user_type = models.SmallIntegerField(default=1)  #1 - Normal, 2 - Gold, 3 - Premium
    deleted_at = models.DateTimeField(null=True, blank=True)
    delete_reason = models.CharField(max_length=255, null=True, blank=True)
    first_offer_used = models.BooleanField(default=False)
    referral_min_used = models.BooleanField(default=False)
    admin_status = models.SmallIntegerField(default=0) # 0 - Not Verified, 1 - Accepted, 2 - Rejected, 3 - Admin deactivate
    call_type = models.SmallIntegerField(default=0) #1 - audio, 2 - Video,
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.display_name
    
class UserInterest(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='interests')
    interest = models.ForeignKey(Master, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.user.display_name} - {self.interest.name}"


class UserLanguage(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='languages')
    language = models.ForeignKey(Master, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.user.display_name} - {self.language.name}"


class UserImage(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.CharField(max_length=160)

    def __str__(self):
        return f"{self.user.display_name}"
    
class UserBlock(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blocked_users')
    blocked_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blocked_by')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.display_name} - {self.blocked_user.display_name}"


class UserFavourite(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='favourites')
    favourite_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='favourited_by')
    created_at = models.DateTimeField(auto_now_add=True)

    def __self__(self):
        return f"{self.user.display_name} - {self.favourite_user.display_name}"

class Enquiry(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=255)
    description = models.TextField()
    admin_description = models.TextField()
    status = models.SmallIntegerField(default=1)  # 1 - Open, 2 - Closed
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user.display_name} - {self.subject}"

class UserReport(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reported_users')
    reported_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reported_by')
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.display_name} - {self.reported_user.display_name}"
    
class Plan(models.Model):
    id = models.BigAutoField(primary_key=True)
    type = models.SmallIntegerField()  # 1 - Offer, 2 - Normal
    coins = models.BigIntegerField()
    amount = models.FloatField()
    payable_amount = models.FloatField()
    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.coins}"
    
class UserTransaction(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    payment_id = models.CharField(max_length=200, verbose_name="Payment ID")
    coins = models.BigIntegerField()
    amount = models.FloatField()
    duration = models.CharField(max_length=160)
    status = models.SmallIntegerField()  # 1 - Initiated, 2 - In Progress, 3-Completed, 4-Failed
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user.display_name} - {self.plan.coins}"