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

// 업무 댓글 — 답글은 parent 를 가리키는 같은 엔티티로 표현(1단계 깊이)
@Entity('comments')
export class Comment {
  @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: 'author_id' })
  author!: User | null;

  // 부모 댓글 — 답글이면 설정, 최상위 댓글이면 null
  @ManyToOne(() => Comment, (c) => c.replies, {
    onDelete: 'CASCADE',
    nullable: true,
  })
  @JoinColumn({ name: 'parent_id' })
  parent!: Relation<Comment> | null;

  // 이 댓글에 달린 답글들
  @OneToMany(() => Comment, (c) => c.parent)
  replies!: Relation<Comment>[];

  // 첨부(선택) — 첨부 삭제 시 연결만 해제(SET NULL)
  @ManyToOne(() => Attachment, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'attachment_id' })
  attachment!: Relation<Attachment> | null;

  // 댓글 본문
  @Column({ type: 'text' })
  text!: string;

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