import { MigrationInterface, QueryRunner } from "typeorm";

// Los parametros operativos nuevos nacen apagados (y los 3 "puente" pasaron a
// default false), pero un cliente que YA opera no debe perder funciones de un
// dia para otro. "Ya opera" = taller_ordenes_trabajo tiene al menos una fila;
// una base vacia es un sitio nuevo y debe caer a los defaults del catalogo,
// asi que ahi no se siembra nada.
//
// Lista copiada a mano y no importada del catalogo: una migracion describe lo
// que paso en su fecha, y el catalogo seguira cambiando.
const CLAVES_NUEVAS = [
  "ot.usa_fotos",
  "ot.usa_danos",
  "ot.usa_pdf_escaner",
  "ot.usa_cosas_trae",
  "ot.usa_mecanicos",
  "ot.usa_firma_cliente",
  "ot.usa_firma_recepcion",
  "ot.exige_fecha_salida",
  "ot.una_ot_por_vehiculo",
  "cotizacion.bloquea_venta_bajo_costo",
  "cotizacion.exige_motivo_cambio",
  "cotizacion.usa_link_publico",
  "ot.usa_estado_publico",
  "modulos.usa_historial",
  "modulos.usa_reportes",
  "modulos.usa_cargas_masivas",
  "modulos.usa_bitacora",
  "impresion.recepcion",
  "impresion.cotizacion",
  "impresion.entrega",
  "impresion.orden_interna",
  "facturacion.exige_pago_para_entrega",
];

// Las 3 claves "puente" (tiendas.permite_crear, productos.permite_crear,
// facturacion.usa_facturacion) NO se siembran a proposito: mientras un tenant no
// tenga fila propia, TallerParametrosService las resuelve desde tenant_config
// (plano de control), que es donde un operador pudo haberlas APAGADO. Sembrar
// `true` aqui pisaria esa decision y encenderia, por ejemplo, la facturacion en
// un cliente que la tenia apagada. Esta migracion corre en la base del tenant y
// no puede leer tenant_config, asi que lo correcto es no tocarlas.

export class SeedParametrosOperativosEnTenantsExistentes1781200000000 implements MigrationInterface {
  name = "SeedParametrosOperativosEnTenantsExistentes1781200000000";

  public async up(queryRunner: QueryRunner): Promise<void> {
    if (!(await queryRunner.hasTable("taller_parametros"))) return;
    if (!(await queryRunner.hasTable("taller_ordenes_trabajo"))) return;

    const hayOts = await queryRunner.query(
      "SELECT 1 AS hay FROM taller_ordenes_trabajo LIMIT 1",
    );
    if (!Array.isArray(hayOts) || hayOts.length === 0) return;

    for (const clave of CLAVES_NUEVAS) {
      await queryRunner.query(
        `INSERT IGNORE INTO taller_parametros (clave, ambito, tienda_id, destino, tipo_dato, valor, valor_cifrado)
         VALUES (?, 'tenant', 0, '', 'boolean', 'true', NULL)`,
        [clave],
      );
    }
  }

  // Best-effort: borra solo las filas sembradas, que se distinguen de las que
  // alguien edito desde la pantalla porque estas ultimas dejan historial.
  public async down(queryRunner: QueryRunner): Promise<void> {
    if (!(await queryRunner.hasTable("taller_parametros"))) return;

    const marcas = CLAVES_NUEVAS.map(() => "?").join(", ");
    const hayHistorial = await queryRunner.hasTable(
      "taller_parametros_historial",
    );
    const sinHistorial = hayHistorial
      ? `AND NOT EXISTS (
           SELECT 1 FROM taller_parametros_historial h
           WHERE h.clave = taller_parametros.clave AND h.tienda_id = 0 AND h.destino = ''
         )`
      : "";

    await queryRunner.query(
      `DELETE FROM taller_parametros
       WHERE clave IN (${marcas}) AND tienda_id = 0 AND destino = '' AND valor = 'true'
       ${sinHistorial}`,
      CLAVES_NUEVAS,
    );
  }
}
