/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */
package org.apache.poi.examples.ss;

import java.io.File;

import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;

/**
 * Demonstrates how to read excel styles for cells
 */
@SuppressWarnings({"java:S106","java:S4823"})
public final class CellStyleDetails {
    private CellStyleDetails() {}

    public static void main(String[] args) throws Exception {
        if(args.length == 0) {
           throw new IllegalArgumentException("Filename must be given");
        }

        try (Workbook wb = WorkbookFactory.create(new File(args[0]))) {
            DataFormatter formatter = new DataFormatter();

            for (int sn = 0; sn < wb.getNumberOfSheets(); sn++) {
                Sheet sheet = wb.getSheetAt(sn);
                System.out.println("Sheet #" + sn + " : " + sheet.getSheetName());

                for (Row row : sheet) {
                    System.out.println("  Row " + row.getRowNum());

                    for (Cell cell : row) {
                        CellReference ref = new CellReference(cell);
                        System.out.print("    " + ref.formatAsString());
                        System.out.print(" (" + cell.getColumnIndex() + ") ");

                        CellStyle style = cell.getCellStyle();
                        System.out.print("Format=" + style.getDataFormatString() + " ");
                        System.out.print("FG=" + renderColor(style.getFillForegroundColorColor()) + " ");
                        System.out.print("BG=" + renderColor(style.getFillBackgroundColorColor()) + " ");

                        Font font = wb.getFontAt(style.getFontIndex());
                        System.out.print("Font=" + font.getFontName() + " ");
                        System.out.print("FontColor=");
                        if (font instanceof HSSFFont) {
                            System.out.print(renderColor(((HSSFFont) font).getHSSFColor((HSSFWorkbook) wb)));
                        }
                        if (font instanceof XSSFFont) {
                            System.out.print(renderColor(((XSSFFont) font).getXSSFColor()));
                        }

                        System.out.println();
                        System.out.println("        " + formatter.formatCellValue(cell));
                    }
                }

                System.out.println();
            }
        }
    }

    private static String renderColor(Color color) {
       if(color instanceof HSSFColor) {
          return ((HSSFColor)color).getHexString();
       } else if(color instanceof XSSFColor) {
          return ((XSSFColor)color).getARGBHex();
       } else {
          return "(none)";
       }
    }
}
