from django.db import models
from django.utils import timezone
from organisations.models import Organisation
from django.conf import settings
from customers.models import *
from ledgers.models import SystemTransactions, OrganisationSubAccount
from savings.models import *

class SharesSettings(models.Model):
    minimum_shares = models.IntegerField(default=0)
    share_value = models.FloatField(default=0.0)
    maximum_share_percent = models.IntegerField(default=0)
    share_capped_value = models.IntegerField(default=0)
    share_setting_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_setting_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    organisation =  models.ForeignKey(Organisation, on_delete=models.CASCADE, related_name='organisation_shares_settings')
    share_dividends_chart = models.ForeignKey(OrganisationSubAccount, on_delete=models.CASCADE, related_name='share_dividends_chart')
    transfer_charge = models.FloatField(default=0.0, null=True, blank=True)
    transfer_charge_chart = models.ForeignKey(OrganisationSubAccount, on_delete=models.SET_NULL, null=True, blank=True, related_name='share_transfer_charge_chart')

    class Meta:
        unique_together = ('organisation',)
        db_table = 'public\".\"shares_setting'

class ShareHolders(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer_holder')
    share_holder_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_holder_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)

    class Meta:
        unique_together = ('customer',)
        db_table = 'public\".\"share_holders'

class SharesTransaction(models.Model):
    TRANS_TYPE = (('purchase', 'Purchase'),
        ('transfer-in', 'Transfer'),
        ('transfer-out', 'Transfer'),
        ('withdrawal', 'Withdrawal'),
        )
    shareholder = models.ForeignKey(ShareHolders, on_delete=models.CASCADE, related_name='shareholder')
    share_holder_trans_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_holder_trans_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    no_of_shares = models.FloatField(default=0.0)
    current_share_value = models.FloatField(default=0.0)
    transaction_type =  models.CharField(max_length=50, choices=TRANS_TYPE)
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='organisation_branch_share')
    is_deleted =  models.BooleanField(default=False)
    system_transaction =  models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='shares_system_trasactions')
    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_shares_1')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"shares_transaction'

class GroupShareTransaction(models.Model):
    shares = models.ForeignKey(SharesTransaction, on_delete=models.CASCADE, related_name='share_transaction')
    membership  = models.ForeignKey(GroupMembership, on_delete=models.CASCADE, related_name='group_share_membership')
    date_added  = models.DateTimeField(default = timezone.now)

    class Meta:
        db_table = 'public\".\"group_share_transaction'

class SharesTransfer(models.Model):
    from_customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='from_customer')
    to_customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='to_customer')
    share_transfer_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_transfer_added_by')
    organisation_branch_loosing =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='organisation_branch_loosing')
    organisation_branch_receiving =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='organisation_branch_receiving')
    transfering_share_transaction = models.ForeignKey(SharesTransaction, on_delete=models.CASCADE, related_name='transfering_share_transaction')
    receiving_share_transaction = models.ForeignKey(SharesTransaction, on_delete=models.CASCADE, related_name='receiving_share_transaction')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)

    class Meta:
        db_table = 'public\".\"shares_transfer'

class ShareDividends(models.Model):
    STATUS = (('pending', "pending"),
        ('approved', 'approved'),
        ('shared', 'shared'),
        )
    start_date = models.DateTimeField(default = timezone.now)
    end_date = models.DateTimeField(default = timezone.now)
    bought_shares_by = models.DateTimeField(default = timezone.now)
    dividends_to_savings =  models.FloatField(default=0.0)
    dividends_to_shares = models.FloatField(default=0.0)
    shares_cap_shares = models.FloatField(default=0.0)
    share_flat_amount = models.FloatField(default=0.0)
    with_full_share_value = models.CharField(max_length=20, default='no')
    profits_shared = models.FloatField(default=0.0)
    share_dividend_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_dividend_added_by')
    status =  models.CharField(max_length=50, choices=STATUS, default='approved')
    organisation_branch =  models.ForeignKey(OrganisationBranch, on_delete=models.CASCADE, related_name='organisation_branch_share_dividends')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = 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_share_dividends')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"share_dividends'

class ShareDividendCustomers(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='customer_dividend')
    share_dividend = models.ForeignKey(ShareDividends, on_delete=models.CASCADE, related_name='share_dividend')
    converted_to_savings = models.FloatField(default=0.0)
    converted_to_shares = models.FloatField(default=0.0)
    total_dividends = models.FloatField(default=0.0)
    share_dividend_customer_added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='share_dividend_customer_added_by')
    date_added = models.DateTimeField(default = timezone.now)
    last_updated = models.DateTimeField(default = timezone.now)
    status =  models.CharField(max_length=50, default='pending')
    saving_account = models.ForeignKey(SavingAccount, on_delete=models.CASCADE, related_name='share_dividend_saving_account', null=True, blank=True)
    shares_transaction = models.ForeignKey(SharesTransaction, on_delete=models.CASCADE, related_name='shares_transaction_details', null=True, blank=True)
    system_transaction_savings = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='system_transaction_savings', null=True, blank=True)
    system_transaction_shares = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='system_transaction_shares', null=True, blank=True)
    system_transaction_tax = models.ForeignKey(SystemTransactions, on_delete=models.CASCADE, related_name='system_transaction_tax', null=True, blank=True)
    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_share_dividend_customers')
    deleted_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        db_table = 'public\".\"share_dividend_customers'