import { describe, expect, it } from "vitest";

import {
  isAuthenticatedUser,
  resolveAuthenticatedNavigation,
  resolveRouteGuardRedirect,
} from "../navigation-resolver";
import { ROUTE_BUILDERS, ROUTES } from "../routes";

describe("navigation resolver", () => {
  it("treats only real login providers as authenticated users", () => {
    expect(isAuthenticatedUser("notLoggedIn")).toBe(false);
    expect(isAuthenticatedUser("guest")).toBe(false);
    expect(isAuthenticatedUser("email")).toBe(true);
    expect(isAuthenticatedUser("facebook")).toBe(true);
  });

  it("wraps protected navigation with auth redirect for guests", () => {
    expect(
      resolveAuthenticatedNavigation({
        loginStatus: "guest",
        targetUrl: "/subscription?type=vip",
      }),
    ).toBe(ROUTE_BUILDERS.authWithRedirect("/subscription?type=vip"));
  });

  it("keeps protected navigation targets for authenticated users", () => {
    expect(
      resolveAuthenticatedNavigation({
        loginStatus: "google",
        targetUrl: "/subscription?type=topup",
      }),
    ).toBe("/subscription?type=topup");
  });

  it("allows not logged in users to enter chat for guest bootstrap", () => {
    expect(
      resolveRouteGuardRedirect({
        loginStatus: "notLoggedIn",
        pathname: ROUTES.chat,
      }),
    ).toBeNull();
  });

  it("redirects not logged in session routes except chat to splash", () => {
    expect(
      resolveRouteGuardRedirect({
        loginStatus: "notLoggedIn",
        pathname: ROUTES.sidebar,
      }),
    ).toBe(ROUTES.splash);
  });

  it("redirects non-real users on subscription routes to auth", () => {
    expect(
      resolveRouteGuardRedirect({
        loginStatus: "guest",
        pathname: ROUTES.subscription,
        searchParams: "type=vip&returnTo=chat",
      }),
    ).toBe(
      ROUTE_BUILDERS.authWithRedirect(
        "/subscription?type=vip&returnTo=chat",
      ),
    );
  });

  it("allows public and authorized routes", () => {
    expect(
      resolveRouteGuardRedirect({
        loginStatus: "guest",
        pathname: ROUTES.coinsRules,
      }),
    ).toBeNull();
    expect(
      resolveRouteGuardRedirect({
        loginStatus: "email",
        pathname: ROUTES.subscription,
        searchParams: "type=vip",
      }),
    ).toBeNull();
  });
});
