package com.zioinfo.kintex.home.dto;

import java.util.List;

/**
 * SCR-HOME(로그인 후 메인 홈) 백엔드 응답 DTO 모음 — 읽기 전용 집계(타 도메인 테이블 직접 SELECT).
 *
 * <p>계약 정본: {@code _workspace/impl_home_api.md}. 모든 응답은 {@code ApiResponse<T>} 봉투로 감싼다.
 * PII(연락처·이메일 등)·서버 자격정보는 절대 포함하지 않는다(보안 불변).
 */
public final class HomeDtos {

    private HomeDtos() {
    }

    /**
     * 내 할 일(GET /api/home/todos) 응답.
     *
     * @param total 역할 기반으로 집계된 미결 작업 총 건수(헤더 배지용, 표시는 {@code items} 최대 6건)
     * @param items 기한 임박순(dday 오름차순·기한 없는 결재는 후순위) 최대 6건
     */
    public record TodoResponse(int total, List<TodoItem> items) {
    }

    /**
     * 할 일 1건.
     *
     * @param type     approval | document | auction | settlement | system
     * @param title    작업 라벨(예: "결재 대기", "신고서류 제출")
     * @param target   대상(문서/행사/부스/청구 식별 텍스트 — 민감정보 아님)
     * @param dueDate  마감일(YYYY-MM-DD, 없으면 null)
     * @param dday     D-day(오늘 기준 잔여 일수, 음수=경과, 없으면 null)
     * @param severity normal | warning(D-3 이내) | overdue(기한 경과)
     * @param route    프론트 라우트 딥링크
     */
    public record TodoItem(String type, String title, String target,
                           String dueDate, Integer dday, String severity, String route) {
    }

    /**
     * 진행 중·다가오는 전시 쇼케이스 1건(GET /api/home/showcase).
     *
     * @param status ongoing | upcoming | ended(날짜 기준 파생)
     * @param dday   개장까지 잔여 일수(진행 중=0 이하, 없으면 null). {@code posterUrl} NULL 시 프론트가 폴백 카드 렌더.
     */
    public record ShowcaseItem(String id, String name, String startDate, String endDate,
                               String hallLabel, String posterUrl, String status, Integer dday) {
    }

    /**
     * 전시장(센터) 구분 항목(GET /api/home/hall-centers). 캘린더/리스트 세그먼트 필터의 동적 옵션.
     * 프론트는 이 목록 앞에 "전체"를 붙여 렌더한다(하드코딩 금지 — 3·4관 신설 시 자동 확장).
     *
     * @param code  센터 코드(홀 마스터 {@code exhibition_center} 정수의 문자열)
     * @param label 표시 라벨(예: "제1전시장")
     */
    public record HallCenter(String code, String label) {
    }

    /** 역할별 KPI 요약(GET /api/home/summary). */
    public record SummaryResponse(String role, List<SummaryTile> tiles) {
    }

    /**
     * KPI 타일 1개.
     *
     * @param key      타일 키(프론트 i18n·아이콘 매핑)
     * @param label    표시 라벨
     * @param value    수치 값(집계 결과, null 가능 → 프론트 "—" 플레이스홀더)
     * @param unit     단위(예: "건", "명"; 없으면 null)
     * @param dday     D-day 칩(임박 지표용, 없으면 null)
     * @param severity 상태색(normal | warning | overdue)
     * @param route    클릭 시 딥링크
     */
    public record SummaryTile(String key, String label, Object value, String unit,
                              Integer dday, String severity, String route) {
    }
}
