package com.example;

import java.io.FileOutputStream;
import java.nio.file.Path;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class FillPatternTypeSamples {

    public static void main(String[] args) throws Exception {
        // 出力先（必要に応じて変更）
        Path out = Path.of("FillPatternType_Samples.xlsx");

        try (Workbook wb = new XSSFWorkbook()) {
            Sheet sheet = wb.createSheet("FillPatternType Samples");

            // 見やすさ調整
            sheet.setColumnWidth(0, 34 * 256); // 名称列
            for (int c = 1; c <= 10; c++) {
                sheet.setColumnWidth(c, 10 * 256); // サンプル領域（結合するので全部同じ幅）
            }

            // ヘッダ
            {
                Row r = sheet.createRow(0);
                r.setHeightInPoints(22);
                Cell h1 = r.createCell(0);
                h1.setCellValue("FillPatternType");
                Cell h2 = r.createCell(1);
                h2.setCellValue("Sample");

                CellStyle header = wb.createCellStyle();
                Font f = wb.createFont();
                f.setBold(true);
                header.setFont(f);
                header.setAlignment(HorizontalAlignment.CENTER);
                header.setVerticalAlignment(VerticalAlignment.CENTER);
                header.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                header.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                setThinBorder(header);

                h1.setCellStyle(header);
                h2.setCellStyle(header);

                // "Sample" は横に結合して見出しを広く
                sheet.addMergedRegion(new CellRangeAddress(0, 0, 1, 10));
                for (int c = 2; c <= 10; c++) {
                    Cell hc = r.createCell(c);
                    hc.setCellStyle(header);
                }
            }

            // 全パターンを出力
            FillPatternType[] patterns = FillPatternType.values();
            int rowIndex = 1;

            for (FillPatternType pt : patterns) {
                Row row = sheet.createRow(rowIndex);
                row.setHeightInPoints(26);

                // 名称セル
                Cell name = row.createCell(0);
                name.setCellValue(pt.name());

                CellStyle nameStyle = wb.createCellStyle();
                nameStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                setThinBorder(nameStyle);
                name.setCellStyle(nameStyle);

                // サンプルセル領域（1..10 を結合して 1セル表示に見せる）
                sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 1, 10));

                Cell sample = row.createCell(1);
                sample.setCellValue(""); // 見本なので空でOK
                CellStyle sampleStyle = createPatternStyle(wb, pt);
                sample.setCellStyle(sampleStyle);

                // 結合領域の残りセルにも同じスタイル（罫線・塗りを綺麗に出すため）
                for (int c = 2; c <= 10; c++) {
                    Cell sc = row.createCell(c);
                    sc.setCellStyle(sampleStyle);
                }

                rowIndex++;
            }

            // 書き出し
            try (FileOutputStream fos = new FileOutputStream(out.toFile())) {
                wb.write(fos);
            }
        }

        System.out.println("Created: " + out.toAbsolutePath());
    }

    private static CellStyle createPatternStyle(Workbook wb, FillPatternType pt) {
        CellStyle st = wb.createCellStyle();

        // 罫線
        setThinBorder(st);

        // パターン設定
        st.setFillPattern(pt);

        // 見やすい配色（基本：前景=黒、背景=白）
        // ただし SOLID_FOREGROUND は単色塗りとしてグレーにしておくと「埋まってる」感が出ます
        if (pt == FillPatternType.NO_FILL) {
            // NO_FILL は塗り無し（色を設定しても意味が薄いので何もしない）
        } else if (pt == FillPatternType.SOLID_FOREGROUND) {
            st.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
        } else {
            st.setFillForegroundColor(IndexedColors.BLACK.getIndex());
            st.setFillBackgroundColor(IndexedColors.WHITE.getIndex());
        }

        return st;
    }

    private static void setThinBorder(CellStyle st) {
        st.setBorderTop(BorderStyle.THIN);
        st.setBorderBottom(BorderStyle.THIN);
        st.setBorderLeft(BorderStyle.THIN);
        st.setBorderRight(BorderStyle.THIN);
    }
}
