import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  ManyToOne,
  JoinColumn,
  OneToMany,
} from 'typeorm';
import { ProgramType } from './program-type.entity';
import { TemplateStatus } from '../enum/template-status.enum';
import { TemplateFormSection } from './template-form-section.entity';

/**
 * Entity representing a program template
 * Templates are created per program type (HDB, MSD, etc.)
 * Individual programs reference which template they use
 */
@Entity('program_template')
export class ProgramTemplate {
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: number;

  @Column({ name: 'program_type_id', type: 'int', nullable: false })
  programTypeId: number;

  @ManyToOne(() => ProgramType, { nullable: false })
  @JoinColumn({ name: 'program_type_id', referencedColumnName: 'id' })
  programType: ProgramType;

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

  @Column({ name: 'description', type: 'text', nullable: true })
  description: string;

  @Column({ name: 'version', type: 'int', default: 1 })
  version: number;

  @Column({
    name: 'status',
    type: 'enum',
    enum: TemplateStatus,
    default: TemplateStatus.DRAFT,
  })
  status: TemplateStatus;

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

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

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

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt: Date;

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

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

  // Relations
  @OneToMany(
    () => TemplateFormSection,
    (section) => section.programTemplate,
  )
  sections: TemplateFormSection[];
}
