package com.zioinfo.kintex.report.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

import java.util.List;
import java.util.Map;

/**
 * 범용 그리드 PDF 출력 요청 — 프론트 그리드가 <b>현재 표시 중인 컬럼·행을 그대로</b> 전송한다.
 * 서버는 컬럼 정의에 맞춰 JasperReports 동적 컬럼 리포트를 렌더해 application/pdf 로 응답한다.
 *
 * <p>방어적 제한: 컬럼 최대 30개, 행 최대 5,000개(초과 시 {@code VALIDATION} 400).
 * PII·자격증명 컬럼이 오더라도 서버는 받은 그대로 렌더하므로(전 그리드 공용) 별도 마스킹은 하지 않는다.
 *
 * @param title    리포트 상단 제목(필수). 예: "부스 배치 현황"
 * @param subtitle 제목 아래 부제(선택). 예: "2026 국제전시 · K1 홀"
 * @param columns  표시 컬럼 정의(순서=화면 표시 순서). 최소 1개.
 * @param rows     행 목록. 각 행은 {@code key → 값} 맵. 값은 문자열로 변환되어 렌더된다.
 */
public record GridPdfRequest(
        @NotBlank(message = "title 은 필수입니다.")
        @Size(max = 200, message = "title 은 200자 이하여야 합니다.")
        String title,

        @Size(max = 300, message = "subtitle 은 300자 이하여야 합니다.")
        String subtitle,

        @NotEmpty(message = "columns 는 최소 1개 이상이어야 합니다.")
        @Size(max = 30, message = "columns 는 최대 30개까지 지원합니다.")
        @Valid
        List<Column> columns,

        @NotNull(message = "rows 는 필수입니다(빈 배열 허용).")
        @Size(max = 5000, message = "rows 는 최대 5,000행까지 지원합니다.")
        List<Map<String, Object>> rows
) {

    /**
     * 컬럼 정의.
     *
     * @param key   행 맵에서 값을 조회할 키(필수). 예: "boothNo"
     * @param label 헤더에 표시할 라벨(필수). 예: "부스 번호"
     * @param width 상대 폭 가중치(선택, &gt;0). null/0 이면 균등 분할. 예: 2 → 다른 1 컬럼의 2배 폭.
     * @param align 셀 정렬(선택): "left"(기본) | "center" | "right".
     */
    public record Column(
            @NotBlank(message = "column.key 는 필수입니다.")
            @Size(max = 100)
            String key,

            @NotBlank(message = "column.label 은 필수입니다.")
            @Size(max = 100)
            String label,

            Integer width,
            String align
    ) {
    }
}
