from django.db import models
from django.contrib.auth.models import AbstractUser
import datetime
from ckeditor.fields import RichTextField


class Department(models.Model):
    '''
     Department Employee belongs to. eg. Transport, Engineering.
    '''
    
    name = models.CharField(max_length=125)
    description = models.CharField(max_length=125,null=True,blank=True)

    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True)
    updated = models.DateTimeField(verbose_name=('Updated'),auto_now=True)


    class Meta:
        verbose_name = ('Department')
        verbose_name_plural = ('Departments')
        ordering = ['name','created']
    
    def __str__(self):
        return self.name

FULL_TIME = 'Full-Time'
PART_TIME = 'Part-Time'
CONTRACT = 'Contract'
INTERN = 'Intern'

EMPLOYEETYPE = (
    (FULL_TIME,'Full-Time'),
    (PART_TIME,'Part-Time'),
    (CONTRACT,'Contract'),
    (INTERN,'Intern'),
    )

DAYS = 30


class User_Profile(AbstractUser):
    username = models.CharField(max_length=100, unique=False, blank=True, null=True)
    email=models.EmailField(verbose_name='Email',max_length=255,unique=True)
    full_name = models.CharField(max_length=200)
    organisation = models.CharField(max_length=200, blank=True, null=True)
    profile_pic = models.FileField(upload_to='profile_pics', blank=True, null=True)
    phone=models.CharField(max_length=10, null=True, blank=True, unique=True)
    employee_id = models.CharField(max_length=50, null=True, blank=True)
    job_title = models.CharField(max_length=255, null=True, blank=True)
    employee_type = models.CharField(('Employee Type'),max_length=15,default=FULL_TIME,choices=EMPLOYEETYPE,blank=True,null=True)
    experiance = models.IntegerField(blank=True, null=True)
    department = models.ForeignKey(Department,on_delete=models.CASCADE, null=True, blank=True)
    manager = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True,related_name='employee_manager')
    team_leader = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True,related_name='employee_team_leader')
    hr = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True,related_name='employee_hr')
    date_of_birth = models.DateField(null=True, blank=True)
    address = models.TextField(null=True, blank=True)
    agreement = models.BooleanField(default=False, null=True, blank=True)
    date_join = models.DateField(null=True, blank=True)
    leave_in_year = models.PositiveIntegerField(verbose_name=('Leave days per year counter'),default=DAYS,null=True,blank=True)
    
    USERNAME_FIELD='email'
    REQUIRED_FIELDS= ['full_name','username']

    def __str__(self):
        if self.full_name:
            return self.full_name
        else:
            return self.email

    @property
    def get_age(self):
        current_year = datetime.date.today().year
        dateofbirth_year = self.date_of_birth.year
        if dateofbirth_year:
            return current_year - dateofbirth_year
        return
    @property
    def get_pretty_birthday(self):
        if self.birthday:
            return self.birthday.strftime('%A,%d %B') # Thursday,04 May -> staffs age privacy
        return




    @property
    def birthday_today(self):
        '''
        returns True, if birthday is today else False
        '''
        return self.birthday.day == datetime.date.today().day



    @property
    def days_check_date_fade(self):
        '''
        Check if Birthday has already been celebrated ie in the Past     ie. 4th May  & today 8th May 4 < 8 -> past else present or future '''
        return self.birthday.day < datetime.date.today().day #Assumption made,If that day is less than today day,in the past




    def birthday_counter(self):
        '''
        This method counts days to birthday -> 2 day's or 1 day
        '''
        today = datetime.date.today()
        current_year = today.year

        birthday = self.birthday # eg. 5th May 1995

        future_date_of_birth = datetime.date(current_year,birthday.month,birthday.day)#assuming born THIS YEAR ie. 5th May 2019

        if birthday:
            if (future_date_of_birth - today).days > 1:

                return str((future_date_of_birth - today).days) + ' day\'s'

            else:

                return ' tomorrow'

        return




class Bank(models.Model):
    # access table: employee.bank_set.
    employee = models.ForeignKey(User_Profile,help_text='select employee(s) to add bank account',on_delete=models.CASCADE,null=True,blank=False)
    name = models.CharField(('Name of Bank'),max_length=125,blank=False,null=True,help_text='')
    account = models.CharField(('Account Number'),help_text='employee account number',max_length=30,blank=False,null=True)
    branch = models.CharField(('Branch'),help_text='which branch was the account issue',max_length=125,blank=True,null=True)
    salary = models.DecimalField(('Starting Salary'),help_text='This is the initial salary of employee',max_digits=16, decimal_places=2,null=True,blank=False)
    country = models.CharField(max_length=100, blank=True, null=True)
    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True,null=True)
    updated = models.DateTimeField(verbose_name=('Updated'),auto_now=True,null=True)


    class Meta:
        verbose_name = ('Bank')
        verbose_name_plural = ('Banks')
        ordering = ['-name','-account']


    def __str__(self):
        return ('{0}'.format(self.name))    

