package jnpf.util.excelv2.annotation;

import jnpf.util.excelv2.adapter.SelfDataConversionAdapter;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;

/**
 * 自定义导出 Excel 数据注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
    /**
     * 默认列高
     */
    double DEFAULT_HEIGHT = 14.0;

    /**
     * 默认列宽
     */
    double DEFAULT_WIDTH = 16.0;

    /**
     * 默认排序权重（值越小越靠前）
     */
    int DEFAULT_SORT = Integer.MAX_VALUE;

    /**
     * 默认 BigDecimal 精度（-1 表示不启用）
     */
    int DEFAULT_SCALE = -1;

    /**
     * 默认 BigDecimal 舍入模式（对应 BigDecimal.ROUND_HALF_EVEN）
     */
    int DEFAULT_ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;

    /**
     * 导出时在excel中排序
     */
    int sort() default DEFAULT_SORT;

    /**
     * 导出到 Excel 中的名字
     */
    String name() default "";

    /**
     * 日期格式，如：yyyy-MM-dd
     */
    String dateFormat() default "";

    /**
     * 读取固定内容转表达式 (如: 0=男,1=女,2=未知)
     */
    String fixDataConverter() default "";

    /**
     * 自定义数据处理器（必须是 SelfDataConversionAdapter 的子类）
     */
    Class<? extends SelfDataConversionAdapter> selfDataConversionAdapter() default SelfDataConversionAdapter.class;

    /**
     * 是否开启导出数据转换
     */
    boolean isOpenExportDataConverter() default false;

    /**
     * 是否开启导入数据转换
     */
    boolean isOpenImportDataConverter() default true;

    /**
     * 分隔符，读取字符串组内容
     */
    String separator() default ",";

    /**
     * BigDecimal 精度，-1 表示不启用格式化
     */
    int scale() default DEFAULT_SCALE;

    /**
     * BigDecimal 舍入规则（使用 BigDecimal 的舍入模式常量，如：BigDecimal.ROUND_HALF_UP）
     */
    int roundingMode() default DEFAULT_ROUNDING_MODE;

    /**
     * 导出时在 excel 中每个列的高度（单位：磅）
     */
    double height() default DEFAULT_HEIGHT;

    /**
     * 导出时在 excel 中每个列的宽度（单位：字符）
     */
    double width() default DEFAULT_WIDTH;

    /**
     * 文字后缀，如：90 变成 90%
     */
    String suffix() default "";

    /**
     * 当值为空时的默认值
     */
    String defaultValue() default "";

    /**
     * 单元格提示信息
     */
    String prompt() default "";

    /**
     * 是否允许单元格内容换行
     */
    boolean wrapText() default false;

    /**
     * 下拉选择选项（静态定义）
     */
    String[] combo() default {};

    /**
     * 下拉选择选项（从 Bean 方法动态获取，格式：className.getMethodName()）
     */
    String comboFromBeanMethod() default "";

    /**
     * 是否需要纵向合并单元格（用于处理 list 集合）
     */
    boolean needMerge() default false;

    /**
     * 是否导出数据（false 时仅导出标题，内容需手工填写）
     */
    boolean isExport() default true;

    /**
     * 关联属性名（支持多级获取，以小数点隔开）
     */
    String targetAttr() default "";

    /**
     * 是否自动统计（在最后追加一行汇总数据）
     */
    boolean isStatistics() default false;

    /**
     * 单元格数据类型
     */
    ColumnType cellType() default ColumnType.STRING;

    // ========== 样式配置开始 ==========

    /**
     * 列头背景颜色
     */
    IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;

    /**
     * 列头字体颜色
     */
    IndexedColors headerColor() default IndexedColors.WHITE;

    /**
     * 单元格背景颜色
     */
    IndexedColors backgroundColor() default IndexedColors.WHITE;

    /**
     * 单元格字体颜色
     */
    IndexedColors color() default IndexedColors.BLACK;

    /**
     * 字段对齐方式
     */
    HorizontalAlignment align() default HorizontalAlignment.CENTER;

    // ========== 样式配置结束 ==========


    /**
     * 自定义数据处理器参数
     */
    String[] args() default {};

    // ========== 超链接配置开始 ==========

    /**
     * 超链接类型（仅对 LINK 类型有效）
     */
    HyperlinkType hyperlinkType() default HyperlinkType.URL;

    /**
     * 超链接显示文本（仅对 LINK 类型有效）
     * 如果不设置，则默认显示链接地址本身
     */
    String linkText() default "";

    /**
     * 超链接显示文本的字段名（仅对 LINK 类型有效 且 字段在本类中存在）
     * 优先级高于 linkText，即如果同时设置了 linkTextField 和 linkText，将使用 linkTextField
     */
    String linkTextField() default "";

    // ========== 超链接配置结束 ==========


    /**
     * 字段用途（控制导入导出行为）
     */
    Type type() default Type.ALL;

    /**
     * 字段用途枚举
     */
    enum Type {
        /**
         * 既导入又导出
         */
        ALL(0),
        /**
         * 仅导出
         */
        EXPORT(1),
        /**
         * 仅导入
         */
        IMPORT(2);

        private final int value;

        Type(int value) {
            this.value = value;
        }

        public int value() {
            return this.value;
        }
    }

    /**
     * 单元格数据类型枚举
     */
    enum ColumnType {
        /**
         * 数字类型
         */
        NUMERIC(0),
        /**
         * 字符串类型
         */
        STRING(1),
        /**
         * 图片类型
         */
        IMAGE(2),
        /**
         * 文本类型（长文本）
         */
        TEXT(3),
        /**
         * 超链接类型
         */
        LINK(4),
        /**
         * 列表超链接类型
         */
        LINK_LIST(5);

        private final int value;

        ColumnType(int value) {
            this.value = value;
        }

        public int value() {
            return this.value;
        }
    }
}