import { renderHook } from "@testing-library/react";
import { afterEach, beforeEach, expect, test, vi } from "vitest";

const mocks = vi.hoisted(() => ({
  appCode: "lalu",
  getDashboardUserProfileOverview: vi.fn(),
  queryFn: null,
  queryOptions: null,
  reload: vi.fn(),
  timeZone: "Asia/Shanghai"
}));

vi.mock("@/app/app-scope/AppScopeProvider.jsx", () => ({
  useAppScope: () => ({ appCode: mocks.appCode })
}));

vi.mock("@/app/timezone/TimeZoneProvider.jsx", () => ({
  useTimeZone: () => ({ timeZone: mocks.timeZone })
}));

vi.mock("@/features/dashboard/api", () => ({
  getDashboardUserProfileOverview: mocks.getDashboardUserProfileOverview
}));

vi.mock("@/shared/hooks/useAdminQuery.js", () => ({
  useAdminQuery: (queryFn, options) => {
    mocks.queryFn = queryFn;
    mocks.queryOptions = options;
    return { data: null, error: "", loading: false, reload: mocks.reload };
  }
}));

import { useDashboardPage } from "./useDashboardPage.js";

beforeEach(() => {
  mocks.appCode = "lalu";
  mocks.timeZone = "Asia/Shanghai";
  mocks.getDashboardUserProfileOverview.mockResolvedValue(null);
});

afterEach(() => {
  vi.restoreAllMocks();
  vi.clearAllMocks();
});

test("isolates the query by App and time zone and requests the current local day", async () => {
  const now = Date.UTC(2026, 6, 11, 2, 30, 0);
  vi.spyOn(Date, "now").mockReturnValue(now);
  const { rerender } = renderHook(() => useDashboardPage());

  expect(mocks.queryOptions.queryKey).toEqual(["dashboard", "user-profile-overview", "lalu", "Asia/Shanghai"]);
  expect(mocks.queryOptions.refetchInterval()).toBe(Date.UTC(2026, 6, 11, 16, 0, 1) - now);
  await mocks.queryFn();
  expect(mocks.getDashboardUserProfileOverview).toHaveBeenLastCalledWith({
    appCode: "lalu",
    endMs: now,
    startMs: Date.UTC(2026, 6, 10, 16, 0, 0),
    statTz: "Asia/Shanghai"
  });

  mocks.appCode = "huwaa";
  mocks.timeZone = "UTC";
  rerender();

  expect(mocks.queryOptions.queryKey).toEqual(["dashboard", "user-profile-overview", "huwaa", "UTC"]);
  expect(mocks.queryOptions.refetchInterval()).toBe(Date.UTC(2026, 6, 12, 0, 0, 1) - now);
  await mocks.queryFn();
  expect(mocks.getDashboardUserProfileOverview).toHaveBeenLastCalledWith({
    appCode: "huwaa",
    endMs: now,
    startMs: Date.UTC(2026, 6, 11, 0, 0, 0),
    statTz: "UTC"
  });
});