YEARS = (
    ('2024','2024'),
    ('2025','2025'),
    ('2026','2026'),
    ('2027','2027'),
    ('2028','2028'),
    ('2029','2029'),
    ('2030','2030'),
    ('2031','2031'),
    ('2032','2032'),
    ('2033','2033'),
    ('2034','2034'),
    ('2035','2035'),
)

MONTHS = (
    ('January','January'),
    ('February','February'),
    ('March','March'),
    ('April','April'),
    ('May','May'),
    ('June','June'),
    ('July','July'),
    ('August','August'),
    ('September','September'),
    ('October','October'),
    ('November','November'),
    ('December','December')
)


class Payroll(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, null=True, blank=False)
    month = models.CharField(max_length=50,blank=True,null=True,choices=MONTHS)
    year = models.CharField(max_length=50,blank=True,null=True,choices=YEARS)
    basic_salary = models.IntegerField(blank=True,null=True)
    total_days = models.IntegerField(default=30,null=True, blank=False)
    present_days = models.IntegerField(null=True, blank=False)
    medical = models.IntegerField(null=True, blank=False)
    pf = models.IntegerField(null=True, blank=False)
    bonus = models.DecimalField(max_digits=10, decimal_places=2,null=True, blank=True)
    convence = models.IntegerField(null=True, blank=False)
    net_salary = models.DecimalField(max_digits=16, decimal_places=2,null=True, blank=True)
    salary_slip = models.FileField(upload_to='salary slip',null=True, blank=True)
    name = models.CharField(max_length=100, blank=True, null=True)
    tax = models.DecimalField(max_digits=3, decimal_places=2,null=True, blank=True)
    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True,null=True)
    updated = models.DateTimeField(verbose_name=('Updated'),auto_now=True,null=True)


    def __str__(self):
        if self.employee.full_name:
            return f"{self.employee.full_name}'s Salary"
        else:
            return f"{self.employee.email}'s Salary"

class Project(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, null=True, blank=False, related_name='project_user')
    project_name = models.CharField(max_length=255)
    employees = models.ManyToManyField(User_Profile, related_name='project_employees')
    
    def __str__(self):
        return self.project_name

class EmployeeAttendance(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE)
    is_in = models.BooleanField(default=False)
    in_time = models.DateTimeField(null=True, blank=True)
    is_out = models.BooleanField(default=False)
    out_time = models.DateTimeField(null=True, blank=True)
    day_type = models.CharField(max_length=20, null=True, blank=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False, null=True, blank=False)
    created = models.DateField(auto_now=False, auto_now_add=True, null=True, blank=False)

    def __str__(self):
        return self.employee.full_name

class Health_Benefit(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, null=True, blank=True)
    provider_name = models.CharField(max_length=255, null=True, blank=True)
    
    # other health insurance-related fields...

    def __str__(self):
        return f"{self.provider_name}"

class Feedback(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True,related_name='feedback_employee')
    feedback_text = models.TextField()
    created = models.DateTimeField(auto_now=False, auto_now_add=True, null=True, blank=False)

    def __str__(self):
        return f"{self.employee.full_name}'s Feedback"

