from django.conf import settings

from app.api import api
from app.payment.accessor.lotus_pay_accessor import LotusPayAccessor
from app.payment.accessor.mandate_accessor import MandateAccessor
from app.payment.accessor.payment_accessor import PaymentTransactionAccessor
from app.util.datetime_util import today
from app.util import util


class Payment:
    MODE_NET_BANKING = 'NET_BANKING'
    MODE_DEBIT_CARD = 'DEBIT_CARD'
    MODE_UPI = 'UPI'

    def __init__(self, payment):
        self.payment = payment

    @classmethod
    def get_mandate_setup_link(cls, date_first_collection, date_final_collection, amount_maximum, ifsc_code,
                               debtor_account_name, debtor_account_number, debtor_account_type, frequency, redirect_url,
                               transaction_id):

        if not redirect_url:
            redirect_url = f"{settings.MANDATE_REDIRECT_FRONTEND_HOME_URL}"

        status, response = LotusPayAccessor.create_mandate(
            date_first_collection=date_first_collection, date_final_collection=date_final_collection,
            amount_maximum=amount_maximum, ifsc_code=ifsc_code, debtor_account_name=debtor_account_name,
            debtor_account_number=debtor_account_number, debtor_account_type=debtor_account_type,
            frequency=frequency, redirect_url=redirect_url, transaction_id=transaction_id)

        if util.is_status_failed(status):
            return status, None

        return api.SUCCESS, response['url']

    @classmethod
    def create_mandate(cls, application_id, approved_amount, emi_date, date_final_collection):
        return MandateAccessor.create_mandate(
            application_id=application_id, frequency='O', status='inactive', mandate_id='', collection='N',
            until_cancelled=1, mode="lotuspay_emandate", action='N', monthly_frequency=1,
            mandate_amount=approved_amount, date_first_collection=emi_date, date_final_collection=date_final_collection)

    @classmethod
    def update_mandate_url(cls, application_id, mandate_url):
        return MandateAccessor.update_mandate_url(application_id=application_id, mandate_url=mandate_url)

    @classmethod
    def create_payment_transaction(cls, application_id, amount, mode, transaction_id, payment_for,
                                   cf_transaction_id, bank_id):
        return PaymentTransactionAccessor.create_payment_transaction(
            application_id=application_id, amount=amount, emi_payment_id=0, mode=mode, trasanction_id=transaction_id,
            paid_by="", payment_date=today(), payment_reconciliation_date=today(), umrn='', collected_by='',
            collected_by_type=1, adjust_with_disbursement=0, wallet_name='', reason='',
            transaction_acknowledgement='', payment_for=payment_for, cf_transaction_id=cf_transaction_id,
            bank_id=bank_id, status='PENDING')

    @classmethod
    def create_online_payment(cls, application_id, amount, payment_for, payment_link, payment_id):
        return PaymentTransactionAccessor.create_online_payment(
            application_id=application_id, status='PENDING', amount=amount, payment_id=payment_id,
            purpose=payment_for, payment_link=payment_link)

    @classmethod
    def get_application_id_by_order_id(cls, order_id):
        return PaymentTransactionAccessor.get_application_id_by_order_id(order_id)

    @classmethod
    def check_mandate_setup_status(cls, application_id):
        return MandateAccessor.check_mandate_setup_status(application_id)

    @classmethod
    def check_payment_status(cls, application_id):
        return PaymentTransactionAccessor.check_payment_status(application_id)

    @classmethod
    def update_online_payment_transaction_status(cls, order_id, status):
        return PaymentTransactionAccessor.update_online_payment_transaction_status(order_id, status)

    @classmethod
    def update_order_id_in_transactions(cls, order_id, transactions):
        return PaymentTransactionAccessor.update_order_id_in_transactions(order_id, transactions)
