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


class CorporateMember(models.Model):
    APPROVAL_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ]

    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='pending')
    corporate_member_uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    name = models.CharField(max_length=255)
    address = models.TextField()
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    pin_code = models.CharField(max_length=10)
    country = models.CharField(max_length=255)
    state = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    contact_person_name = models.CharField(max_length=255)
    contact_person_email = models.EmailField()
    contact_person_support_email = models.EmailField()
    contact_person_phone_number_country_code = models.CharField(max_length=30)
    contact_person_phone_number = models.CharField(max_length=20)
    contact_person_support_phone_number_country_code = models.CharField(max_length=30)
    contact_person_support_phone_number = models.CharField(max_length=20)
    kyc = models.FileField(upload_to='kyc/')
    pending_payment = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    domain_name = models.CharField(max_length=255)
    credit_limit = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    available_credit_points = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    used_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    requested_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    discount_percentage = models.DecimalField(max_digits=10, default=0, decimal_places=2)  # Change to FloatField
    reason = models.TextField(null=True, blank=True)

class CorporateUser(models.Model):
    APPROVAL_CHOICES = [
        ('active', 'Active'),
        ('banned', 'Banned'),
    ]

    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='active')
    corporate_user_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    name = models.CharField(max_length=255)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    this_user_admin = models.ForeignKey(CorporateMember, on_delete=models.CASCADE)
    contact_person_email = models.EmailField()
    contact_person_phone_number_country_code = models.CharField(max_length=5)
    contact_person_phone_number = models.CharField(max_length=20)
    pending_payment = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    credit_limit = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    available_credit_points = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    used_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    services_access_premise_pool = models.BooleanField(default=False)
    services_access_script_builder = models.BooleanField(default=False)
    services_access_narration = models.BooleanField(default=False)
    services_access_conversion = models.BooleanField(default=False)
    services_access_project_center = models.BooleanField(default=False)
    services_access_viewers_lounge = models.BooleanField(default=False)
    services_access_subtitle = models.BooleanField(default=False)
    discount_percentage = models.DecimalField(max_digits=10, default=0, decimal_places=2)

    
class Transaction(models.Model):
    TRANSACTION_CHOICES = [
        ('corporate_user', 'Corporate User'),
        ('corporate_member', 'Corporate Member'),
        ('institute', 'Institute'),
        ('student', 'Student'),
    ]
    CORPORATE_SERVICE_CHOICES = [
        ('premise_pool', 'Premise Pool'),
        ('script_builder', 'Script Builder'),
        ('narration', 'Narration'),
        ('conversion', 'Conversion'),
        ('project_center', 'Project Center'),
        ('viewers_lounge', 'Viewers Lounge'),
        ('subtitle', 'Subtitle'),
    ]
    TRANSACTION_STATUS = [
        ('pending', 'Pending'),
        ('paid', 'Paid'),
    ]
    transaction_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE,related_name='user_id_s')
    date = models.DateTimeField(default=datetime.now)
    user_type = models.CharField(max_length=20, choices=TRANSACTION_CHOICES)
    service_type = models.CharField(max_length=20, choices=CORPORATE_SERVICE_CHOICES)
    service_id = models.CharField(max_length=200)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    status = models.CharField(max_length=8, choices=TRANSACTION_STATUS, default='pending')


class CreditRequest(models.Model):
    REQUEST_CHOICES = [
        ('corporate_membership', 'Corporate Membership'),
        
    ]
    credit_request_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    ctype = models.CharField(max_length=20, choices=REQUEST_CHOICES)
    date = models.DateTimeField(default=datetime.now)
    request_from = models.ForeignKey(CorporateUser, on_delete=models.CASCADE, related_name='credit_requests_sent')
    request_to = models.ForeignKey(CorporateMember, on_delete=models.CASCADE, related_name='credit_requests_received')
    credits_requested = models.DecimalField(max_digits=10, decimal_places=2)

class CreditRequestFromMember(models.Model):
    REQUEST_CHOICES = [
        ('corporate_membership', 'Corporate Membership'),
    ]
    credit_request_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    ctype = models.CharField(max_length=20, choices=REQUEST_CHOICES)
    date = models.DateTimeField(default=datetime.now)
    request_from = models.ForeignKey(CorporateMember, on_delete=models.CASCADE, related_name='credit_requests_member_received')
    credits_requested = models.DecimalField(max_digits=10, decimal_places=2)

class Payment(models.Model):
    user = models.ForeignKey(CorporateMember, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=10, decimal_places=2)

