import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
import { ExportJobStatus } from '../enum/export-job-status.enum';
import { JobTypeEnum } from '../enum/job-type.enum';

@Entity('background_jobs')
export class BackgroundJob {
  @PrimaryGeneratedColumn('increment', { type: 'bigint' })
  id: number;

  @Column({ name: 'type', type: 'enum', enum: JobTypeEnum })
  type: JobTypeEnum;

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

  @Column({ name: 'total', type: 'int', default: 0 })
  total: number;

  @Column({ name: 'generated', type: 'int', default: 0 })
  generated: number;

  @Column({ name: 'skipped', type: 'int', default: 0 })
  skipped: number;

  @Column({ name: 'failed', type: 'int', default: 0 })
  failed: number;

  @Column({ name: 'processed_records', type: 'int', default: 0 })
  processedRecords: number;

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

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

  @Column({ name: 'folder_name', type: 'varchar', length: 255, nullable: true })
  folderName: string | null;

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

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

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

  @Column({ name: 'filters', type: 'jsonb', nullable: true })
  filters: Record<string, any> | null;

  @Column({ name: 'metadata', type: 'jsonb', nullable: true })
  metadata: Record<string, any> | null;

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

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

  @Column({ name: 'completed_at', type: 'timestamptz', nullable: true })
  completedAt: Date | null;

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