from app.models import PaymentTransactions, OnlinePayments
from app.api import api
from app.util import datetime_util


class PaymentTransactionAccessor:

    @classmethod
    def create_payment_transaction(
            cls, application_id, amount, emi_payment_id, mode, trasanction_id, paid_by, payment_date,
            payment_reconciliation_date, umrn, collected_by, collected_by_type, adjust_with_disbursement, wallet_name,
            reason, transaction_acknowledgement, status, payment_for, cf_transaction_id, bank_id):
        time_now = datetime_util.get_now_ist_string()

        return PaymentTransactions.objects.create(
            application_id=application_id,
            emi_payment_id=emi_payment_id,
            amount=amount,
            status=status,
            mode=mode,
            trasanction_id=trasanction_id,
            paid_by=paid_by,
            payment_date=payment_date,
            payment_reconciliation_date=payment_reconciliation_date,
            umrn=umrn,
            collected_by=collected_by,
            collected_by_type=collected_by_type,
            adjust_with_disbursement=adjust_with_disbursement,
            wallet_name=wallet_name,
            reason=reason,
            trasanction_acknowledgement=transaction_acknowledgement,
            payment_for=payment_for,
            cf_transaction_id=cf_transaction_id,
            bank_id=bank_id,
            created_at=time_now,
            updated_at=time_now,
        )

    @classmethod
    def create_online_payment(cls, application_id, status, amount, purpose, payment_link, payment_id):
        time_now = datetime_util.get_now_ist_string()

        return OnlinePayments.objects.create(
            application_id=application_id,
            amount=amount,
            status=status,
            purpose=purpose,
            payment_link=payment_link,
            payment_id=payment_id,
            created_at=time_now,
            updated_at=time_now,
        )

    @classmethod
    def update_order_id_in_transactions(cls, order_id, transactions):
        online_transactions = [transactions['online_processing_id'], transactions['online_advanced_id']]

        OnlinePayments.objects.filter(id__in=online_transactions).update(payment_id=order_id)

        return api.SUCCESS

    @classmethod
    def get_application_id_by_order_id(cls, order_id):
        payment_transaction = PaymentTransactions.objects.filter(trasanction_id=order_id).order_by(
            '-created_at').first()
        if payment_transaction:
            return payment_transaction.application_id
        else:
            return None

    @classmethod
    def check_payment_status(cls, application_id):
        # online_transaction = OnlinePayments.objects.filter(application_id=application_id).order_by(
        #     '-created_at').first()

        online_transaction = OnlinePayments.objects.filter(application_id=application_id, status='TXN_SUCCESS').first()

        if online_transaction:
            return online_transaction.status
        else:
            return "NOT_INITIATED"

    @classmethod
    def update_online_payment_transaction_status(cls, order_id, status):
        OnlinePayments.objects.filter(payment_id=order_id).update(
            status=status,
            payment_id=''
        )

        return api.SUCCESS
