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

export enum TenantEstado {
  ONBOARDING = "onboarding",
  ACTIVO = "activo",
  SUSPENDIDO = "suspendido",
}

export enum TenantEntorno {
  DEMO = "demo",
  PRODUCCION = "produccion",
}

// Registro de un tenant en el plano de control. La contraseña de conexion se
// guarda cifrada (ver CredentialsCryptoService) — nunca en texto plano, nunca
// como hash (un hash no permite reconstruir la contraseña para conectarse).
// El nombre de una base NO identifica un tenant por si solo: la misma base
// "mbinvautocentrorodriguez" existe en el servidor de pruebas y va a existir
// en produccion — dos tenants distintos, mismo db_name. La identidad real es
// (db_host, db_port, db_name) — nunca uses solo db_name para buscar,
// cachear o loggear un tenant.
@Entity("tenants")
@Unique(["dbHost", "dbPort", "dbName"])
export class Tenant {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 64, unique: true })
  @Index()
  codigo: string;

  @Column({ length: 255 })
  nombre: string;

  @Column({ type: "enum", enum: TenantEstado, default: TenantEstado.ONBOARDING })
  estado: TenantEstado;

  @Column({ type: "enum", enum: TenantEntorno })
  entorno: TenantEntorno;

  @Column({ name: "db_host", length: 255 })
  dbHost: string;

  @Column({ name: "db_port", type: "int", default: 3306 })
  dbPort: number;

  @Column({ name: "db_name", length: 128 })
  dbName: string;

  @Column({ name: "db_user", length: 128 })
  dbUser: string;

  // Cifrado con CredentialsCryptoService — nunca en claro, nunca hasheado.
  @Column({ name: "db_password_encrypted", type: "text" })
  dbPasswordEncrypted: string;

  // Cache derivado, refrescable — nunca fuente de verdad para decidir nada.
  // La fuente real es la tabla `migrations` de cada tenant, leida en vivo.
  @Column({
    name: "schema_version_cache",
    type: "varchar",
    length: 255,
    nullable: true,
  })
  schemaVersionCache: string | null;

  @Column({ name: "schema_version_cache_at", type: "datetime", nullable: true })
  schemaVersionCacheAt: Date | null;

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

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