from django.db import models
from django.contrib.auth.models import User
import uuid
# Create your models here.
# User.add_to_class('profiles',  models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png"))




class Profiles(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='user_profiles')

    name = models.CharField(max_length=255, null=True)
    phone = models.CharField(max_length=255, null=True)
    email = models.CharField(max_length=255, null=True)
    address = models.CharField(max_length=255, null=True)
    servicename = models.CharField(max_length=255, null=True)
    
    gender = models.CharField(max_length=255, null=True)
    profiles = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")

    password = models.CharField(max_length=255, null=True)
    gstnumber = models.CharField(max_length=255, null=True)
    pincode = models.CharField(max_length=255, null=True)


    doj = models.DateField(null=True)
    
    gst = models.FileField(upload_to='uploads/', null=True, blank=True)
    companylogo = models.FileField(upload_to='uploads/', null=True, blank=True)
    alteremail = models.CharField(max_length=255, null=True)
    alteremail1 = models.CharField(max_length=255, null=True)
    alteremail2 = models.CharField(max_length=255, null=True)


    pan = models.FileField(upload_to='uploads/', null=True, blank=True)
    role = models.SmallIntegerField(default=0)



    status = models.SmallIntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'profile'



class Client(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='clients')

    client_name = models.CharField(max_length=255, null=True, blank=True)
    phone = models.CharField(max_length=20, null=True, blank=True)
    email = models.EmailField(max_length=255, null=True, blank=True)
    address = models.TextField(null=True, blank=True)
    aadhar = models.CharField(max_length=50, null=True, blank=True)
    pan = models.CharField(max_length=10, null=True, blank=True)
    doj = models.CharField(max_length=10, null=True, blank=True)

    remarks = models.TextField(null=True, blank=True)

    status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'client'



class Student(models.Model):
    # கோச் அல்லது அட்மின் தகவல்
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='students')
    photo = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")
    monthly_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.00)



    # Frontend-ல் உள்ள அதே பெயர்கள்
    studentName = models.CharField(max_length=255, null=True, blank=True)
    parentName = models.CharField(max_length=255, null=True, blank=True)
    mobilenumber = models.CharField(max_length=20, null=True, blank=True)
    age = models.CharField(max_length=10, null=True, blank=True) # Frontend-ல் TextInput என்பதால் CharField
    address = models.TextField(null=True, blank=True)
    normal_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.00)
    special_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.00)
    
    # Class Type - ["Normal", "Special"] என வரும் டேட்டாவை String-ஆகச் சேமிக்க
    CLASS_TYPE_CHOICES = (
    (1, 'Normal'),
    (2, 'Special'),
    (3, 'Both'),
    )

    classType = models.IntegerField(choices=CLASS_TYPE_CHOICES)

    SPORT_CRICKET = 1
    SPORT_FOOTBALL = 2

    SPORT_CHOICES = (
        (SPORT_CRICKET, "Cricket"),
        (SPORT_FOOTBALL, "Football"),
    )

    sportType = models.PositiveSmallIntegerField(
        choices=SPORT_CHOICES,
        default=SPORT_CRICKET,
    )
    # Date of Joining
    dateOfJoining = models.CharField(max_length=20, null=True, blank=True)

    # Status & Logistics
    status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'student'
class Attendance(models.Model):
    # எந்த மாணவர் என்பதைக் குறிக்க (ForeignKey)
    student = models.ForeignKey('Student', on_delete=models.CASCADE, related_name='attendances')

    # எந்த கோச் அல்லது அட்மின் அட்டெண்டன்ஸ் எடுக்கிறார்
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    # Attendance தேதி (தானாக இன்றைய தேதி விழும்)
    date = models.DateField(auto_now_add=False)
    # வருகைப் பதிவு நிலை (Present / Absent)
    ATTENDANCE_STATUS = (
        ('Present', 'Present'),
        ('Absent', 'Absent'),
    )
    status = models.CharField(max_length=10, choices=ATTENDANCE_STATUS)
    # எந்த வகுப்புக்கான அட்டெண்டன்ஸ் (Normal / Special)
    # இது முக்கியம், ஏனென்றால் 'Both' பிரிவில் உள்ள மாணவர் ஒரு வகுப்பிற்கு வந்துவிட்டு இன்னொன்றிற்கு வராமல் இருக்கலாம்.
    SESSION_CHOICES = (
        (1, 'Normal Class'),
        (2, 'Special Class'),
    )
    session_type = models.IntegerField(choices=SESSION_CHOICES)

    # எந்த sport-க்கான attendance (Cricket / Football)
    # 'Both' sport-ல் உள்ள மாணவர், cricket tab-லயும் football tab-லயும்
    # தனி தனியா attendance mark ஆகணும் — அதனால இந்த field தேவை.
    SPORT_CHOICES = (
        (1, 'Cricket'),
        (2, 'Football'),
    )
    sportType = models.IntegerField(choices=SPORT_CHOICES, default=1)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'attendance'

