from finance_and_accounting.models import Deposit, Expense
from sales_and_marketing.models import CustomerOrder
from system_administration.utils import calculate_asset_depreciation, calculate_closing_inventory_value, calculate_product_cost_of_opening_inventory, calculate_purchase_order_value_for_the_year


def get_previous_order_payments_value(order_instance):
    customer_order_payments = order_instance.customer_order_payments.filter(
        recycle_bin=False)
    total_payments_value = 0.00
    if customer_order_payments is not None:
        for order_payment in customer_order_payments:
            total_payments_value += float(order_payment.payment_amount)
    return total_payments_value


def get_financial_year_net_income_values(current_year):
    current_year_gross_sales = CustomerOrder.objects.filter(
        recycle_bin=False, customer_order_approved=True, created_on__year=current_year)
    gross_sales = 0.00
    vehicle_and_equipment_lease_revenue = 0.00
    for sale in current_year_gross_sales:
        gross_sales += float(
            sale.customer_order_total_net_value.replace(",", ""))
    # vehicle and equipment lease
    current_year_vehicle_and_equipment_lease_revenue = Deposit.objects.filter(
        recycle_bin=False, deposit_source="vehicle_and_equipment_lease_revenue", created_on__year=current_year)
    for vehicle_and_equipment_lease in current_year_vehicle_and_equipment_lease_revenue:
        vehicle_and_equipment_lease_revenue += float(
            vehicle_and_equipment_lease.deposit_amount.replace(",", ""))
    # cost of goods sold
    # cogs = Opening Inventory+Purchases During the Year−Closing Inventory
    # current year
    opening_inventory_value = calculate_product_cost_of_opening_inventory(
        current_year-1,)
    purchase_value_for_current_year = calculate_purchase_order_value_for_the_year(
        current_year)
    closing_inventory_value = calculate_closing_inventory_value(
        current_year)
    # calculate expenses
    financial_year_operational_expenses = 0.0
    financial_year_interest_expenses = 0.0
    financial_year_tax_and_licence_expenses = 0.0
    financial_year_salary_and_remuneration_expenses = 0.0
    all_expenses_for_financial_year = Expense.objects.filter(
        recycle_bin=False, created_on__year=current_year)
    for expense in all_expenses_for_financial_year:
        if expense.expense_type == "loan_repayment_expense":
            financial_year_interest_expenses += float(
                expense.expense_amount.replace(",", ""))
        elif expense.expense_type == "tax_and_license_expense":
            financial_year_tax_and_licence_expenses += float(
                expense.expense_amount.replace(",", ""))
        elif expense.expense_type == "salary_expense":
            financial_year_salary_and_remuneration_expenses += float(
                expense.expense_amount.replace(",", ""))
        else:
            if expense.expense_type != "purchase_expense":
                financial_year_operational_expenses += float(
                    expense.expense_amount.replace(",", ""))
    # depreciation and armotization
    depreciation_and_armotization_cost = calculate_asset_depreciation(
        current_year)
    payload = {}
    payload["gross_sales"] = str(gross_sales)
    payload["vehicle_and_equipment_lease_revenue"] = str(
        vehicle_and_equipment_lease_revenue)
    payload["opening_inventory_value"] = str(
        opening_inventory_value)
    payload["purchase_value_for_current_year"] = str(
        purchase_value_for_current_year)
    payload["closing_inventory_value"] = str(
        closing_inventory_value)
    payload["financial_year_operational_expenses"] = str(
        financial_year_operational_expenses)
    payload["financial_year_interest_expenses"] = str(
        financial_year_interest_expenses)
    payload["financial_year_tax_and_licence_expenses"] = str(
        financial_year_tax_and_licence_expenses)
    payload["financial_year_salary_and_remuneration_expenses"] = str(
        financial_year_salary_and_remuneration_expenses)
    payload["depreciation_and_armotization_cost"] = str(
        depreciation_and_armotization_cost)
    return payload


def get_expenses_in_types(current_year):
    all_expenses_for_financial_year = Expense.objects.filter(
        recycle_bin=False, created_on__year=current_year)
    allowable_expenses = 0.0
    non_allowable_expenses = 0.0
    for expense in all_expenses_for_financial_year:
        if expense.expense_type == "entertainment_and_private_expense" or expense.expense_type == "other":
            non_allowable_expenses += float(
                expense.expense_transaction.transaction_amount.replace(",", ""))*float(
                expense.expense_transaction.exchange_rate.replace(",", ""))
        else:
            allowable_expenses += float(
                expense.expense_transaction.transaction_amount.replace(",", ""))*float(
                expense.expense_transaction.exchange_rate.replace(",", ""))
    return allowable_expenses, non_allowable_expenses
