from app.api import api
from app.models import EmiCalculation, EmiCalculationLock
from app.util import datetime_util
from app.util.util import get_or_none


class EmiCalculationAccessor:
    @classmethod
    def update_or_create(cls, application_id, loan_offer_id, tenure, upfront_from_customer, upfront_from_credit_fair,
                         emi_date, payable_by_customer, received_by_merchant, emi, interest_rate, processing_fee,
                         remaining_emi, advance_emi, subvention, subvention_cgst, subvention_sgst, subvention_igst,
                         net_loan_amount, annualised_irr, payment_frequency,
                         disbursement_method):
        time_now = datetime_util.get_now_ist_string()

        EmiCalculation.objects.update_or_create(
            application_id=application_id, defaults={
                "offer_id": loan_offer_id,
                "tenure": tenure,
                "emi": emi,
                "interest_rate": interest_rate,
                "remaining_emi": remaining_emi,
                "advance_emi": advance_emi,
                "subvention": subvention,
                "processing_fee": processing_fee,
                "upfront_from_customer": upfront_from_customer,
                "emi_date": emi_date,
                "received_by_merchant": received_by_merchant,
                "upfront_from_credit_fair": upfront_from_credit_fair,
                "payable_by_customer": payable_by_customer,
                "annualised_irr": annualised_irr,
                "payment_frequency": payment_frequency,
                "disbursement_method": disbursement_method,
                "irr_rate": 0,
                "rate": 0,
                "subvention_cgst": subvention_cgst,
                "subvention_sgst": subvention_sgst,
                "subvention_igst": subvention_igst,
                # "net_disbursement_amount": net_disbursement_amount,
                "net_loan_amount": net_loan_amount,
                "status": 1,
                "created_at": time_now,
                "updated_at": time_now
            })

        return api.SUCCESS

    @classmethod
    def get_emi_calculation(cls, application_id):
        return get_or_none(EmiCalculation, application_id=application_id)

    @classmethod
    def create_emi_calculation_lock_entry(cls, existing_offer, re_scheduled_by, approved_amount):
        time_now = datetime_util.get_now_ist_string()

        EmiCalculationLock.objects.create(
            application_id=existing_offer.application_id,
            offer_id=existing_offer.offer_id,
            tenure=existing_offer.tenure,
            emi=existing_offer.emi,
            interest_rate=existing_offer.interest_rate,
            remaining_emi=existing_offer.remaining_emi,
            advance_emi=existing_offer.advance_emi,
            subvention=existing_offer.subvention,
            processing_fee=existing_offer.processing_fee,
            upfront_from_customer=existing_offer.upfront_from_customer,
            emi_date=existing_offer.emi_date,
            received_by_merchant=existing_offer.received_by_merchant,
            upfront_from_credit_fair=existing_offer.upfront_from_credit_fair,
            payable_by_customer=existing_offer.payable_by_customer,
            annualised_irr=existing_offer.annualised_irr,
            payment_frequency=existing_offer.payment_frequency,
            irr_rate=0,
            rate=0,
            subvention_cgst=existing_offer.subvention_cgst,
            subvention_sgst=existing_offer.subvention_sgst,
            subvention_igst=existing_offer.subvention_igst,
            status=1,
            created_at=time_now,
            updated_at=time_now,
            re_scheduled_by=re_scheduled_by,
            re_scheduled_type=0,
            approved_amount=approved_amount
        )
