import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { Project } from './project.entity';
import type { AttachmentKind } from '../../task/entities/attachment.entity';

// 프로젝트 문서 첨부 — 실제 바이너리는 서버 업로드 폴더에 저장하고 메타데이터만 보관.
// (업무 첨부 Attachment 와 동일 패턴 / 동일 업로드 설정 재사용)
@Entity('project_attachments')
export class ProjectAttachment {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소속 프로젝트 (프로젝트 삭제 시 함께 삭제)
  @Index()
  @ManyToOne(() => Project, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'project_id' })
  project!: Relation<Project>;

  // 업로더 (사용자 삭제 시에도 첨부는 유지 — 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;

  // 파일 크기(바이트)
  @Column({ type: 'int' })
  size!: number;

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

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

  // AI 추천용 추출 본문 — 업로드 시 1회 추출·캐싱(매 호출 재파싱 방지).
  // 추출 불가 형식/실패 시 null. 용량이 크므로 기본 조회에서는 제외(select:false).
  @Column({
    name: 'extracted_text',
    type: 'text',
    nullable: true,
    select: false,
  })
  extractedText!: string | null;

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