from decimal import Decimal

from django.conf import settings
from django.db import models


class PayrollSettings(models.Model):
    organization = models.OneToOneField("organizations.Organization", on_delete=models.CASCADE, related_name="payroll_settings")
    monthly_standard_hours = models.PositiveIntegerField(default=220)
    overtime_multiplier = models.DecimalField(max_digits=4, decimal_places=2, default=Decimal("1.40"))
    deduct_lateness = models.BooleanField(default=True)


class PayrollRun(models.Model):
    STATUSES = [("draft", "draft"), ("approved", "approved")]

    organization = models.ForeignKey("organizations.Organization", on_delete=models.CASCADE, related_name="payroll_runs")
    year = models.PositiveIntegerField()  # Jalali
    month = models.PositiveSmallIntegerField()
    status = models.CharField(max_length=10, choices=STATUSES, default="draft")
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name="+")
    approved_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.PROTECT, related_name="+")
    created_at = models.DateTimeField(auto_now_add=True)
    approved_at = models.DateTimeField(null=True, blank=True)
    # rates used for the calculation, frozen so an approved run never changes with the settings
    hourly_divisor = models.PositiveIntegerField(default=220)
    overtime_multiplier = models.DecimalField(max_digits=4, decimal_places=2, default=Decimal("1.40"))
    deduct_lateness = models.BooleanField(default=True)

    class Meta:
        ordering = ["-year", "-month"]
        constraints = [models.UniqueConstraint(fields=["organization", "year", "month"], name="unique_payroll_run_per_month")]


class PayrollItem(models.Model):
    run = models.ForeignKey(PayrollRun, on_delete=models.CASCADE, related_name="items")
    membership = models.ForeignKey("organizations.OrganizationMembership", on_delete=models.PROTECT, related_name="payroll_items")
    pay_type = models.CharField(max_length=10, default="monthly")  # copied from the contract
    unit_rate = models.BigIntegerField(default=0)  # contract amount per month / day / hour
    paid_days = models.PositiveIntegerField(default=0)  # daily pay: days paid (worked + paid leave)
    base_salary = models.BigIntegerField(default=0)  # the base earned for the month by this pay type
    worked_minutes = models.PositiveIntegerField(default=0)
    late_minutes = models.PositiveIntegerField(default=0)
    overtime_minutes = models.PositiveIntegerField(default=0)
    overtime_pay = models.BigIntegerField(default=0)
    late_deduction = models.BigIntegerField(default=0)
    additions = models.BigIntegerField(default=0)
    deductions = models.BigIntegerField(default=0)
    net = models.BigIntegerField(default=0)
    notes = models.CharField(max_length=300, blank=True, default="")

    class Meta:
        ordering = ["membership__user__name", "id"]
        constraints = [models.UniqueConstraint(fields=["run", "membership"], name="unique_payroll_item_per_member")]
