import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  type Relation,
  Unique,
} from 'typeorm';
import { User } from '../../user/entities/user.entity';
import { Project } from '../../project/entities/project.entity';
import { DriveFolder } from './drive-folder.entity';

// 연동 권한 — read: 보기/다운로드만, read-write: 프로젝트 멤버도 업로드 가능
export type DriveLinkPermission = 'read' | 'read-write';

// 프로젝트-폴더 연동 — 드라이브 폴더를 프로젝트에 공유한다.
// 연동된 폴더와 그 하위 트리 전체가 해당 프로젝트 멤버에게 노출된다.
@Entity('project_folder_links')
@Unique('UQ_project_folder_link', ['project', 'folder'])
export class ProjectFolderLink {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 대상 프로젝트 (프로젝트 삭제 시 연동 해제)
  @Index()
  @ManyToOne(() => Project, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'project_id' })
  project!: Relation<Project>;

  // 연동된 드라이브 폴더 (폴더 삭제 시 연동도 함께 삭제)
  @Index()
  @ManyToOne(() => DriveFolder, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'folder_id' })
  folder!: Relation<DriveFolder>;

  // 연동을 수행한 사용자(폴더 소유자) — 사용자 삭제 시에도 연동은 유지(SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'linked_by_id' })
  linkedBy!: User | null;

  // 연동 권한 — 기본 read(안전)
  @Column({ type: 'varchar', default: 'read' })
  permission!: DriveLinkPermission;

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