package com.hotwj.platform.reportStatistics.service;

import cn.hutool.core.date.DateUtil;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 报表数据提供者接口
 *
 * @author shihongwei
 */
public interface IReportDataProvider {

    /**
     * 获取模版编码
     *
     * @return 模版编码，如 "templates/driver/driverApplicationForm.html.vm"
     */
    String getTemplateCode();

    /**
     * 准备数据
     *
     * @param params 请求参数
     * @return 模版所需的数据 Map
     */
    Map<String, Object> prepareData(Map<String, Object> params);

    /**
     * 获取布局模版编码 (可选)
     *
     * @param params 请求参数
     * @return 布局模版编码
     */
    default String getLayoutTemplateCode(Map<String, Object> params) {
        return null;
    }

    /**
     * 获取 Mock 数据（用于预览）
     *
     * @return Mock 数据 Map
     */
    default Map<String, Object> getMockData() {
        return Map.of();
    }

    /**
     * 获取报表标题
     *
     * @return 标题，如 "驾驶员应聘表"
     */
    default String getReportTitle() {
        return "";
    }

    /**
     * 获取报表标题 (支持动态参数)
     *
     * @param params 请求参数
     * @return 标题
     */
    default String getReportTitle(Map<String, Object> params) {
        return getReportTitle();
    }

    /**
     * 是否横向布局
     *
     * @return true=横向, false=纵向(默认)
     */
    default boolean isLandscape() {
        return false;
    }

    /**
     * 获取报表类型标识 (用于一键打印等场景查找 Provider)
     * 默认返回 Bean 名称或类名
     */
    default String getReportType() {
        return this.getClass().getSimpleName();
    }

    /**
     * 获取关联的封面 Provider 类型
     *
     * @return 封面 Provider 类型，默认 "COMMON_COVER"，返回 null 表示不使用封面
     */
    default String getCoverProviderType() {
        return "COMMON_COVER";
    }

    /**
     * 获取封面数据
     * <p>
     * 默认实现返回标题和当前日期。
     * 业务 Provider 可重写此方法以提供自定义的封面数据（如副标题、描述等）。
     * </p>
     *
     * @param params 上下文参数
     * @return 封面数据
     */
    default Map<String, Object> getCoverData(Map<String, Object> params) {
        Map<String, Object> data = new HashMap<>();
        data.put("title", getReportTitle());
        data.put("date", DateUtil.format(new Date(), "yyyy年MM月dd日"));
        if (params != null) {
            data.putAll(params);
        }
        return data;
    }
}
