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

// 드라이브 폴더 — 사용자 소유의 폴더 트리(adjacency list).
// 프로젝트와 독립적이며, ProjectFolderLink 로 프로젝트에 연동(공유)할 수 있다.
@Entity('drive_folders')
export class DriveFolder {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소유자 (사용자 삭제 시 폴더도 함께 삭제)
  @Index()
  @ManyToOne(() => User, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'owner_id' })
  owner!: User;

  // 상위 폴더 (null = 드라이브 루트). 상위 삭제 시 하위도 함께 삭제(CASCADE).
  // Relation<> 래퍼: 자기참조 순환 회피
  @Index()
  @ManyToOne(() => DriveFolder, { onDelete: 'CASCADE', nullable: true })
  @JoinColumn({ name: 'parent_id' })
  parent!: Relation<DriveFolder> | null;

  // 폴더명
  @Column()
  name!: string;

  // 머터리얼라이즈드 패스 — 루트부터 자기 자신까지의 폴더 id 를 '/' 로 이어 저장(자기 포함, 끝에 '/').
  // 예: "rootId/childId/" . 조상 연동 여부 판정과 하위 트리 조회(LIKE)에 사용한다.
  // (parent_id 가 트리의 SSOT 이고, path 는 빠른 조회를 위한 파생값)
  @Index()
  @Column({ type: 'text' })
  path!: string;

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

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt!: Date;
}
