package com.zioinfo.kintex.report;

import com.zioinfo.kintex.common.error.ApiException;
import com.zioinfo.kintex.report.dto.GridPdfRequest;
import org.junit.jupiter.api.Test;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * 범용 그리드 PDF 렌더 단위테스트 — 샘플 컬럼/행 → PDF 바이트 생성 + %PDF 매직 검증.
 * (Spring 컨텍스트 없이 서비스 직접 인스턴스화 — jrxml·폰트확장은 클래스패스 리소스로 로드.)
 */
class GridReportServiceTest {

    private final GridReportService service = new GridReportService();

    @Test
    void render_producesPdfBytes_withKoreanColumnsAndRows() {
        List<GridPdfRequest.Column> columns = List.of(
                new GridPdfRequest.Column("boothNo", "부스 번호", 1, "center"),
                new GridPdfRequest.Column("company", "참가업체", 2, "left"),
                new GridPdfRequest.Column("areaM2", "면적(㎡)", 1, "right"),
                new GridPdfRequest.Column("status", "상태", 1, "center"));

        List<Map<String, Object>> rows = new ArrayList<>();
        for (int i = 1; i <= 120; i++) { // 여러 페이지 유발 → 페이지 번호/헤더 반복 경로 검증
            Map<String, Object> r = new LinkedHashMap<>();
            r.put("boothNo", "K1-" + String.format("%03d", i));
            r.put("company", "주식회사 킨텍스전시 " + i);
            r.put("areaM2", 18 * i % 400);
            r.put("status", i % 2 == 0 ? "배정완료" : "대기");
            rows.add(r);
        }

        GridPdfRequest req = new GridPdfRequest("부스 배치 현황", "2026 국제전시 · K1 홀", columns, rows);
        byte[] pdf = service.render(req);

        assertNotNull(pdf);
        assertTrue(pdf.length > 1000, "PDF 바이트가 비정상적으로 작음: " + pdf.length);
        String magic = new String(pdf, 0, 5, StandardCharsets.US_ASCII);
        assertTrue(magic.startsWith("%PDF"), "PDF 매직 헤더가 아님: " + magic);
    }

    @Test
    void render_emptyRows_stillProducesPdf() {
        GridPdfRequest req = new GridPdfRequest(
                "빈 그리드",
                null,
                List.of(new GridPdfRequest.Column("a", "컬럼A", null, null)),
                List.of());
        byte[] pdf = service.render(req);
        assertTrue(pdf.length > 500 && new String(pdf, 0, 4, StandardCharsets.US_ASCII).equals("%PDF"));
    }

    @Test
    void render_noColumns_throwsValidation() {
        GridPdfRequest req = new GridPdfRequest("t", null, List.of(), List.of());
        assertThrows(ApiException.class, () -> service.render(req));
    }
}
