from django.db import models
from organisations.models import *
from ledgers.models import OrganisationSubAccount
from ledgers.models import *
from ledgers.models import SystemTransactions
from organisations.models import *
from savings.models import *

# Create your models here.


class OverDraftProducts(models.Model):
    CHARGE_TYPE = (
        ("percentage", "Percentage"),
        ("flat", "Flat"),
    )

    product_name = models.CharField(max_length=255)
    max_draft_amount = models.FloatField(null=False, default=0)
    charge_rate = models.FloatField(null=False, default=0)
    charge_type = models.CharField(max_length=100, choices=CHARGE_TYPE)
    penalty_rate = models.FloatField(null=False, default=0)
    penalty_type = models.CharField(max_length=100, choices=CHARGE_TYPE)
    penalty_interval = models.IntegerField(null=False, default=24)
    penalty_grace_period = models.IntegerField(null=False, default=0)
    maximum_draft_period = models.IntegerField(null=False, default=0)
    withdraw_allowance_period = models.IntegerField(null=False, default=0)
    organisation = models.ForeignKey(
        Organisation,
        on_delete=models.CASCADE,
        related_name="organisation_over_draft_product",
    )
    penalty_income_chart = models.ForeignKey(
        OrganisationSubAccount,
        on_delete=models.CASCADE,
        related_name="penalty_income_type",
        null=False,
        blank=False,
    )
    interest_income_chart = models.ForeignKey(
        OrganisationSubAccount,
        on_delete=models.CASCADE,
        related_name="interest_income_type",
        null=False,
        blank=False,
    )
    expense_account = models.ForeignKey(
        OrganisationSubAccount,
        on_delete=models.CASCADE,
        related_name="expense_account",
        null=False,
        blank=False,
    )
    over_draft_product_added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_product_added_by",
    )
    over_draft_product_last_updated_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_product_last_updated_by",
        null=True,
        blank=True,
    )
    date_added = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    is_deleted = models.BooleanField(default=False)

    class Meta:
        db_table = 'public"."saving_over_draft_product'

    def __str__(self):
        return self.product_name


class OverDrafts(models.Model):
    STATUSES = (
        ("in-progress", "In Progress"),
        ("closed", "closed"),
        ("terminated", "Terminated"),
        ("cancelled", "Cancelled"),
    )
    CHARGE_TYPE = (
        ("percentage", "Percentage"),
        ("flat", "Flat"),
    )
    status = models.CharField(max_length=100, default="in-progress", choices=STATUSES)
    auto_close = models.BooleanField(default=True)
    auto_payments = models.BooleanField(default=True)
    over_draft_product = models.ForeignKey(
        OverDraftProducts,
        on_delete=models.CASCADE,
        related_name="over_draft_product",
        null=False,
        blank=False,
    )
    over_draft_period = models.IntegerField(null=False, default=0)
    withdraw_allowance_period = models.IntegerField(null=False, default=0)
    amount = models.FloatField(null=False, default=0)
    charge_rate = models.FloatField(null=False, default=0)
    charge_type = models.CharField(max_length=100, choices=CHARGE_TYPE, default="flat")
    penalty_rate = models.FloatField(null=False, default=0)
    penalty_type = models.CharField(max_length=100, choices=CHARGE_TYPE, default="flat")
    penalty_interval = models.IntegerField(null=False, default=24)
    penalty_grace_period = models.IntegerField(null=False, default=0)
    branch = models.ForeignKey(
        OrganisationBranch,
        on_delete=models.CASCADE,
        related_name="over_draft_branch",
        null=False,
        blank=False,
    )
    saving_account = models.ForeignKey(
        SavingAccount,
        on_delete=models.CASCADE,
        related_name="over_draft_saving_account",
    )
    over_draft_added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_added_by",
    )
    over_draft_last_updated_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_last_updated_by",
        null=True,
        blank=True,
    )
    reference_transaction = models.ForeignKey(
        SystemTransactions,
        on_delete=models.CASCADE,
        related_name="over_draft_transaction",
        null=False,
        blank=False,
    )
    date_added = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    transaction_date = models.DateTimeField(default=timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_overdraft_1')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public"."saving_over_draft'


class OverDraftPayment(models.Model):
    principal_paid = models.FloatField(default=0.0)
    interest_paid = models.FloatField(default=0.0)
    penalty_paid = models.FloatField(default=0.0)
    over_draft = models.ForeignKey(
        OverDrafts,
        on_delete=models.CASCADE,
        related_name="over_draft_payment_over_draft",
    )
    transaction = models.ForeignKey(
        SystemTransactions,
        on_delete=models.CASCADE,
        related_name="over_draft_payment_transaction",
        null=False,
        blank=False,
    )
    added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_payment_added_by",
        null=True,
        blank=True,
    )
    last_updated_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="over_draft_payment_updated_by",
        null=True,
        blank=True,
    )
    date_added = models.DateTimeField(default=timezone.now)
    last_updated = models.DateTimeField(default=timezone.now)
    transaction_type = models.CharField(max_length=55, default="manual")
    status = models.CharField(max_length=50, default="in-progress")
    closing_date = models.DateTimeField(default=timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_records_overdraft_2')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public"."over_draft_payment'


class OverDraftPaymentWrittenOff(models.Model):
    over_draft = models.ForeignKey(
        OverDrafts, on_delete=models.CASCADE, related_name="principal_loss_post"
    )
    transaction = models.ForeignKey(
        SystemTransactions,
        on_delete=models.CASCADE,
        related_name="principal_loss_transaction",
        null=False,
        blank=False,
    )
    date_added = models.DateTimeField(default=timezone.now)
    closing_date = models.DateTimeField(default=timezone.now)
    deleted = models.BooleanField(default=False)
    deleted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name='deleted_overdraft_written_off')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public"."over_draft_payment_written_off'
