import { MigrationInterface, QueryRunner } from "typeorm";

// Los dos PLU del ERP bajo los que se factura lo que se crea en el taller
// (TLLP- y MANUAL-): POSTouch no conoce esos PLU, asi que en la factura sale
// una linea de productos y una de servicios con la suma de cada grupo. El
// catalogo de taller_parametros usa estos mismos codigos como valor por
// defecto de facturacion_pos.plu_productos_taller / plu_servicios_taller
// (una prueba verifica que no se desalineen).
//
// Sin inventario ni existencias: son para vender una vez. El producto lleva un
// costo simbolico porque POSTouch, con la tienda en "no permitir precio bajo
// costo", rechaza un producto (no servicio) con costo 0.
export const PLU_GENERICOS_TALLER = [
  { plu: "TALLER-PROD", descripcion: "PRODUCTOS VARIOS", esServicio: "N", costo: 0.01 },
  { plu: "TALLER-SERV", descripcion: "SERVICIOS VARIOS", esServicio: "S", costo: 0 },
] as const;

// maeplu y detuni son tablas del ERP: aqui solo se INSERTA, y unicamente si el
// PLU no existe. Si el tenant no tiene esas tablas (o les faltan columnas) no
// se hace nada: sin ERP no hay facturacion POS que atender.
export class CrearPluGenericosTaller1781500000000 implements MigrationInterface {
  name = "CrearPluGenericosTaller1781500000000";

  public async up(queryRunner: QueryRunner): Promise<void> {
    const maeplu = await queryRunner.getTable("maeplu");
    const detuni = await queryRunner.getTable("detuni");
    if (!maeplu || !detuni) return;

    const tiene = (tabla: typeof maeplu, columnas: string[]) =>
      columnas.every((c) => Boolean(tabla.findColumnByName(c)));

    if (!tiene(maeplu, ["plu", "desclarga", "precio", "costo", "iva", "pagaiva", "es_servicio", "usainventario"])) return;
    if (!tiene(detuni, ["plu", "unidad", "precio", "costo", "sicosto", "sicostoue"])) return;

    // es_taller / es_producto las agrega una migracion anterior, pero solo si
    // la tabla existia entonces: se incluyen solo si estan.
    const extras = ["es_taller", "es_producto"].filter((c) => maeplu.findColumnByName(c));

    for (const g of PLU_GENERICOS_TALLER) {
      const columnas = ["plu", "desclarga", "precio", "costo", "iva", "pagaiva", "es_servicio", "usainventario", ...extras];
      const valores = [g.plu, g.descripcion, 0, g.costo, 12, "S", g.esServicio, "N", ...extras.map(() => "S")];
      await queryRunner.query(
        `INSERT INTO maeplu (${columnas.join(", ")})
         SELECT ${columnas.map(() => "?").join(", ")} FROM DUAL
         WHERE NOT EXISTS (SELECT 1 FROM maeplu WHERE plu = ?)`,
        [...valores, g.plu],
      );
      await queryRunner.query(
        `INSERT INTO detuni (plu, unidad, precio, costo, sicosto, sicostoue)
         SELECT ?, 1, 0, ?, ?, ? FROM DUAL
         WHERE NOT EXISTS (SELECT 1 FROM detuni WHERE plu = ?)`,
        [g.plu, g.costo, g.costo, g.costo, g.plu],
      );
    }
  }

  // No borra nada: pueden estar ya facturados contra estos PLU, y son datos
  // del ERP.
  public async down(): Promise<void> {
    return;
  }
}
