import {
  Column,
  CreateDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { Task } from './task.entity';

// 첨부파일 아이콘 종류(프론트 표시용)
export type AttachmentKind = 'pdf' | 'zip' | 'doc' | 'img';

// 업무 첨부파일 — 실제 바이너리는 서버 업로드 폴더에 저장하고 메타데이터만 보관
@Entity('attachments')
export class Attachment {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소속 업무 (업무 삭제 시 함께 삭제)
  // Relation<> 래퍼: 엔티티 순환참조 회피
  @ManyToOne(() => Task, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'task_id' })
  task!: Relation<Task>;

  // 업로더 (사용자 삭제 시에도 첨부는 유지 — SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'uploader_id' })
  uploader!: User | null;

  // 원본 파일명(다운로드 시 표시)
  @Column()
  name!: string;

  // 디스크 저장명(업로드 폴더 내 고유 파일명)
  @Column({ name: 'stored_name' })
  storedName!: string;

  // 파일 크기(바이트) — 표시용 변환은 프론트 formatBytes 가 담당
  @Column({ type: 'int' })
  size!: number;

  // MIME 타입
  @Column()
  mime!: string;

  // 아이콘 종류(MIME/확장자에서 파생해 저장)
  @Column({ type: 'varchar' })
  kind!: AttachmentKind;

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