class Training(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    trainer = models.CharField(max_length=100)
    title = models.CharField(max_length=255)
    description = models.TextField()
    date = models.DateField()
    time = models.TimeField()
    created = models.DateTimeField(auto_now=False, auto_now_add=True, null=True, blank=False)

    def __str__(self):
        return f"{self.user.organisation}'s Training & sessions"

class Subscription(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    plan = models.CharField(max_length=255, blank=True, null=True)
    created = models.DateTimeField(auto_now=False, auto_now_add=True, null=True, blank=True)

    def __str__(self):
        return f"{self.user.username}-{self.plan}"

class Notification(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    message = models.TextField(null=True, blank=True)
    organisation = models.CharField(max_length=200, null=True, blank=True)
    leave = models.IntegerField(blank=True, null=True)
    policy = models.CharField(max_length=50,blank=True, null=True)
    training = models.CharField(max_length=50,blank=True, null=True)
    employee = models.CharField(max_length=50,blank=True, null=True)
    notification_users = models.CharField(max_length=50, null=True, blank=True)
    created = models.DateTimeField(auto_now=False, auto_now_add=True, null=True, blank=True)

    def __str__(self):
        return self.message

class mark_read_notifications(models.Model):
    notif = models.ForeignKey(Notification, on_delete=models.CASCADE, blank=True, null=True)
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.notif.message

class privacy_policy(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    policy_text = RichTextField(null=True, blank=True)

class Handbook(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    equipments = models.JSONField(default=list)

CRITICALITY = (
    ('Low','Low'),
    ('Medium','Medium'),
    ('High','High'),
    ('Critical','Critical')
)

STATUS = (
    ('New','New'),
    ('Requested','Requested'),
    ('In Review','In Review'),
    ('Approved','Approved'),
    ('Active','Active'),
    ('Deprecated','Deprecated'),
    ('Disqualified','Disqualified')
)

class Vendor(models.Model):
    user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    name = models.CharField(max_length=100,null=True, blank=True)
    vendor_logo = models.FileField(upload_to='vendor logo',null=True, blank=True)
    website = models.URLField(null=True, blank=True)
    services = models.TextField(null=True, blank=True)
    internal_stakeholders = models.ManyToManyField(User_Profile, blank=True,null=True,related_name='company employees+')
    criticality = models.CharField(max_length=50,blank=True,null=True,choices=CRITICALITY)
    status = models.CharField(max_length=50,blank=True,null=True,choices=STATUS)
    complaint_with = models.CharField(max_length=200,blank=True,null=True)
    vendor_type = models.CharField(max_length=255,blank=True,null=True)

    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True,null=True)
    updated = models.DateTimeField(verbose_name=('Updated'),auto_now=True,null=True)


    def __str__(self):
        return self.name

class training_read(models.Model):
    training = models.ForeignKey(Training, on_delete=models.CASCADE, blank=True, null=True)
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True,null=True, blank=True)

class education_certeficates(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    education = models.FileField(upload_to="documents", blank=True, null=True)
    title = models.CharField(max_length=100, blank=True, null=True)


class employement_certeficates(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    employement = models.FileField(upload_to="documents", blank=True, null=True)
    title = models.CharField(max_length=100, blank=True, null=True)


class id_documents(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    id_document = models.FileField(upload_to="documents", blank=True, null=True)
    title = models.CharField(max_length=100, blank=True, null=True)


class criminal_documents(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    criminal = models.FileField(upload_to="documents", blank=True, null=True)
    title = models.CharField(max_length=100, blank=True, null=True)


class credit_documents(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    credit = models.FileField(upload_to="documents", blank=True, null=True)
    title = models.CharField(max_length=100, blank=True, null=True)


class background_check(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    employement = models.TextField(blank=True, null=True)
    employement_check = models.BooleanField(default=False,blank=True, null=True)
    education = models.TextField(blank=True, null=True)
    education_check = models.BooleanField(default=False,blank=True, null=True)
    id_documents = models.TextField(blank=True, null=True)
    id_check = models.BooleanField(default=False,blank=True, null=True)
    criminal_background = models.TextField(blank=True, null=True)
    crminal_check = models.BooleanField(default=False,blank=True, null=True)
    credit = models.TextField(blank=True, null=True)
    credit_check = models.BooleanField(default=False,blank=True, null=True)

    def __str__(self):
        return f"{self.employee.full_name}-background status"

class job_description(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    created = models.DateTimeField(verbose_name=('Created'),auto_now_add=True,null=True)

    def __str__(self):
        return f"{self.employee.full_name} job description"

class company_agreements(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    employee_handbook = models.FileField(upload_to='agreements',blank=True, null=True)
    title_employee_handbook = models.CharField(max_length=100, blank=True, null=True)
    confidential_agreement = models.FileField(upload_to='agreements',blank=True, null=True)
    title_confidential_agreement = models.CharField(max_length=100, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.employee.organisation}-agreement"

class employee_agreements(models.Model):
    employee = models.ForeignKey(User_Profile, on_delete=models.CASCADE, blank=True, null=True)
    confidential_agreement = models.FileField(upload_to='employee-agreements',blank=True, null=True)
    title_confidential_agreement = models.CharField(max_length=100, blank=True, null=True)
    is_sign = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.employee.full_name}-agreement"