import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { ProgramRegistration } from './program-registration.entity';
import { Auditable } from 'src/audit-history/decorators/auditable.decorator';

@Auditable()
@Entity({ name: 'seat_transfer_track' })
export class SeatTransferTrack {
  @PrimaryGeneratedColumn({ name: 'id', type: 'bigint' })
  id: number;

  @Column({ name: 'registration_id', type: 'bigint', nullable: false })
  registrationId: number;

  @ManyToOne(() => ProgramRegistration, (registration) => registration.seatTransferTracks, { nullable: false, onDelete: 'CASCADE' })
  @JoinColumn({ name: 'registration_id' })
  registration: ProgramRegistration;

  @Column({ name: 'original_user_id', type: 'bigint', nullable: false })
  originalUserId: number;

  @Column({ name: 'new_user_id', type: 'bigint', nullable: false })
  newUserId: number;

  // Preserved across chain transfers (A→B→C): always points back to the original registrant A
  @Column({ name: 'source_user_id', type: 'bigint', nullable: true })
  sourceUserId: number | null;

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

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

  @Column({ name: 'transfer_reason', type: 'text', nullable: true })
  transferReason: string | null;

  @Column({ name: 'admin_notes', type: 'text', nullable: true })
  adminNotes: string | null;

  @Column({ name: 'transfer_status', type: 'varchar', length: 50, nullable: false, default: 'COMPLETED' })
  transferStatus: string;

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

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

  @DeleteDateColumn({ name: 'deleted_at', type: 'timestamp', nullable: true })
  deletedAt: Date | null;

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

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