package com.zioinfo.kintex.work.approval.dto;

import jakarta.validation.constraints.NotBlank;

import java.util.List;

/**
 * §5B 공통 전자결재(F028) DTO 모음 — WISE/UIWS approval 패턴 이식.
 * 상태(문서): DRAFT→SUBMITTED→IN_PROGRESS→APPROVED|REJECTED (+CANCELED).
 */
public final class ApprovalDtos {

    private ApprovalDtos() {
    }

    /** 결재함 목록 행. */
    public record ApprovalListDto(
            String id, String docType, String title, String status,
            String drafterId, String drafterName,
            int curStep, int totalSteps, int version,
            String eventId, String refType, String refId,
            String submittedAt, String createdAt) {
    }

    /** 결재선 단계. */
    public record ApprovalLineDto(
            String id, int stepNo, String approverId, String approverName,
            String lineStatus, String actedAt, String comment) {
    }

    /** 처리 이력 항목. */
    public record ApprovalHistoryDto(
            String id, Integer stepNo, String actorId, String actorName,
            String action, String comment, String actedAt) {
    }

    /** 문서 상세(결재선·이력·액션 가능 플래그 포함). */
    public record ApprovalDetailDto(
            String id, String docType, String title, String content, String status,
            String drafterId, String drafterName,
            int curStep, int totalSteps, int version,
            String eventId, String refType, String refId,
            String submittedAt, String completedAt, String createdAt,
            List<ApprovalLineDto> lines, List<ApprovalHistoryDto> history,
            boolean canAct, boolean canCancel, boolean canResubmit) {
    }

    /** 결재선 저장 항목(기안/재상신). */
    public record ApprovalLineSaveRequest(Integer stepNo, @NotBlank String approverId, String approverName) {
    }

    /** 기안/재상신 저장 요청. lines 는 상신 시 필수(1부터 연속). */
    public record ApprovalSaveRequest(
            String eventId, String docType, @NotBlank String title, String content,
            String refType, String refId, List<ApprovalLineSaveRequest> lines) {
    }

    /** 승인/반려 액션 요청(의견). 반려는 comment 필수(서비스 검증). */
    public record ApprovalActionRequest(String comment) {
    }
}
