package cn.chenhuanming.octopus.util;


import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
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.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;

import java.awt.*;

/**
 * @author chenhuanming
 * Created at 2018/12/13
 */
@Slf4j
public class ColorUtils {

    /**
     * hex color to {@link java.awt.Color}
     *
     * @param colorStr e.g. "#FFFFFF"
     * @return null if colorStr is null
     */
    public static Color hex2Rgb(String colorStr) {
        if (colorStr == null) {
            return null;
        }
        return new Color(
                Integer.valueOf(colorStr.substring(1, 3), 16),
                Integer.valueOf(colorStr.substring(3, 5), 16),
                Integer.valueOf(colorStr.substring(5, 7), 16));
    }

    public static void setColor(Workbook workbook, Font font, Color color) {
        if (color == null) {
            return;
        }
        if (font instanceof XSSFFont) {
            ((XSSFFont) font).setColor(new XSSFColor(color));
        } else if (font instanceof HSSFFont && workbook instanceof HSSFWorkbook) {
            font.setColor(getSimilarColor((HSSFWorkbook) workbook, color).getIndex());
        } else {
            log.error("unknown font type");
        }
    }

    public static void setForegroundColor(Workbook workbook, CellStyle cellStyle, Color color) {
        if (color == null) {
            return;
        }
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        if (cellStyle instanceof XSSFCellStyle) {
            ((XSSFCellStyle) cellStyle).setFillForegroundColor(new XSSFColor(color));
        } else if (cellStyle instanceof HSSFCellStyle && workbook instanceof HSSFWorkbook) {
            cellStyle.setFillForegroundColor(getSimilarColor((HSSFWorkbook) workbook, color).getIndex());
        } else {
            log.error("unknown font type");
        }
    }

    public static void setBorderColor(Workbook workbook, CellStyle cellStyle, Color[] color) {
        if (color == null) {
            return;
        }
        if (cellStyle instanceof XSSFCellStyle) {
            ((XSSFCellStyle) cellStyle).setTopBorderColor(new XSSFColor(color[0]));
            ((XSSFCellStyle) cellStyle).setRightBorderColor(new XSSFColor(color[1]));
            ((XSSFCellStyle) cellStyle).setBottomBorderColor(new XSSFColor(color[2]));
            ((XSSFCellStyle) cellStyle).setLeftBorderColor(new XSSFColor(color[3]));
        } else if (cellStyle instanceof HSSFCellStyle && workbook instanceof HSSFWorkbook) {
            cellStyle.setTopBorderColor(getSimilarColor((HSSFWorkbook) workbook, color[0]).getIndex());
            cellStyle.setRightBorderColor(getSimilarColor((HSSFWorkbook) workbook, color[1]).getIndex());
            cellStyle.setBottomBorderColor(getSimilarColor((HSSFWorkbook) workbook, color[2]).getIndex());
            cellStyle.setLeftBorderColor(getSimilarColor((HSSFWorkbook) workbook, color[3]).getIndex());
        } else {
            log.error("unknown font type");
        }
    }

    private static HSSFColor getSimilarColor(HSSFWorkbook workbook, Color color) {
        HSSFPalette palette = workbook.getCustomPalette();
        HSSFColor result = palette.findSimilarColor(color.getRed(), color.getGreen(), color.getBlue());
        return result == null ? HSSFColor.HSSFColorPredefined.AUTOMATIC.getColor() : result;
    }

}