import React from 'react';
import { Modal, useToast } from '@theorchard/suite-components';
import { useUpdateAbacusState } from 'src/apollo/mutations/abacus-state';
import { useDeleteAccountPayeeKycNotificationMutation } from 'src/apollo/mutations/delete-account-payee-kyc-notification';
import { useReleaseAbacusAccountPayeeHook } from 'src/apollo/mutations/release-abacus-account-payee';
import { getAccountFullDetail } from 'src/apollo/queries/account';
import { ABACUS_ACTION_STATUSES } from '@theorchard/accounting-apps-shared';

interface RejectBankingDetailsModalProps {
    accountId: string;
    accountPayeeId: string;
    isOpen: boolean;
    setIsOpen: (open: boolean) => void;
    bankingDetailsReviewStateId?: string;
    paymentEligibilityStateId?: string;
}

const RejectBankingDetailsModal: React.FC<RejectBankingDetailsModalProps> = ({
    accountId,
    accountPayeeId,
    isOpen,
    setIsOpen,
    bankingDetailsReviewStateId,
    paymentEligibilityStateId,
}) => {
    const toast = useToast();

    const closeModal = () => {
        setIsOpen(false);
    };

    const { releaseAccountPayee, loading: releaseAccountPayeeMutationLoading } =
        useReleaseAbacusAccountPayeeHook();

    const {
        deleteAccountPayeeKycNotification: deleteKycNotification,
        loading: deleteKycNotificationLoading,
    } = useDeleteAccountPayeeKycNotificationMutation();

    const { updateAbacusState, loading: updateAbacusStateLoading } =
        useUpdateAbacusState([
            { query: getAccountFullDetail, variables: { accountId } },
        ]);

    const onConfirm = async () => {
        if (
            !releaseAccountPayee ||
            !bankingDetailsReviewStateId ||
            !paymentEligibilityStateId
        ) {
            return;
        }

        const updatePaymentEligibilityStateVariables = {
            abacusStateId: paymentEligibilityStateId,
            actionStatus: ABACUS_ACTION_STATUSES.INIT,
        };

        const updateBankingDetailsReviewStateVariables = {
            abacusStateId: bankingDetailsReviewStateId,
            actionStatus: ABACUS_ACTION_STATUSES.REJECTED,
            message: 'Rejected upon request',
        };

        try {
            const releaseResult = await releaseAccountPayee({
                variables: { accountPayeeId },
            });

            if (!releaseResult?.data) {
                toast('Failed to release Account Payee from Payoneer', {
                    variant: 'error',
                });
                return;
            }

            const deleteResult = await deleteKycNotification({
                variables: { accountPayeeId },
            });

            if (
                !deleteResult?.data?.deleteAccountPayeeKycNotification?.deleted
            ) {
                toast('Failed to delete KYC notification', {
                    variant: 'error',
                });
                return;
            }

            const updatePaymentEligibilityResult = await updateAbacusState({
                variables: updatePaymentEligibilityStateVariables,
            });

            const updateBankingDetailsReviewResult = await updateAbacusState({
                variables: updateBankingDetailsReviewStateVariables,
            });

            if (
                !updateBankingDetailsReviewResult.data ||
                !updatePaymentEligibilityResult?.data
            ) {
                toast('Failed to update abacus state', {
                    variant: 'error',
                });
                return;
            }

            toast('Bank details rejected successfully');
            closeModal();
        } catch (err) {
            const errorMessage = (err as Error).message || 'Unknown error';

            toast(
                `Unexpected error while rejecting bank details: ${errorMessage}`,
                {
                    variant: 'error',
                }
            );
        }
    };

    return (
        <Modal
            isOpen={isOpen}
            onRequestClose={closeModal}
            title="Are you sure?"
            confirmDisabled={
                !bankingDetailsReviewStateId ||
                !paymentEligibilityStateId ||
                releaseAccountPayeeMutationLoading ||
                deleteKycNotificationLoading ||
                updateAbacusStateLoading
            }
            onConfirm={onConfirm}
            confirmTitle="Yes, reject"
            confirmVariant="danger"
        >
            Warning: this will reset all banking onboarding for this Account. Do
            you want to continue?
        </Modal>
    );
};

export default RejectBankingDetailsModal;
