package com.unicorn.hgzero.meeting.biz.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * Todo 도메인 모델
 */
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Todo {

    /**
     * Todo ID
     */
    private String todoId;

    /**
     * 회의록 ID
     */
    private String minutesId;

    /**
     * 회의 ID
     */
    private String meetingId;

    /**
     * Todo 제목
     */
    private String title;

    /**
     * Todo 설명
     */
    private String description;

    /**
     * 담당자 ID
     */
    private String assigneeId;

    /**
     * 마감일
     */
    private LocalDate dueDate;

    /**
     * Todo 상태 (PENDING, IN_PROGRESS, COMPLETED, CANCELLED)
     */
    private String status;

    /**
     * 우선순위 (HIGH, MEDIUM, LOW)
     */
    private String priority;

    /**
     * 진행률 (0-100)
     */
    private Integer progress;

    /**
     * 생성자 ID
     */
    private String createdBy;

    /**
     * 생성 시간
     */
    private LocalDateTime createdAt;

    /**
     * 최종 수정 시간
     */
    private LocalDateTime lastModifiedAt;

    /**
     * 완료 일시
     */
    private LocalDateTime completedAt;

    /**
     * 완료한 사용자 ID
     */
    private String completedBy;

    /**
     * Todo 완료
     */
    public void complete() {
        this.status = "COMPLETED";
        this.completedAt = LocalDateTime.now();
    }

    /**
     * Todo 취소
     */
    public void cancel() {
        this.status = "CANCELLED";
    }

    /**
     * Todo 완료 여부 확인
     */
    public boolean isCompleted() {
        return "COMPLETED".equals(this.status);
    }

    /**
     * 마감일 지남 여부 확인
     */
    public boolean isOverdue() {
        return this.dueDate != null &&
               LocalDate.now().isAfter(this.dueDate) &&
               !isCompleted();
    }

    /**
     * Todo 정보 업데이트
     */
    public void update(String title, String description, String assigneeId, LocalDate dueDate, String priority) {
        this.title = title;
        this.description = description;
        this.assigneeId = assigneeId;
        this.dueDate = dueDate;
        this.priority = priority;
    }
}
