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)

    last_seen = models.DateTimeField(null=True, blank=True) # 👈 இதை மட்டும் சேர்த்துக்கோங்க சார்

    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'


 
 


INDUSTRY_CHOICES = [
    ('hotel', 'Hotel'),
    ('restaurant', 'Restaurant'),
    ('other', 'Other'),
]
 
# Single-select now: one MenuItem belongs to exactly ONE meal type.
MEAL_TYPE_CHOICES = [
    ('breakfast', 'Breakfast'),
    ('lunch', 'Lunch'),
    ('dinner', 'Dinner'),
    ('tea_time', 'Tea Time'),
]
 
VALID_MEAL_TYPES = {key for key, _ in MEAL_TYPE_CHOICES}
 
 
# ─────────────────────────────────────────────────────────────────
# MealTime — ONE row per (user, meal_type). Single source of truth
# for "what time does my Breakfast / Lunch / Dinner / Tea Time run
# from -> to". Creating/editing a MenuItem for a given meal_type
# upserts (creates or overwrites) this row — the time is never asked
# for twice per meal type, it's shared across every item of that type.
# ─────────────────────────────────────────────────────────────────
class MealTime(models.Model):
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='meal_times'
    )
    meal_type = models.CharField(max_length=20, choices=MEAL_TYPE_CHOICES)
    from_time = models.TimeField()
    to_time = models.TimeField()
    updated_at = models.DateTimeField(auto_now=True)
 
    class Meta:
        # DB-level guarantee: a user can never have two rows for the
        # same meal_type.
        unique_together = ('created_by', 'meal_type')
 
    def __str__(self):
        return f"{self.created_by_id} - {self.meal_type}"
 
 
class MenuItem(models.Model):
    industry_type = models.CharField(max_length=20, choices=INDUSTRY_CHOICES, default='other')
    name = models.CharField(max_length=200)
 
    price = models.DecimalField(
        max_digits=8,
        decimal_places=3,
        null=True,
        blank=True,
    )
 
    # Single-select meal type now (was 4 separate booleans before).
    # blank=True because meal_type itself is optional — an item can
    # have no meal type at all if the business doesn't need one.
    meal_type = models.CharField(
        max_length=20, choices=MEAL_TYPE_CHOICES, null=True, blank=True
    )
 
    is_available = models.BooleanField(default=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='menuitem_created_by')
    created_at = models.DateTimeField(auto_now_add=True)
 
    def __str__(self):
        return self.name
 
    class Meta:
        ordering = ['name']
 


class WiFiConfig(models.Model):
    device_id  = models.CharField(max_length=100, unique=True)
    ssid       = models.CharField(max_length=100)
    password   = models.CharField(max_length=100)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='wificonfig_created_by')
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)
    last_seen  = models.DateTimeField(null=True, blank=True)
 
    def __str__(self):
        return f"{self.device_id} - {self.ssid}"
 
    class Meta:
        ordering = ['-updated_at']

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']



