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

// 알림 타입 — 수신자 관점의 이벤트(활동 피드와 별개: 활동은 프로젝트 전체 로그, 알림은 개인 수신함)
export type NotificationType =
  | 'task.assigned' // 나에게 업무가 지시됨
  | 'task.unassigned' // 업무 담당에서 제외됨
  | 'task.approval_requested' // 내가 지시한 업무의 승인 요청이 옴
  | 'task.approved' // 내가 담당한 업무가 승인(완료)됨
  | 'task.changes_requested' // 내가 담당한 업무에 수정이 요청됨
  | 'task.started' // 내가 지시한 업무를 담당자가 시작/재개함
  | 'task.due_changed' // 내가 담당한 업무의 마감이 변경됨
  | 'task.checkpoint_reported' // 내가 지시한 업무의 중간 점검 보고가 옴
  | 'task.removed' // 내 관련 업무가 삭제됨
  | 'task.commented' // 내 관련 업무에 댓글/답글이 달림
  | 'member.invited' // 프로젝트에 멤버로 초대됨
  | 'member.role_changed' // 프로젝트 내 내 역할이 변경됨
  | 'member.removed'; // 프로젝트에서 제외됨

// 알림 — 사용자별 수신함. 표시 문구/아이콘은 프론트가 type+payload 로 조립한다.
@Entity('notifications')
// 수신자별 최신순 조회 + 미읽음 집계에 사용되는 복합 인덱스
@Index(['recipient', 'createdAt'])
export class Notification {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 수신자 (사용자 삭제 시 알림도 함께 삭제)
  @ManyToOne(() => User, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'recipient_id' })
  recipient!: User;

  // 이벤트 타입
  @Column({ type: 'varchar' })
  type!: NotificationType;

  // 대상 정보(자유형) — 예: repoId(slug)/repoName/taskSeq/taskTitle/actorName/note
  @Column({ type: 'jsonb', default: () => "'{}'" })
  payload!: Record<string, unknown>;

  // 읽음 여부
  @Column({ type: 'boolean', default: false })
  read!: boolean;

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