// 업무 도메인 타입 — 백엔드 TaskService 응답 / DTO 와 1:1

import type {
  TaskStatus,
  ChecklistCategory,
  ChecklistWorkStatus,
} from '@/mock/relay.mock'

// 진행 상태 타입은 뷰모델(relay.mock)이 SSOT — 외부에서 @/types/task 로도 쓰도록 재노출
export type { ChecklistWorkStatus }
import type { ApiMember } from '@/types/repo'
import type { ApiActivity } from '@/types/activity'
import type { Paginated } from '@/types/pagination'

// 업무 목록 행(API 원시) — 백엔드 ProjectTaskResponse 와 1:1
export interface ApiProjectTask {
  id: number // 프로젝트 내 순번(seq)
  title: string
  status: TaskStatus
  dueDate: string | null
  checklist: [number, number] // [완료, 전체]
  commentCount: number
  fileCount: number // 첨부 파일 수
  assignees: ApiMember[]
}

// 체크리스트 항목(API 원시)
export interface ApiChecklistItem {
  id: string
  text: string
  done: boolean
  category: ChecklistCategory
  // 보완 내용(수정 요청 시 항목별 입력) — 없으면 null
  reviewNote: string | null
  // 작업자 진행 상태(자가보고)
  workStatus: ChecklistWorkStatus
}

// 중간 점검일(API 원시)
export interface ApiCheckpoint {
  id: string
  checkAt: string
}

// 중간 점검 보고 스냅샷 항목
export interface ApiReportItem {
  itemId: string
  text: string
  category: ChecklistCategory
  workStatus: ChecklistWorkStatus
}

// 중간 점검 보고(API 원시)
export interface ApiCheckpointReport {
  id: string
  checkpointId: string
  checkAt: string | null
  reporter: ApiMember | null
  note: string | null
  items: ApiReportItem[]
  createdAt: string
}

// 첨부파일(API 원시) — 백엔드 AttachmentResponse 와 1:1
export interface ApiAttachment {
  id: string
  name: string
  size: number // 바이트
  kind: 'pdf' | 'zip' | 'doc' | 'img'
  url: string // 다운로드 경로
  uploader: ApiMember | null
  createdAt: string
}

// 답글(API 원시)
export interface ApiCommentReply {
  id: string
  author: ApiMember | null
  text: string
  createdAt: string
}

// 댓글(API 원시, 답글 포함)
export interface ApiComment {
  id: string
  author: ApiMember | null
  text: string
  file: ApiAttachment | null
  createdAt: string
  replies: ApiCommentReply[]
}

// 승인 요청 정보(API 원시)
export interface ApiApproval {
  requester: ApiMember | null
  requestedAt: string | null
  note: string | null
}

// 업무 상세(API 원시) — 백엔드 TaskDetailResponse 와 1:1 (activities 는 6단계)
export interface ApiTaskDetail {
  id: number
  projectId: string
  projectName: string
  title: string
  status: TaskStatus
  content: string[]
  checklist: ApiChecklistItem[]
  assignees: ApiMember[]
  issuer: ApiMember | null
  dueDate: string | null
  createdAt: string
  comments: ApiComment[]
  activities: ApiActivity[]
  files: ApiAttachment[]
  approval: ApiApproval | null
  changesNote: string | null
  checkpoints: ApiCheckpoint[]
  checkpointReports: ApiCheckpointReport[]
}

// 업무 목록 세그먼트(상태 묶음) — 진행 중 = prog+review
export type TaskSegment = 'all' | 'prog' | 'todo' | 'done'

// 세그먼트별 카운트(검색어 반영) — ProjectDetailPage 세그먼트 배지용. 백엔드 TaskSegmentCounts 와 1:1
export interface TaskSegmentCounts {
  all: number
  prog: number
  todo: number
  done: number
}

// 업무 목록 정렬 — 최신순/마감 임박순/오래된순 (백엔드 sort 쿼리와 1:1)
export type TaskSort = 'latest' | 'due' | 'oldest'

// 업무 목록 필터 — 세그먼트/검색/담당자/정렬 (백엔드 list 쿼리와 1:1)
export interface TaskListQuery {
  segment?: TaskSegment
  q?: string
  assignee?: string
  sort?: TaskSort
}

// 업무 목록 응답 — 페이지네이션 + 세그먼트 카운트 동봉 (백엔드 ProjectTaskListResult 와 1:1)
export type ApiProjectTaskListResult = Paginated<ApiProjectTask> & {
  counts: TaskSegmentCounts
}

// 업무 생성 요청
export interface CreateTaskPayload {
  title: string
  content?: string[]
  assigneeIds: string[]
  dueDate?: string
  checklist?: { text: string; category?: ChecklistCategory }[]
  // 중간 점검일(ISO8601 목록)
  checkpoints?: string[]
}

// 업무 수정 요청
export interface UpdateTaskPayload {
  title?: string
  content?: string[]
  assigneeIds?: string[]
  dueDate?: string | null
  // 체크리스트 전체 동기화(id 있으면 기존 유지, 없으면 신규, 빠지면 삭제)
  checklist?: { id?: string; text: string; category?: ChecklistCategory }[]
  // 중간 점검일(제공 시 전체 교체)
  checkpoints?: string[]
}

// 중간 점검 보고 요청(작업자) — 점검일 당일, 항목별 상태 + 메모
export interface CheckpointReportPayload {
  note?: string
  items: { id: string; workStatus: ChecklistWorkStatus }[]
}

// 댓글/답글 작성 요청(5단계)
export interface AddCommentPayload {
  text: string
  fileId?: string
}
export interface AddReplyPayload {
  text: string
}

// 승인 워크플로우 요청(5단계)
export interface ApprovalRequestPayload {
  note?: string
}
// 수정 요청 시 항목별 완료 검토(체크/X) + 항목별 보완 내용
export interface ChecklistReviewItem {
  id: string
  done: boolean
  // 보완 내용(미완성 항목에만 적용)
  note?: string
}
export interface ApprovalChangesPayload {
  // 수정 요청 메시지(선택)
  note?: string
  // 항목별 완료 검토 결과(생략 시 체크리스트 변경 없음)
  checklist?: ChecklistReviewItem[]
}
