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

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

  public async up(queryRunner: QueryRunner): Promise<void> {
    const tiendasExists = await queryRunner.hasTable("taller_tiendas");
    if (!tiendasExists) {
      await queryRunner.createTable(
        new Table({
          name: "taller_tiendas",
          columns: [
            { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },
            { name: "codigo", type: "varchar", length: "80", isUnique: true },
            { name: "nombre", type: "varchar", length: "160" },
            { name: "activo", type: "tinyint", default: 1 },
            { name: "created_at", type: "datetime", default: "CURRENT_TIMESTAMP" },
            { name: "updated_at", type: "datetime", default: "CURRENT_TIMESTAMP", onUpdate: "CURRENT_TIMESTAMP" },
          ],
        }),
      );
      await queryRunner.createIndex("taller_tiendas", new TableIndex({ name: "IDX_tiendas_codigo", columnNames: ["codigo"] }));
      await queryRunner.createIndex("taller_tiendas", new TableIndex({ name: "IDX_tiendas_activo", columnNames: ["activo"] }));
    }

    await queryRunner.query(
      "INSERT INTO taller_tiendas (codigo, nombre, activo) VALUES ('principal', 'Tienda principal', 1) ON DUPLICATE KEY UPDATE nombre = VALUES(nombre), activo = VALUES(activo)",
    );

    const [{ id: defaultStoreId }] = await queryRunner.query(
      "SELECT id FROM taller_tiendas WHERE codigo = 'principal' LIMIT 1",
    );

    const usuarios = await queryRunner.getTable("taller_usuarios");
    if (usuarios && !usuarios.findColumnByName("tienda_id")) {
      await queryRunner.addColumn(
        "taller_usuarios",
        new TableColumn({ name: "tienda_id", type: "int", isNullable: true }),
      );
      await queryRunner.createIndex("taller_usuarios", new TableIndex({ name: "IDX_usuarios_tienda_id", columnNames: ["tienda_id"] }));
    }

    const ots = await queryRunner.getTable("taller_ordenes_trabajo");
    if (ots && !ots.findColumnByName("tienda_id")) {
      await queryRunner.addColumn(
        "taller_ordenes_trabajo",
        new TableColumn({ name: "tienda_id", type: "int", isNullable: true }),
      );
      await queryRunner.createIndex("taller_ordenes_trabajo", new TableIndex({ name: "IDX_ots_tienda_id", columnNames: ["tienda_id"] }));
    }

    if (defaultStoreId) {
      await queryRunner.query(
        "UPDATE taller_usuarios SET tienda_id = ? WHERE tienda_id IS NULL",
        [defaultStoreId],
      );
      await queryRunner.query(
        "UPDATE taller_ordenes_trabajo SET tienda_id = ? WHERE tienda_id IS NULL",
        [defaultStoreId],
      );
    }
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    const ots = await queryRunner.getTable("taller_ordenes_trabajo");
    if (ots?.findColumnByName("tienda_id")) {
      const index = ots.indices.find((item) => item.name === "IDX_ots_tienda_id");
      if (index) await queryRunner.dropIndex("taller_ordenes_trabajo", index);
      await queryRunner.dropColumn("taller_ordenes_trabajo", "tienda_id");
    }

    const usuarios = await queryRunner.getTable("taller_usuarios");
    if (usuarios?.findColumnByName("tienda_id")) {
      const index = usuarios.indices.find((item) => item.name === "IDX_usuarios_tienda_id");
      if (index) await queryRunner.dropIndex("taller_usuarios", index);
      await queryRunner.dropColumn("taller_usuarios", "tienda_id");
    }

    await queryRunner.dropTable("taller_tiendas", true);
  }
}
