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

// Falta real encontrada corriendo las 14 migraciones contra una base
// GENUINAMENTE nueva (sin taller_usuarios preexistente): ninguna migracion la
// creaba. AddUsersPermissionsVehicularCatalogs1740152000000 le hace ALTER
// asumiendo que ya existe — cierto en la demo y en produccion (donde la tabla
// nacio antes de que este historial de migraciones existiera), falso en
// cualquier tenant genuinamente nuevo.
//
// Esquema reconstruido restando de SHOW CREATE TABLE taller_usuarios de
// mbinvautocentrorodriguez (el estado FINAL, verificado contra la tabla real,
// no la entidad) lo que las migraciones POSTERIORES agregan:
//   - permisos (json) y el enum de `rol` con 'super_admin'/'operativo' ->
//     agregados por AddUsersPermissionsVehicularCatalogs1740152000000 (su
//     down() confirma el enum anterior: ('admin','recepcion','mecanico')
//     default 'recepcion').
//   - tienda_id (+ su indice) -> agregado por AddTiendasScope1761400000000.
// Todo lo demas (username unico + indice propio, email, password_hash,
// nombre, activo + indice, ultimo_login, created_at/updated_at nullable) ya
// estaba antes de la primera migracion que la toca — nunca cambiado por
// ninguna migracion posterior, asi que es del esquema original.
export class CreateTallerUsuarios1740102000000 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    // ifNotExist=true: EN LA DEMO Y EN PRODUCCION la tabla ya existe (nacio
    // antes de este historial de migraciones) — esto tiene que ser un no-op
    // ahi, y solo crear la tabla donde genuinamente falta.
    await queryRunner.createTable(
      new Table({
        name: "taller_usuarios",
        columns: [
          {
            name: "id",
            type: "int",
            isPrimary: true,
            isGenerated: true,
            generationStrategy: "increment",
          },
          { name: "username", type: "varchar", length: "100" },
          { name: "email", type: "varchar", length: "255", isNullable: true },
          { name: "password_hash", type: "varchar", length: "255" },
          { name: "nombre", type: "varchar", length: "255" },
          {
            name: "rol",
            type: "enum",
            enum: ["admin", "recepcion", "mecanico"],
            default: "'recepcion'",
          },
          { name: "activo", type: "boolean", default: true, isNullable: true },
          { name: "ultimo_login", type: "datetime", isNullable: true },
          {
            name: "created_at",
            type: "timestamp",
            isNullable: true,
            default: "CURRENT_TIMESTAMP",
          },
          {
            name: "updated_at",
            type: "timestamp",
            isNullable: true,
            default: "CURRENT_TIMESTAMP",
            onUpdate: "CURRENT_TIMESTAMP",
          },
        ],
        // Nombrada "username" a proposito (no la deja auto-generar un hash):
        // asi se llama en mbinvautocentrorodriguez — verificado con SHOW
        // CREATE TABLE, no adivinado.
        uniques: [{ name: "username", columnNames: ["username"] }],
      }),
      true,
    );

    // username lleva DOS indices en la tabla real (la UNIQUE de arriba, mas
    // este, independiente) — asi esta en mbinvautocentrorodriguez, nunca
    // tocado por ninguna migracion posterior.
    const table = await queryRunner.getTable("taller_usuarios");
    if (table && !table.indices.some((i) => i.name === "idx_username")) {
      await queryRunner.createIndex(
        "taller_usuarios",
        new TableIndex({ name: "idx_username", columnNames: ["username"] }),
      );
    }
    if (table && !table.indices.some((i) => i.name === "idx_activo")) {
      await queryRunner.createIndex(
        "taller_usuarios",
        new TableIndex({ name: "idx_activo", columnNames: ["activo"] }),
      );
    }
  }

  // Deliberadamente un NO-OP, mismo criterio que UseMaetieForTiendas.down():
  // en la demo y en produccion esta tabla existia ANTES de esta migracion —
  // revertir no puede significar "borrar taller_usuarios", eso destruiria
  // usuarios reales en cualquier entorno donde up() fue un no-op.
  public async down(): Promise<void> {
    // No se borra taller_usuarios: en todo entorno real la tabla es anterior
    // a esta migracion. Revertir esto de verdad exige confirmar a mano que
    // la tabla esta vacia y fue creada POR esta migracion, no asumirlo.
  }
}