# class Attendance(models.Model):
#     # எந்த மாணவர் என்பதைக் குறிக்க (ForeignKey)
#     student = models.ForeignKey('Student', on_delete=models.CASCADE, related_name='attendances')
    
#     # எந்த கோச் அல்லது அட்மின் அட்டெண்டன்ஸ் எடுக்கிறார்
#     user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)

#     # Attendance தேதி (தானாக இன்றைய தேதி விழும்)
#     date = models.DateField(auto_now_add=False) 

#     # வருகைப் பதிவு நிலை (Present / Absent)
#     ATTENDANCE_STATUS = (
#         ('Present', 'Present'),
#         ('Absent', 'Absent'),
#     )
#     status = models.CharField(max_length=10, choices=ATTENDANCE_STATUS)

#     # எந்த வகுப்புக்கான அட்டெண்டன்ஸ் (Normal / Special)
#     # இது முக்கியம், ஏனென்றால் 'Both' பிரிவில் உள்ள மாணவர் ஒரு வகுப்பிற்கு வந்துவிட்டு இன்னொன்றிற்கு வராமல் இருக்கலாம்.
#     SESSION_CHOICES = (
#         (1, 'Normal Class'),
#         (2, 'Special Class'),
#     )
#     session_type = models.IntegerField(choices=SESSION_CHOICES)

#     created_at = models.DateTimeField(auto_now_add=True)
#     updated_at = models.DateTimeField(auto_now=True)

#     class Meta:
#         db_table = 'attendance'


