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

export type AmbitoParametro = "tenant" | "tienda";
export type TipoDatoParametro = "boolean" | "string" | "number" | "json";

// tienda_id=0 / destino='' (nunca NULL) a proposito: MySQL trata cada NULL
// como distinto de cualquier otro dentro de un indice UNIQUE, asi que dos
// filas de ambito tenant con tienda_id=NULL no chocarian contra
// UNIQUE(clave, tienda_id, destino) -- los centinelas hacen que la
// unicidad la garantice la base, no una convencion de la app. Ver spec
// §3.1. `destino` existe sin uso hoy (siempre '') para que #24483 (destino
// de facturacion dividido producto/servicio) agregue filas nuevas sin
// migrar el esquema -- ver spec §3.3.
@Entity("taller_parametros")
@Unique("UQ_taller_parametros_clave_tienda_destino", ["clave", "tiendaId", "destino"])
export class TallerParametro {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ name: "clave", type: "varchar", length: 100 })
  clave: string;

  @Column({ name: "ambito", type: "enum", enum: ["tenant", "tienda"] })
  ambito: AmbitoParametro;

  @Column({ name: "tienda_id", type: "int", default: 0 })
  tiendaId: number;

  @Column({ name: "destino", type: "varchar", length: 32, default: "" })
  destino: string;

  @Column({ name: "tipo_dato", type: "enum", enum: ["boolean", "string", "number", "json"] })
  tipoDato: TipoDatoParametro;

  // Valores no sensibles, siempre serializados a string por TallerParametrosService.
  @Column({ name: "valor", type: "text", nullable: true })
  valor: string | null;

  // Cifrado con CredentialsCryptoService, para claves marcadas `sensible: true`
  // en el catalogo -- nunca ambas columnas pobladas a la vez para la misma fila.
  @Column({ name: "valor_cifrado", type: "text", nullable: true })
  valorCifrado: string | null;

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

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