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

/**
 * Merge Field Catalog
 * Global registry of backend-resolvable merge fields used by master merge_field_map JSONB.
 * Seeded via migration; managed via DB in this rollout (no admin UI).
 */
@Entity('merge_field_catalog')
export class MergeFieldCatalog {
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: number;

  @Column({ name: 'catalog_key', type: 'varchar', length: 128, unique: true, nullable: false })
  catalogKey: string;

  @Column({ name: 'display_name', type: 'varchar', length: 255, nullable: false })
  displayName: string;

  @Column({ name: 'source_table', type: 'varchar', length: 255, nullable: false })
  sourceTable: string;

  @Column({ name: 'source_column', type: 'varchar', length: 255, nullable: false })
  sourceColumn: string;

  @Column({ name: 'data_type', type: 'varchar', length: 32, nullable: false })
  dataType: string;

  @Column({ name: 'format_type', type: 'varchar', length: 50, nullable: true })
  formatType: string | null;

  @Column({ name: 'default_value', type: 'varchar', length: 500, nullable: true })
  defaultValue: string | null;

  @Column({ name: 'description', type: 'varchar', length: 500, nullable: true })
  description: string | null;

  @Column({ name: 'is_per_recipient', type: 'boolean', default: false })
  isPerRecipient: boolean;

  @Column({ name: 'is_active', type: 'boolean', default: true })
  isActive: boolean;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
  createdAt: Date;

  @UpdateDateColumn({
    name: 'updated_at',
    type: 'timestamptz',
    default: () => 'CURRENT_TIMESTAMP',
    onUpdate: 'CURRENT_TIMESTAMP',
  })
  updatedAt: Date;

  @Column({ name: 'created_by', type: 'bigint', nullable: true })
  createdBy: number;

  @Column({ name: 'updated_by', type: 'bigint', nullable: true })
  updatedBy: number;

  constructor(partial: Partial<MergeFieldCatalog>) {
    Object.assign(this, partial);
  }
}
