import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from "typeorm";

export enum MigrationJobEstado {
  PENDIENTE = "pendiente",
  CORRIENDO = "corriendo",
  COMPLETO = "completo",
  INCOMPLETO = "incompleto", // fallo a mitad, DDL no transaccional — retomable
  SIMULACION = "simulacion", // modo simular: no escribe nada
}

// Un trabajo de migracion en background contra UN tenant. El DDL de MySQL no
// es transaccional: si falla en el paso 3 de 5, los dos primeros ya quedaron
// aplicados. Por eso cada paso se registra en MigrationJobStep apenas se
// aplica, no al final del lote — el boton de reintentar retoma desde el
// ultimo paso exitoso, nunca desde el principio.
@Entity("migration_jobs")
export class MigrationJob {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ name: "tenant_id" })
  @Index()
  tenantId: number;

  @Column({ type: "enum", enum: MigrationJobEstado, default: MigrationJobEstado.PENDIENTE })
  estado: MigrationJobEstado;

  // Nombre exacto de la migracion (clase TypeORM) donde se quedo si fallo.
  @Column({
    name: "fallo_en_migracion",
    type: "varchar",
    length: 255,
    nullable: true,
  })
  falloEnMigracion: string | null;

  @Column({ name: "error_mensaje", type: "text", nullable: true })
  errorMensaje: string | null;

  @Column({ name: "iniciado_por_identidad_id", type: "int" })
  iniciadoPorIdentidadId: number;

  @Column({ name: "es_simulacion", default: false })
  esSimulacion: boolean;

  @CreateDateColumn({ name: "created_at" })
  createdAt: Date;

  @UpdateDateColumn({ name: "updated_at" })
  updatedAt: Date;
}
