import * as fs from "fs";
import * as path from "path";
import { ReadonlyRepository } from "../common/readonly-repository";

// maeplu es solo lectura — pagaiva alimenta facturacion, cualquier escritura
// accidental corrompe datos de produccion. Esta prueba falla si:
// 1) el codigo fuente de productos.service.ts vuelve a llamar save/insert/
//    update/delete/remove/upsert sobre el repositorio ERP, o
// 2) ReadonlyRepository alguna vez expone esos metodos.
describe("maeplu (ERP) es estrictamente de solo lectura", () => {
  const FORBIDDEN = ["save", "insert", "update", "delete", "remove", "upsert"];

  it("productos.service.ts no llama a ningun metodo de escritura sobre erpProductoRepository", () => {
    const source = fs.readFileSync(
      path.join(__dirname, "productos.service.ts"),
      "utf8",
    );

    for (const method of FORBIDDEN) {
      const pattern = new RegExp(`erpProductoRepository\\s*\\.\\s*${method}\\s*\\(`);
      expect(source).not.toMatch(pattern);
    }
  });

  it("ReadonlyRepository no expone metodos de escritura", () => {
    const instance = new ReadonlyRepository<any>({} as any);
    for (const method of FORBIDDEN) {
      expect((instance as any)[method]).toBeUndefined();
    }
  });

  it("ReadonlyRepository.query rechaza cualquier cosa que no sea SELECT/SHOW", () => {
    const instance = new ReadonlyRepository<any>({} as any);
    expect(() => instance.query("UPDATE maeplu SET pagaiva = '1'")).toThrow(
      /solo permite SELECT\/SHOW/,
    );
    expect(() => instance.query("DELETE FROM maeplu WHERE plu = '1'")).toThrow(
      /solo permite SELECT\/SHOW/,
    );
  });
});
