import uuid

from django.contrib.auth.models import User
from django.db import models

# 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)
    
    # 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 Category(models.Model):
    name = models.CharField(max_length=255, null=True)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subcategories')
    service_status = models.IntegerField(null=True, blank=True)
    description = models.TextField(null=True)
    status = models.SmallIntegerField(default=1)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='category_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='category_updated_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'category'
        ordering = ['pk']


class CategoryServiceProvider(models.Model):
    # எந்த Subcategory (உதாரணம்: Plumbing அல்லது Electrician)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='mapped_services')
    
    # எந்த நபர் (Profiles டேபிளில் உள்ள Provider)
    provider = models.ForeignKey(Profiles, on_delete=models.CASCADE, related_name='mapped_providers')
    
    status = models.SmallIntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'category_service_provider'



class UserBooking(models.Model):
    # எந்த பயனர் புக் செய்கிறார்
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='my_bookings')
    
    # எந்த ப்ரோவைடரைத் தொடர்பு கொள்கிறார் (Profiles மாடல் உங்கள் சர்வீஸ் ப்ரோவைடர் என எடுத்துக்கொள்கிறேன்)
    provider = models.ForeignKey(Profiles, on_delete=models.CASCADE, related_name='received_bookings')
    
    # எந்த வகை சர்வீஸ் (Plumbing, AC Service போன்றவை)
    category_name = models.CharField(max_length=255, null=True, blank=True)
    
    # என்ன ஆக்ஷன் செய்தார் (Call அல்லது WhatsApp)
    ACTION_CHOICES = (
        ('Call', 'Phone Call'),
        ('WhatsApp', 'WhatsApp Message'),
    )
    action_type = models.CharField(max_length=20, choices=ACTION_CHOICES)
    
    # புக்கிங் ஸ்டேட்டஸ் (எதிர்கால பயன்பாட்டிற்கு)
    STATUS_CHOICES = (
        (0, 'Pending'),
        (1, 'Completed'),
        (2, 'Cancelled'),
    )
    booking_status = models.SmallIntegerField(default=0, choices=STATUS_CHOICES)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'user_booking'
        ordering = ['-created_at'] # சமீபத்திய புக்கிங் முதலில் வர

    







class Subcategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=255, null=True)
    description = models.TextField(null=True)
    status = models.SmallIntegerField(default=1)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='subcategory_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='subcategory_updated_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'subcategory'
        ordering = ['pk']


class JobPost(models.Model):
    title = models.CharField(max_length=255)
    # Category மற்றும் SubCategory இரண்டையும் இணைக்கிறோம்
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    sub_category = models.ForeignKey(Subcategory, on_delete=models.SET_NULL, null=True)
    
    poster = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")

    salary = models.CharField(max_length=100)
    location = models.CharField(max_length=255)
    description = models.TextField()

    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='jobpost_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='jobpost_updated_by')
    
    created_at = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(default=1) # 1: Active, 0: Filled/Closed

    class Meta:
        db_table = 'jobpost'
        ordering = ['pk']


class Fees(models.Model):
    receipt_no = models.CharField(max_length=20, unique=True, default=uuid.uuid4().hex[:8].upper())
    student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='student_fees')
    total_amount = models.DecimalField(max_digits=10, decimal_places=3)
    paid_amount = models.DecimalField(max_digits=10, decimal_places=3)
    balance_amount = models.DecimalField(max_digits=10, decimal_places=3)
    payment_date = models.DateField()
    remarks = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'fees'

class FeesHistory(models.Model):

    student = models.ForeignKey(
        Student, 
        on_delete=models.CASCADE, 
        related_name='payment_history',
        null=True, 
        blank=True
    )    
    
    # இந்த முறை கட்டிய தொகை மட்டும்
    amount_paid = models.DecimalField(max_digits=10, decimal_places=3)
    
    # பணம் கட்டிய முறை (Cash, GPay, Bank Transfer)
    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']