class Institute(models.Model):
    APPROVAL_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ] 
    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='pending')
    institute_uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    institute_type = models.CharField(max_length=255)
    institute_phone_number_country_code = models.CharField(max_length=30)
    institute_phone_number = models.CharField(max_length=20)
    institute_email = models.EmailField()
    address = models.TextField()
    pin_code = models.CharField(max_length=10)
    country = models.CharField(max_length=255)
    state = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    admin_name = models.CharField(max_length=255)
    admin_email = models.EmailField()
    admin_phone_number_country_code = models.CharField(max_length=30)
    admin_phone_number = models.CharField(max_length=20)
    requested_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    kyc = models.FileField(upload_to='kyc/')
    domain_name = models.CharField(max_length=255)
    credit_limit = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    available_credit_points = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    used_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    pending_payment = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    discount_percentage = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    reason = models.TextField(null=True, blank=True)


class AffiliatedStudent(models.Model):
    APPROVAL_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ] 
    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='pending')
    affiliated_student_uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    email = models.EmailField()
    student_institute_email = models.EmailField()
    affiliated_student_phone_number_country_code = models.CharField(max_length=30)
    affiliated_student_phone_number = models.CharField(max_length=20)
    affiliated_student_alternate_phone_number_country_code = models.CharField(max_length=30, null=True, blank=True)
    affiliated_student_alternate_phone_number = models.CharField(max_length=20, null=True, blank=True)
    institute = models.ForeignKey(Institute, on_delete=models.CASCADE)
    requested_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    credit_limit = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    available_credit_points = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    used_credit_point = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    pending_payment = models.DecimalField(max_digits=10, default=0, decimal_places=2)
    free_credits = models.DecimalField(max_digits=10, default=250, decimal_places=2)
    kyc = models.FileField(upload_to='kyc/')
    end_date = models.DateField()
    reason = models.TextField(null=True, blank=True)

class UnaffiliatedStudent(models.Model):
    APPROVAL_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ] 
    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='pending')
    unaffiliated_student_uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    email = models.EmailField()
    student_institute_email = models.EmailField()
    unaffiliated_student_phone_number_country_code = models.CharField(max_length=30)
    unaffiliated_student_phone_number = models.CharField(max_length=20)
    unaffiliated_student_alternate_phone_number_country_code = models.CharField(max_length=30, null=True, blank=True)
    unaffiliated_student_alternate_phone_number = models.CharField(max_length=20, null=True, blank=True)
    institute_name = models.CharField(max_length=255, null=True, blank=True)
    institute_type = models.CharField(max_length=255, null=True, blank=True)
    institute_address = models.TextField(null=True, blank=True)
    institute_pin_code = models.CharField(max_length=10, null=True, blank=True)
    institute_country = models.CharField(max_length=255, null=True, blank=True)
    institute_state = models.CharField(max_length=255, null=True, blank=True)
    institute_city = models.CharField(max_length=255, null=True, blank=True)
    free_credits = models.DecimalField(max_digits=10, default=250, decimal_places=2)
    kyc = models.FileField(upload_to='kyc/')
    end_date = models.DateField()
    reason = models.TextField(null=True, blank=True)
    

class WaitForInstituteStudent(models.Model):
    APPROVAL_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ] 
    is_approved = models.CharField(max_length=10, choices=APPROVAL_CHOICES, default='pending')
    wait_for_institute_student_uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    joining_date = models.DateTimeField(default=datetime.now)
    approve_date = models.DateTimeField(null=True, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    email = models.EmailField()
    student_institute_email = models.EmailField()
    wait_for_institute_student_phone_number_country_code = models.CharField(max_length=30)
    wait_for_institute_student_phone_number = models.CharField(max_length=20)
    wait_for_institute_student_a_phone_number_country_code = models.CharField(max_length=30, null=True, blank=True)
    wait_for_institute_student_alternate_phone_number = models.CharField(max_length=20, null=True, blank=True)
    free_credits = models.DecimalField(max_digits=10, default=250, decimal_places=2)
    institute_email = models.EmailField()
    kyc = models.FileField(upload_to='kyc/')
    end_date = models.DateField()
    reason = models.TextField(null=True, blank=True)
    

class CreditRequestStudent(models.Model):
    REQUEST_CHOICES = [
        ('student_membership', 'Student Membership'),
        
    ]
    credit_request_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    ctype = models.CharField(max_length=20, choices=REQUEST_CHOICES)
    date = models.DateTimeField(default=datetime.now)
    request_from = models.ForeignKey(AffiliatedStudent, on_delete=models.CASCADE, related_name='credit_requests_student_sent')
    request_to = models.ForeignKey(Institute, on_delete=models.CASCADE, related_name='credit_requests_student_received')
    credits_requested = models.DecimalField(max_digits=10, decimal_places=2)

class CreditRequestInstitute(models.Model):
    REQUEST_CHOICES = [
        ('institute_membership', 'Institute Membership'),
    ]
    credit_request_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    ctype = models.CharField(max_length=20, choices=REQUEST_CHOICES)
    date = models.DateTimeField(default=datetime.now)
    request_from = models.ForeignKey(Institute, on_delete=models.CASCADE, related_name='credit_requests_institute_received')
    credits_requested = models.DecimalField(max_digits=10, decimal_places=2)