import { MaepluMirrorService } from "./maeplu-mirror.service";

function createService(overrides: Record<string, any> = {}) {
  const repository = {
    findOne: jest.fn(async () => null),
    insert: jest.fn(async () => ({ identifiers: [{ plu: "TLLP-00000001" }] })),
    ...overrides.repository,
  };

  const tenantAccessor = {
    repositoryFor: jest.fn(() => repository),
  };

  const service = new MaepluMirrorService(tenantAccessor as any);
  return { service, repository, tenantAccessor };
}

describe("MaepluMirrorService", () => {
  const producto = {
    plu: "TLLP-00000001",
    desclarga: "Mano de obra - cambio de balatas",
    precio: 250,
    costo: 0,
    iva: 12,
    pagaiva: true,
    esServicio: true,
    usainventario: false,
  };

  it("inserta el producto si el PLU no existe todavia en maeplu", async () => {
    const { service, repository } = createService();

    const result = await service.insertIfMissing(producto);

    expect(result).toEqual({ inserted: true });
    expect(repository.insert).toHaveBeenCalledWith({
      plu: "TLLP-00000001",
      desclarga: "Mano de obra - cambio de balatas",
      precio: 250,
      costo: 0,
      iva: 12,
      pagaiva: true,
      es_servicio: true,
      usainventario: false,
      es_taller: true,
      es_producto: true,
    });
  });

  it("no inserta si el PLU ya existe (idempotente)", async () => {
    const { service, repository } = createService({
      repository: { findOne: jest.fn(async () => ({ plu: "TLLP-00000001" })) },
    });

    const result = await service.insertIfMissing(producto);

    expect(result).toEqual({ inserted: false });
    expect(repository.insert).not.toHaveBeenCalled();
  });

  it("usa el precio como costo si el costo es 0 y no es servicio, para evitar el bloqueo de venta bajo costo", async () => {
    const { service, repository } = createService();

    await service.insertIfMissing({ ...producto, esServicio: false, costo: 0 });

    expect(repository.insert).toHaveBeenCalledWith(
      expect.objectContaining({ costo: 250 }),
    );
  });
});
