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)
    # 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)

    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 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']



