import { shallowMount } from "@vue/test-utils";
import InsuranceCompany from "@/layouts/insurance-company/insurance-company.vue";
import { applicationConfig } from "@/constants/application-config.js";
import store from "@/store";
import baseMixin from "@/mixins/base-mixin.js";

jest.mock("@/store", () => ({
    getters: {
        order: {
            payment: {
                parentAccountNumber: "12345",
            },
        },
    },
}));

var mockRouter = {
    navigateWithoutSaving: jest.fn(),
};

jest.mock("@/mixins/base-mixin.js", () => ({
    methods: {
        navigateWithoutSaving: jest.fn(),
    },
    data() {
        return {
            navigationScenarios: {
                CLICKED_BACK: "clicked_back",
            },
        };
    },
}));

describe("insurance-company.vue", () => {
    beforeEach(() => {
        // Reset the store's parentAccountNumber before each test
        store.getters.order.payment.parentAccountNumber = "12345";
    });

    test("should return true when parentAccountNumber matches CASH_PARENT_ACCOUNT_NUMBER", () => {
        applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345";
        const wrapper = shallowMount(InsuranceCompany, {
            global: {
                mocks: {
                    $store: store,
                },
            },
        });

        expect(wrapper.vm.isCashParentAccountNumber()).toBe(true);
    });

    test("should return false when parentAccountNumber does not match CASH_PARENT_ACCOUNT_NUMBER", () => {
        applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345";
        store.getters.order.payment.parentAccountNumber = "67890";
        const wrapper = shallowMount(InsuranceCompany, {
            global: {
                mocks: {
                    $store: store,
                },
            },
        });

        expect(wrapper.vm.isCashParentAccountNumber()).toBe(false);
    });

    test("should call navigateWithoutSaving with { isCashSelected: true } when forceCashSelection is true", () => {
        const wrapper = shallowMount(InsuranceCompany, {
            global: {
                mocks: {
                    $store: store,
                    $router: mockRouter,
                },
                mixins: [baseMixin],
            },
        });

        wrapper.vm.backButtonAction(true);
        expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith(
            wrapper.vm.navigationScenarios.CLICKED_BACK,
            wrapper.vm.$route,
            { isCashSelected: true }
        );
    });

    test("should call navigateWithoutSaving with no extra parameter when forceCashSelection is false", () => {
        const wrapper = shallowMount(InsuranceCompany, {
            global: {
                mocks: {
                    $store: store,
                    $router: mockRouter,
                },
                mixins: [baseMixin],
            },
        });
        wrapper.vm.backButtonAction(false);
        expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith(
            wrapper.vm.navigationScenarios.CLICKED_BACK,
            wrapper.vm.$route
        );
    });
});
