from shares.models import *
from loans.models import LoanApplicationWithHold
from django.db.models import Sum

def get_client_shares_balance(customer, as_at=None):
    # print("customer ******************: "+str(customer))
    transaction_types = ['transfer-out', 'withdrawal']
    obj = ShareHolders.objects.filter(customer=customer).first()

    filter_1 = { "shareholder":obj, "transaction_type__in":transaction_types }
    if as_at:
        filter_1['system_transaction__record_date__date__lte'] = as_at
    share_out_transaction = SharesTransaction.objects.filter(**filter_1).aggregate(total_no_of_shares=Sum('no_of_shares'))
    total_no_of_shares_out = share_out_transaction['total_no_of_shares'] if share_out_transaction['total_no_of_shares'] else 0

    # print("****************** number of shares "+ str(total_no_of_shares_out))
    # print("+++++++++++++++++++++ as at "+str(as_at))

    # withheld shares
    filter_2 = { "loan_application__customer":customer, "status":'held', "hold_type":'shares' }
    if as_at:
        filter_2['date_added__date__lte'] = as_at
    withheld_shares = LoanApplicationWithHold.objects.filter(**filter_2).aggregate(total_held_shares=Sum('amount'))
    total_held_shares = withheld_shares['total_held_shares'] if withheld_shares['total_held_shares'] else 0

    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~: "+ str(withheld_shares['total_held_shares']))

    # include withheld share on shares out
    total_no_of_shares_out = total_no_of_shares_out + total_held_shares

    transaction_types = ['transfer-in', 'purchase']
    filter_3 = { "shareholder":obj, "transaction_type__in":transaction_types }
    if as_at:
        filter_3['system_transaction__record_date__date__lte'] = as_at
    all_shares_transaction = SharesTransaction.objects.filter(**filter_3).aggregate(total_no_of_shares=Sum('no_of_shares'))
    all_total_no_of_shares = all_shares_transaction['total_no_of_shares'] if all_shares_transaction['total_no_of_shares'] else 0

    # get current share value
    print("++++++++++++++++++++++++++++++++++++++++ 1")
    print(all_total_no_of_shares)
    print(total_no_of_shares_out)
    print("++++++++++++++++++++++++++++++++++++++++ 2")
    share = SharesSettings.objects.filter(organisation=customer.customer_branch.branch_organisation).first()
    if share:
        no_of_shares = (all_total_no_of_shares - total_no_of_shares_out)
        return {"total_share_value": share.share_value * no_of_shares , "share_value":share.share_value, "no_of_shares": no_of_shares, "all_total_no_of_shares": no_of_shares + total_held_shares, "all_total_share_value":share.share_value * (no_of_shares + total_held_shares)}
    return False
