package com.kt.event.content.biz.domain;

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

import java.time.LocalDateTime;

/**
 * Job 도메인 모델
 * 이미지 생성 작업의 비즈니스 정보
 */
@Getter
@Builder
@AllArgsConstructor
public class Job {

    /**
     * Job 상태 enum
     */
    public enum Status {
        PENDING,      // 대기 중
        PROCESSING,   // 처리 중
        COMPLETED,    // 완료
        FAILED        // 실패
    }

    /**
     * Job ID
     */
    private final String id;

    /**
     * 이벤트 ID
     */
    private final String eventId;

    /**
     * Job 타입 (image-generation)
     */
    private final String jobType;

    /**
     * Job 상태
     */
    private Status status;

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

    /**
     * 결과 메시지
     */
    private String resultMessage;

    /**
     * 에러 메시지
     */
    private String errorMessage;

    /**
     * 생성일시
     */
    private final LocalDateTime createdAt;

    /**
     * 수정일시
     */
    private final LocalDateTime updatedAt;

    /**
     * Job 시작
     */
    public void start() {
        this.status = Status.PROCESSING;
        this.progress = 0;
    }

    /**
     * 진행률 업데이트
     *
     * @param progress 진행률 (0-100)
     */
    public void updateProgress(int progress) {
        if (progress < 0 || progress > 100) {
            throw new IllegalArgumentException("진행률은 0-100 사이여야 합니다");
        }
        this.progress = progress;
    }

    /**
     * Job 완료 처리
     *
     * @param resultMessage 결과 메시지
     */
    public void complete(String resultMessage) {
        this.status = Status.COMPLETED;
        this.progress = 100;
        this.resultMessage = resultMessage;
    }

    /**
     * Job 실패 처리
     *
     * @param errorMessage 에러 메시지
     */
    public void fail(String errorMessage) {
        this.status = Status.FAILED;
        this.errorMessage = errorMessage;
    }

    /**
     * Job 진행 중 여부
     *
     * @return 진행 중이면 true
     */
    public boolean isProcessing() {
        return status == Status.PROCESSING;
    }

    /**
     * Job 완료 여부
     *
     * @return 완료되었으면 true
     */
    public boolean isCompleted() {
        return status == Status.COMPLETED;
    }

    /**
     * Job 실패 여부
     *
     * @return 실패했으면 true
     */
    public boolean isFailed() {
        return status == Status.FAILED;
    }
}
