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

// 활동 이벤트 타입 — 행위에서 자동 적재(쓰기 API 없음, 읽기 전용)
export type ActivityType =
  // 프로젝트(설정)
  | 'project.created'
  | 'project.renamed'
  // 멤버
  | 'member.invited'
  | 'member.role_changed'
  | 'member.removed'
  // 업무
  | 'task.created'
  | 'task.status_changed'
  | 'task.comment_added'
  | 'task.file_attached'
  | 'task.assignees_changed'
  | 'task.due_changed'
  | 'task.edited'
  | 'task.file_removed'
  | 'task.removed';

// 활동 이벤트 — 행위 타입 + 행위자 + 대상(payload)만 저장하고
// 표시 문구/아이콘/톤은 프론트가 조립한다(파생값 규칙).
@Entity('activities')
export class Activity {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // 소속 프로젝트 (프로젝트 삭제 시 함께 삭제)
  // Relation<> 래퍼: 엔티티 순환참조 회피
  @Index()
  @ManyToOne(() => Project, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'project_id' })
  project!: Relation<Project>;

  // 업무 활동이면 업무 순번(seq) — 업무 상세 활동 탭 필터용. 프로젝트 활동이면 null
  // (Task FK 대신 seq 를 저장해 업무 삭제와 무관하게 활동을 유지)
  @Index()
  @Column({ name: 'task_seq', type: 'int', nullable: true })
  taskSeq!: number | null;

  // 행위자 (사용자 삭제 시에도 활동은 유지 — SET NULL)
  @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true })
  @JoinColumn({ name: 'actor_id' })
  actor!: User | null;

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

  // 대상 정보(자유형) — 예: taskSeq/taskTitle, statusFrom/statusTo, targetName, fileName, visibility, newName, roleType
  @Column({ type: 'jsonb', default: () => "'{}'" })
  payload!: Record<string, unknown>;

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