class Fees(models.Model):
    # Receipt Number தானாக உருவாக
    student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='student_fees')


    # --- Normal Class Fees ---
    normal_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)
    normal_paid = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)
    normal_balance = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)

    # --- Special Class Fees ---
    special_fees = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)
    special_paid = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)
    special_balance = models.DecimalField(max_digits=10, decimal_places=3, default=0.000)

    remarks = models.TextField(blank=True, null=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'fees'


# class Booking(models.Model):
#     BOOKING_TYPES = [
#         ('Day', 'Day Wise'),
#         ('Month', 'Month Wise'),
#     ]
    
#     customer_name = models.CharField(max_length=255)
#     phone = models.CharField(max_length=20)
#     email = models.EmailField(null=True, blank=True)
#     net_selection = models.CharField(max_length=50)
    
#     booking_type = models.CharField(max_length=10, choices=BOOKING_TYPES, default='Day')
#     booking_date = models.DateField() # Start Date ஆகவும் இதுவே செயல்படும்
#     end_date = models.DateField(null=True, blank=True) # Month புக்கிங்கிற்கு மட்டும்
    
#     start_time = models.CharField(max_length=20) # e.g., "09:00 AM"
#     end_time = models.CharField(max_length=20)
#     amount = models.DecimalField(max_digits=10, decimal_places=3)
#     payment_status = models.CharField(max_length=20, default='Pending')


#     created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
#                                    related_name='booking_created_by')
#     updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
#                                    related_name='booking_updated_by')
    
#     status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive

    
#     created_at = models.DateTimeField(auto_now_add=True)
#     updated_at = models.DateTimeField(auto_now=True)

    
#     class Meta:
#         db_table = 'bookings'

class Turf(models.Model):
    SPORT_TYPES = [
        ('Cricket', 'Cricket'),
        ('Football', 'Football'),
    ]

    name = models.CharField(max_length=100)  # e.g. "Cricket Net 1", "Football Turf 2"
    sport_type = models.CharField(max_length=10, choices=SPORT_TYPES, default='Cricket')

    status = models.SmallIntegerField(default=1)  # 1 = Active (shown in booking), 0 = Inactive (hidden)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'turfs'
        unique_together = ('name', 'sport_type')
        ordering = ['sport_type', 'name']

    def __str__(self):
        return f"{self.name} ({self.sport_type})"
class Booking(models.Model):
    BOOKING_TYPES = [
        ('Day', 'Day Wise'),
        ('Month', 'Month Wise'),
    ]
 
    SPORT_TYPES = [
        ('Cricket', 'Cricket'),
        ('Football', 'Football'),
    ]
 
    customer_name = models.CharField(max_length=255)
    phone = models.CharField(max_length=20)
    email = models.EmailField(null=True, blank=True)
 
    # NEW: which sport this booking belongs to (Cricket / Football)
    sport_type = models.CharField(max_length=10, choices=SPORT_TYPES, default='Cricket')
 
    # This holds the actual turf/net name, e.g. "Cricket Net 1" or "Football Turf 1"
    net_selection = models.CharField(max_length=50)
 
    booking_type = models.CharField(max_length=10, choices=BOOKING_TYPES, default='Day')
 
    booking_date = models.DateField()  # Start date (also the only date for Day bookings)
    end_date = models.DateField()      # ALWAYS set now — equals booking_date for Day bookings.
                                        # This removes null-handling bugs in the overlap query.
 
    # IMPORTANT: stored as 24-hour "HH:MM" (e.g. "09:00", "18:30") — NOT "09:00 AM".
    # String comparison on "09:00 AM" vs "09:00 PM" sorts wrong (AM/PM breaks lexical
    # ordering), which silently broke the double-booking check. 24hr strings sort correctly.
    start_time = models.CharField(max_length=5)
    end_time = models.CharField(max_length=5)
 
    # INR uses 2 decimal places (paise), not 3 (OMR/Baisa)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    pending_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)

 
    payment_status = models.CharField(max_length=20, default='Pending')
 
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                    related_name='booking_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                    related_name='booking_updated_by')
 
    status = models.SmallIntegerField(default=1)  # 1 = Active, 0 = Inactive
 
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
 
    class Meta:
        db_table = 'bookings'
 
    def __str__(self):
        return f"{self.customer_name} - {self.sport_type} - {self.net_selection} ({self.booking_date})"
 

class FeesHistory(models.Model):
    student = models.ForeignKey(
        Student, 
        on_delete=models.CASCADE, 
        related_name='payment_history',
        null=True, 
        blank=True
    )    
    
    # எந்த வகை பீஸ் கட்டினார்கள் என்பதை அறிய (NORMAL / SPECIAL)
    fee_type = models.CharField(max_length=20, choices=[('NORMAL', 'Normal'), ('SPECIAL', 'Special')], default='NORMAL')
    
    amount_paid = models.DecimalField(max_digits=10, decimal_places=3)
    payment_mode = models.CharField(max_length=50, default="Cash")
    payment_date = models.DateField(auto_now_add=True)
    transaction_id = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        db_table = 'fees_history'




class Loan(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name="loans")

    loan_amount = models.DecimalField(max_digits=10, decimal_places=2)
    loan_date = models.DateField()
    interest_rate = models.DecimalField(max_digits=5, decimal_places=2)
    loan_tenure_months = models.PositiveIntegerField()
    emi_start_date = models.DateField()

    
    collection_type = models.CharField(max_length=10, default='Day')

    collection_day = models.CharField(max_length=50)  # e.g. Monday / 5

   
    loan_status = models.CharField(max_length=10, default='Active')

    remarks = models.TextField(null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    class Meta:
        db_table = 'loan'



class Collection(models.Model):
    loan = models.ForeignKey(Loan, on_delete=models.CASCADE, related_name="collections")

    collectedamonut = models.CharField(max_length=255, null=True)
    

    

    method = models.CharField(max_length=50)  # e.g. Monday / 5

   

    remarks = models.TextField(null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    class Meta:
        db_table = 'collection'


class Otp(models.Model):
    email = models.CharField(max_length=255, null=True)
    status = models.SmallIntegerField(default=1)
    otp = models.CharField(max_length=6, blank=True)
    otp_created_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        db_table = 'otp'
        ordering = ['pk']



class Product(models.Model):
    company_name = models.CharField(max_length=255, null=True)
    project_name = models.CharField(max_length=255, null=True)
    application = models.CharField(max_length=255, null=True)
    country = models.CharField(max_length=255, null=True)
    deliverydate = models.CharField(max_length=255, null=True)
    bidclosedate = models.CharField(max_length=255, null=True)

    s2dailyflow = models.CharField(max_length=255, null=True)
    s2monthflow = models.CharField(max_length=255, null=True)
    s2weekflow = models.CharField(max_length=255, null=True)
    s2maxdailyflow = models.CharField(max_length=255, null=True)
    s2hourflow = models.CharField(max_length=255, null=True)
    s2bod = models.CharField(max_length=255, null=True)
    s2bodout = models.CharField(max_length=255, null=True)
    s2bodrate = models.CharField(max_length=255, null=True)
    s2cod = models.CharField(max_length=255, null=True)
    s2codout = models.CharField(max_length=255, null=True)
    s2codrate = models.CharField(max_length=255, null=True)
    s2tss = models.CharField(max_length=255, null=True)
    s2tssout = models.CharField(max_length=255, null=True)
    s2tssrate = models.CharField(max_length=255, null=True)
    s2tn = models.CharField(max_length=255, null=True)
    s2tnout = models.CharField(max_length=100, null=True)
    s2tnrate = models.CharField(max_length=100, null=True)
    s2tp = models.CharField(max_length=100, null=True)
    s2tpout = models.CharField(max_length=100, null=True)
    s2tprate = models.CharField(max_length=100, null=True)
    s2oil = models.CharField(max_length=100, null=True)
    s2oilout = models.CharField(max_length=100, null=True)
    s2oilrate = models.CharField(max_length=100, null=True)
    s2avgwatertemp = models.CharField(max_length=100, null=True)
    s2avgwatertempout = models.CharField(max_length=100, null=True)
    s2avgwatertemprate = models.CharField(max_length=100, null=True)
    s2maxwatertemp = models.CharField(max_length=100, null=True)
    s2maxwatertempout = models.CharField(max_length=100, null=True)
    s2maxwatertemprate = models.CharField(max_length=100, null=True)
    s2minwatertemp = models.CharField(max_length=100, null=True)
    s2minwatertempout = models.CharField(max_length=100, null=True)
    s2minwatertemprate = models.CharField(max_length=100, null=True)

    Davgflux1 = models.CharField(max_length=100, null=True)
    Davgflux2 = models.CharField(max_length=100, null=True)
    Dpeakflux = models.CharField(max_length=100, null=True)
    Msurfacearea1 = models.CharField(max_length=100, null=True)
    Msurfacearea2 = models.CharField(max_length=100, null=True)
    productcode = models.CharField(max_length=100, null=True)
    Noofmodule = models.CharField(max_length=100, null=True)
    Noofmtrain = models.CharField(max_length=100, null=True)
    Noofmptrain = models.CharField(max_length=100, null=True)
    TNM = models.CharField(max_length=100, null=True)
    TMsurfacearea = models.CharField(max_length=100, null=True)
    Aavgflux1 = models.CharField(max_length=100, null=True)
    Aavgflux2 = models.CharField(max_length=100, null=True)
    Apeakflux1 = models.CharField(max_length=100, null=True)
    Apeakflux2 = models.CharField(max_length=100, null=True)

    s4AT1 = models.CharField(max_length=100, null=True)
    s4AT2 = models.CharField(max_length=100, null=True)
    s4AT3 = models.CharField(max_length=100, null=True)
    s4AT4 = models.CharField(max_length=100, null=True)
    s4AT5 = models.CharField(max_length=100, null=True)
    s4AT6 = models.CharField(max_length=100, null=True)
    s4AT7 = models.CharField(max_length=100, null=True)
    s4TT1 = models.CharField(max_length=100, null=True)
    s4TT2 = models.CharField(max_length=100, null=True)
    s4TT3 = models.CharField(max_length=100, null=True)
    s4TT4 = models.CharField(max_length=100, null=True)
    s4TT5 = models.CharField(max_length=100, null=True)
    s4TT6 = models.CharField(max_length=100, null=True)
    s4TT7 = models.CharField(max_length=100, null=True)
    s4MT1 = models.CharField(max_length=100, null=True)
    s4MT2 = models.CharField(max_length=100, null=True)
    s4MT3 = models.CharField(max_length=100, null=True)
    s4MT4 = models.CharField(max_length=100, null=True)
    s4MT5 = models.CharField(max_length=100, null=True)
    s4MT6 = models.CharField(max_length=100, null=True)
    s4MT7 = models.CharField(max_length=100, null=True)

    





    
    status = models.SmallIntegerField(default=1)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='product_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='product_updated_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'product'
        ordering = ['pk']



class Notification(models.Model):
    
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='Notifications')
    type = models.CharField(max_length=20)
    message = models.TextField()
    status = models.SmallIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'notification'
        ordering = ['pk']



