import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { render, screen, waitFor } from "@testing-library/react";
import AuthBranding from "@/components/auth/AuthBranding";
import type { ApiEnvelope } from "@/lib/api/types";
import type { ProviderStats } from "@/hooks/useProviderStats";
import { resetProviderStatsCache } from "@/hooks/useProviderStats";

vi.mock("@/lib/api", async (importOriginal) => {
  const actual = await importOriginal<typeof import("@/lib/api")>();
  return {
    ...actual,
    apiFetch: vi.fn(),
  };
});

import { apiFetch } from "@/lib/api";

function mockStatsSuccess(data: ProviderStats) {
  vi.mocked(apiFetch).mockImplementation(async (url, options) => {
    if (url !== "/provider/stats") {
      const envelope: ApiEnvelope = { key: "fail", msg: "" };
      return envelope;
    }

    const envelope: ApiEnvelope<ProviderStats> = {
      key: "success",
      msg: "",
      data,
    };
    options?.successCase?.(envelope);
    return envelope;
  });
}

describe("AuthBranding", () => {
  beforeEach(() => {
    vi.clearAllMocks();
    resetProviderStatsCache();
  });

  afterEach(() => {
    resetProviderStatsCache();
  });

  it("renders provider stats from the stats endpoint", async () => {
    mockStatsSuccess({
      rides_today: 210,
      profit_rate: 22,
      active_vehicles: 15,
    });

    render(<AuthBranding />);

    expect(await screen.findByText("+15")).toBeInTheDocument();
    expect(screen.getByText("22%")).toBeInTheDocument();
    expect(screen.getByText("210")).toBeInTheDocument();
    expect(screen.getByText("مركبات نشطة")).toBeInTheDocument();
    expect(screen.getByText("نسبة أرباحك")).toBeInTheDocument();
    expect(screen.getByText("رحلة اليوم")).toBeInTheDocument();

    expect(apiFetch).toHaveBeenCalledWith("/provider/stats", {
      method: "GET",
      successCase: expect.any(Function),
      errorCase: expect.any(Function),
    });
  });

  it("falls back to default stats when the stats request fails", async () => {
    vi.mocked(apiFetch).mockImplementation(async (url, options) => {
      if (url !== "/provider/stats") {
        return { key: "fail", msg: "" };
      }

      const envelope: ApiEnvelope = { key: "fail", msg: "تعذر الجلب" };
      options?.errorCase?.(envelope);
      return envelope;
    });

    render(<AuthBranding />);

    await waitFor(() => {
      expect(apiFetch).toHaveBeenCalledWith("/provider/stats", expect.any(Object));
    });

    expect(screen.getByText("+0")).toBeInTheDocument();
    expect(screen.getByText("—")).toBeInTheDocument();
    expect(screen.getByText("0")).toBeInTheDocument();
  });
});
