import { screen, waitFor } from "@testing-library/react";
import { describe, expect, it, vi, beforeEach } from "vitest";
import RecoveredCustomersReport from "./RecoveredCustomersReport";
import { renderWithQueryClient as render } from "./test-utils";
import { ReportsAPI } from "@/apis/ReportsAPI";

vi.mock("@/apis/ReportsAPI", () => ({
  ReportsAPI: { getRecoveredCustomers: vi.fn() },
}));

const dateRange = { startDate: "2026-08-01", endDate: "2026-08-31" };

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

  it("muestra el loader mientras carga", () => {
    ReportsAPI.getRecoveredCustomers.mockReturnValue(new Promise(() => {}));
    render(<RecoveredCustomersReport companyId={1} dateRange={dateRange} onDataReady={vi.fn()} />);
    expect(document.querySelector(".animate-spin")).toBeTruthy();
  });

  it("muestra mensaje vacío cuando no hay clientes recuperados", async () => {
    ReportsAPI.getRecoveredCustomers.mockResolvedValue([]);
    render(<RecoveredCustomersReport companyId={1} dateRange={dateRange} onDataReady={vi.fn()} />);
    expect(await screen.findByText(/No hay clientes recuperados en este período/i)).toBeInTheDocument();
  });

  it("renderiza el detalle de clientes recuperados y notifica los datos exportables", async () => {
    const onDataReady = vi.fn();
    ReportsAPI.getRecoveredCustomers.mockResolvedValue([
      {
        idcustomer: 1,
        customer_name: "Carla Ruiz",
        campaign_name: "Reactivación Q3",
        seller_name: "Vendedora Dos",
        contact_generated_at: "2026-08-01T10:00:00",
        sale_date: "2026-08-05",
        sale_amount: 45000,
      },
      {
        idcustomer: 2,
        customer_name: "Diego Vera",
        campaign_name: "Reactivación Q3",
        seller_name: null,
        contact_generated_at: null,
        sale_date: null,
        sale_amount: 0,
      },
    ]);

    render(<RecoveredCustomersReport companyId={1} dateRange={dateRange} onDataReady={onDataReady} />);

    expect(await screen.findByText("Carla Ruiz")).toBeInTheDocument();
    expect(screen.getByText("$45,000")).toBeInTheDocument();

    await waitFor(() => expect(onDataReady).toHaveBeenCalled());
    expect(onDataReady.mock.calls[0][0].fileName).toBe("clientes-recuperados");
  });

  it("no consulta la API cuando no hay companyId", () => {
    render(<RecoveredCustomersReport companyId={undefined} dateRange={dateRange} onDataReady={vi.fn()} />);
    expect(ReportsAPI.getRecoveredCustomers).not.toHaveBeenCalled();
  });
});
