import { MigrationInterface, QueryRunner, Table } from "typeorm";

// Crea maeplu/maetie/maecli SOLO si no existen — nunca las toca si un ERP
// real ya las tiene (ver hasTable() antes de cada createTable). Sin esto, un
// cliente cuya base se registra desde cero (sin un POS/ERP detras, ej. un
// demo de ventas) no puede funcionar nunca: el resto del codigo (productos,
// tiendas, clientes ERP) asume que estas tres tablas existen, y las
// migraciones que las ALTERAN (UseMaetieForTiendas, AddEsTallerEsProducto...)
// son defensivas — se saltan en silencio si la tabla no existe, en vez de
// crearla. Encontrado real: un tenant registrado contra una base vacia
// activaba sin problema (0 migraciones pendientes) pero rompia en cuanto
// alguien tocaba /productos o /clientes.
//
// A proposito NUMERADA TEMPRANO (antes de UseMaetieForTiendas y de
// AddEsTallerEsProductoToMaeplu, que ya estan en produccion con timestamps
// posteriores): para un tenant NUEVO que corre las migraciones por primera
// vez, TypeORM las ejecuta en orden de timestamp — esta tiene que crear las
// tablas ANTES de que las demas intenten agregarles columnas, o esas
// tambien se saltarian pensando que no existen. Para un tenant YA migrado
// (ej. autocentro-rodriguez), esto es un no-op total: sus maeplu/maetie/
// maecli reales ya existen, hasTable() corta antes de crear nada.
//
// Esquema minimo, no el ERP completo: solo las columnas que el codigo de
// mbtaller realmente lee (ver entities Producto/Tienda/Cliente) — un ERP
// real tiene muchas mas columnas que esto, y esta bien que las tenga; estas
// tablas nuevas son un piso funcional para que mbtaller opere solo, no un
// intento de replicar el ERP entero.
export class CreateErpTablesIfMissing1738900000000 implements MigrationInterface {
  name = "CreateErpTablesIfMissing1738900000000";

  public async up(queryRunner: QueryRunner): Promise<void> {
    const maepluExists = await queryRunner.hasTable("maeplu");
    if (!maepluExists) {
      await queryRunner.createTable(
        new Table({
          name: "maeplu",
          columns: [
            { name: "plu", type: "varchar", length: "24", isPrimary: true },
            { name: "desclarga", type: "varchar", length: "255", isNullable: true },
            { name: "desccorta", type: "varchar", length: "100", isNullable: true },
            { name: "alterno", type: "varchar", length: "50", isNullable: true },
            { name: "precio", type: "decimal", precision: 12, scale: 2, default: 0 },
            { name: "costo", type: "decimal", precision: 12, scale: 2, default: 0 },
            { name: "pagaiva", type: "char", length: "1", isNullable: true, default: "'S'" },
            { name: "iva", type: "decimal", precision: 5, scale: 2, default: 0 },
            { name: "es_servicio", type: "char", length: "1", isNullable: true, default: "'N'" },
            { name: "usainventario", type: "char", length: "1", isNullable: true, default: "'S'" },
            { name: "es_taller", type: "char", length: "1", isNullable: true, default: "'N'" },
            { name: "es_producto", type: "char", length: "1", isNullable: true, default: "'S'" },
          ],
        }),
        true,
      );
    }

    const maetieExists = await queryRunner.hasTable("maetie");
    if (!maetieExists) {
      await queryRunner.createTable(
        new Table({
          name: "maetie",
          columns: [
            {
              name: "tienda",
              type: "int",
              isPrimary: true,
              isGenerated: true,
              generationStrategy: "increment",
            },
            { name: "corta", type: "varchar", length: "5", isNullable: true },
            { name: "descripcion", type: "varchar", length: "255", isNullable: true },
            { name: "nombre", type: "varchar", length: "255", isNullable: true },
            { name: "status", type: "tinyint", isNullable: true, default: 0 },
            { name: "alta", type: "char", length: "2", isNullable: true, default: "'S'" },
            { name: "es_transito", type: "char", length: "1", isNullable: true, default: "'N'" },
            { name: "direccion", type: "varchar", length: "255", isNullable: true },
            { name: "taller_nombre_impresion", type: "varchar", length: "255", isNullable: true },
            { name: "taller_direccion_impresion", type: "varchar", length: "255", isNullable: true },
            { name: "taller_telefono_impresion", type: "varchar", length: "80", isNullable: true },
            { name: "taller_logo_url", type: "varchar", length: "500", isNullable: true },
          ],
        }),
        true,
      );
    }

    const maecliExists = await queryRunner.hasTable("maecli");
    if (!maecliExists) {
      await queryRunner.createTable(
        new Table({
          name: "maecli",
          columns: [
            { name: "tarjeta", type: "varchar", length: "24", isPrimary: true },
            { name: "nombre", type: "varchar", length: "255" },
            { name: "direccion", type: "varchar", length: "255", default: "''" },
            { name: "telefono", type: "varchar", length: "48", isNullable: true },
            { name: "celular", type: "varchar", length: "10", isNullable: true },
            { name: "nit", type: "varchar", length: "24", default: "'CF'" },
            { name: "email", type: "varchar", length: "255", isNullable: true },
            { name: "comercial", type: "varchar", length: "255", isNullable: true },
            { name: "razonsocial", type: "varchar", length: "255", isNullable: true },
            { name: "id", type: "int", isNullable: true },
          ],
        }),
        true,
      );
    }
  }

  // Nunca se borran en el revert: aunque este migration las haya creado, no
  // hay forma de distinguir "las cree yo" de "ya existian" una vez aplicado
  // — dropearlas a ciegas podria borrar un ERP real. Mismo criterio que
  // UseMaetieForTiendas.down().
  public async down(): Promise<void> {
    // No-op a proposito.
  }
}
