from django.db import models
from django.contrib.auth.models import User

# Create your models here.
# User.add_to_class('profiles',  models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png"))

import json
import numpy as np


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 Department(models.Model):
    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='deartment_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='department_updated_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'department'
        ordering = ['pk']







class Designation(models.Model):
    department = models.ForeignKey(Department, 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='designation_created_by')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='designation_updated_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'designation'
        ordering = ['pk']

class Employee(models.Model):
    # Basic Info
    name = models.CharField(max_length=255)
    mobile = models.CharField(max_length=15, unique=True)
    age = models.IntegerField(null=True, blank=True)
    address = models.TextField(null=True, blank=True)
    
    # Profile Picture (Image upload)
    photo = models.FileField(upload_to='uploads/', null=True, blank=True, default="../static/dummy.png")
    face_encoding_data = models.TextField(null=True, blank=True)
    pan = models.TextField(null=True, blank=True)


    ctc = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    grossSalary = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    basic = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    hra = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    conveyance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    otherAllowance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    
    # --- Deductions & Limits ---
    fixedPT = models.DecimalField(max_digits=10, decimal_places=2, default=208.00)
    pfLimit = models.DecimalField(max_digits=10, decimal_places=2, default=1800.00)
    
    # --- Monthly Variables (இவை ஒவ்வொரு மாதமும் மாறக்கூடியவை) ---
    advance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    ot = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    reimbursement = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    incentive = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)

    
    # Foreign Keys (Linking to your existing models)
    department = models.ForeignKey(
        'Department', 
        on_delete=models.SET_NULL, 
        null=True, 
        related_name='employees'
    )
    designation = models.ForeignKey(
        'Designation', 
        on_delete=models.SET_NULL, 
        null=True, 
        related_name='employees'
    )
    
    # Metadata
    doj = models.DateField(verbose_name="Date of Joining")
    status = models.SmallIntegerField(default=1) # 1: Active, 0: Resigned/Inactive
    
    # Audit Fields
    created_by = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True,
        related_name='employee_created_by'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    def save_encoding(self, encoding_array):
        self.face_encoding_data = json.dumps(encoding_array.tolist())
        self.save()

    # சேமிக்கப்பட்ட டேட்டாவை மீண்டும் Array-ஆக எடுக்க
    def get_encoding(self):
        if self.face_encoding_data:
            return np.array(json.loads(self.face_encoding_data))
        return None

    class Meta:
        db_table = 'employees'
        ordering = ['-created_at']


class Attendance(models.Model):
    # எந்த மாணவர் என்பதைக் குறிக்க (ForeignKey)
    employee = models.ForeignKey('Employee', on_delete=models.CASCADE, 
        null=True, 
        related_name='attendance_records'
    )
    
    # எந்த கோச் அல்லது அட்மின் அட்டெண்டன்ஸ் எடுக்கிறார்
    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'),
    )
    in_time = models.TimeField(null=True, blank=True)  # உள்ளே வந்த நேரம்
    out_time = models.TimeField(null=True, blank=True) # வெளியே சென்ற நேரம்
    status = models.CharField(max_length=10, choices=ATTENDANCE_STATUS)

    

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'attendance'





class Announcement(models.Model):
    description = models.TextField(null=True)
    date = models.DateField(null=True, blank=True)
    status = models.SmallIntegerField(default=1)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='announcements_created_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'announcement'



class LeaveRequest(models.Model):
    type = models.CharField(max_length=255, null=True)
    reason = models.TextField(null=True)
    total_days = models.CharField(max_length=255, null=True)
    leave_dates = models.JSONField(blank=True, null=True)
    why = models.TextField(null=True)


    status = models.SmallIntegerField(default=1)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                   related_name='leaverequest_created_by')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'leaverequest'






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 Payslip(models.Model):

    employee = models.ForeignKey('Employee', on_delete=models.CASCADE, 
        null=True, 
        related_name='payslip_records'
    )
    empname = models.CharField(max_length=255, null=True)
    empid = models.CharField(max_length=255, null=True)
    emppan = models.CharField(max_length=255, null=True)
    ctc = models.CharField(max_length=255, null=True)
    grosssalary = models.CharField(max_length=255, null=True)
    perdaysalary = models.CharField(max_length=255, null=True)
    basicsalary = models.CharField(max_length=255, null=True)
    hra = models.CharField(max_length=255, null=True)
    conveyance = models.CharField(max_length=255, null=True)
    otherallowance = models.CharField(max_length=255, null=True)
    totaldays = models.CharField(max_length=255, null=True)
    workingdays = models.CharField(max_length=255, null=True)
    baiscnew = models.CharField(max_length=255, null=True)
    hranew = models.CharField(max_length=255, null=True)
    conveyancenew = models.CharField(max_length=255, null=True)
    otherallowancenew = models.CharField(max_length=255, null=True)
    grosspay = models.CharField(max_length=255, null=True)
    variablepfgross = models.CharField(max_length=255, null=True)
    esiless = models.CharField(max_length=255, null=True)
    pfless = models.CharField(max_length=255, null=True)
    bank = models.CharField(max_length=255, null=True)
    uan = models.CharField(max_length=255, null=True)
    lesspt = models.CharField(max_length=255, null=True)
    pf = models.CharField(max_length=255, null=True)
    esi = models.CharField(max_length=255, null=True)
    
    advance = models.CharField(max_length=255, null=True)
    netpay = models.CharField(max_length=255, null=True)
    ot = models.CharField(max_length=255, null=True)
    reimbursement = models.CharField(max_length=255, null=True)
    incentive = models.CharField(max_length=255, null=True)
    topay = models.CharField(max_length=255, null=True)
    month = models.CharField(max_length=255, null=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 = 'payslip'



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']



