/**
 * @jest-environment jsdom
 */
import { PostOnboardingHubState } from "@ledgerhq/types-live";
import { renderHook } from "@testing-library/react";
import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
import { claimTestMock, personalizeTestMock, migrateAssetsTestMock } from "../mock";

import { usePostOnboardingHubState } from "./usePostOnboardingHubState";
jest.mock("./usePostOnboardingHubState");
jest.mock("react-redux", () => ({}));

const mockedUsePostOnboardingHubState = jest.mocked(usePostOnboardingHubState);

const mockedStateNoActions: PostOnboardingHubState = {
  deviceModelId: null,
  lastActionCompleted: null,
  actionsState: [],
  postOnboardingInProgress: false,
};

const mockedStateAllActionsCompleted: PostOnboardingHubState = {
  deviceModelId: null,
  lastActionCompleted: null,
  actionsState: [
    { ...claimTestMock, completed: true },
    { ...personalizeTestMock, completed: true },
    { ...migrateAssetsTestMock, completed: true },
  ],
  postOnboardingInProgress: false,
};

const mockedStateNoActionsCompleted: PostOnboardingHubState = {
  deviceModelId: null,
  lastActionCompleted: null,
  actionsState: [
    { ...claimTestMock, completed: false },
    { ...personalizeTestMock, completed: false },
    { ...migrateAssetsTestMock, completed: false },
  ],
  postOnboardingInProgress: false,
};

const mockedStateSomeActionsCompleted: PostOnboardingHubState = {
  deviceModelId: null,
  lastActionCompleted: null,
  actionsState: [
    { ...claimTestMock, completed: false },
    { ...personalizeTestMock, completed: true },
    { ...migrateAssetsTestMock, completed: false },
  ],
  postOnboardingInProgress: false,
};

describe("useAllPostOnboardingActionsCompleted", () => {
  it("should return true if no actions are present", () => {
    mockedUsePostOnboardingHubState.mockReturnValue(mockedStateNoActions);
    const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
    expect(result.current).toBe(true);
  });

  it("should return true if all actions are completed", () => {
    mockedUsePostOnboardingHubState.mockReturnValue(mockedStateAllActionsCompleted);
    const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
    expect(result.current).toBe(true);
  });

  it("should return false if some actions are completed", () => {
    mockedUsePostOnboardingHubState.mockReturnValue(mockedStateSomeActionsCompleted);
    const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
    expect(result.current).toBe(false);
  });

  it("should return false if no actions are completed", () => {
    mockedUsePostOnboardingHubState.mockReturnValue(mockedStateNoActionsCompleted);
    const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
    expect(result.current).toBe(false);
  });
});
