package com.yanzuoguang.util;


import com.yanzuoguang.util.base.ObjectHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.util.helper.StringHelper;
import com.yanzuoguang.util.printer.ConvertPlan;
import com.yanzuoguang.util.printer.format.FormatCenter;
import com.yanzuoguang.util.printer.vo.PrinterPagerData;
import com.yanzuoguang.util.printer.vo.PrinterPagerItemData;
import com.yanzuoguang.util.vo.MapRow;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 打印工具处理类
 *
 * @author 颜佐光
 */
public class PrinterHelper {

    /**
     * 将来源模板与数据转换为目标模板和数据
     *
     * @param pager    来源模板
     * @param dataList 来源数据
     * @return 转换后的结果
     */
    public static ConvertPlan<MapRow> convertArray(String pager, double left, double top, Object... dataList) {
        return convertList(pager, left, top, Arrays.asList(dataList));
    }

    /**
     * 将来源模板与数据转换为目标模板和数据
     *
     * @param pager 来源模板
     * @param list  来源数据
     * @return 转换后的结果
     */
    public static <T> ConvertPlan<MapRow> convertList(String pager, double left, double top, List<T> list) {
        ConvertPlan<T> from = new ConvertPlan<>();
        from.setPager(pager);
        from.setDatas(list);
        return convert(from, left, top);
    }

    /**
     * 将来源模板转换为目标模板
     *
     * @param from 来源计划
     * @param left 左边距离
     * @param top  右边距离
     * @return 打印结果
     */
    public static ConvertPlan<MapRow> convert(ConvertPlan<?> from, double left, double top) {
        // 设置生成结果
        ConvertPlan<MapRow> to = new ConvertPlan<>();
        // 判断是否为空
        if (StringHelper.isEmpty(from.getPager()) || from.getDatas() == null || from.getDatas().size() < 1) {
            return to;
        }
        // 解析模板格式
        PrinterPagerData pager;
        try {
            pager = JsonHelper.deserialize(from.getPager(), PrinterPagerData.class);
        } catch (Exception ex) {
            throw YzgError.getRuntimeException(ex, "047", ex.getMessage());
        }
        // 设置偏移量
        pager.setMarginTop(pager.getMarginTop() + top);
        pager.setMarginLeft(pager.getMarginLeft() + left);

        // 初始化目标数据
        int length = from.getDatas().size();
        for (int i = 0; i < length; i++) {
            to.getDatas().add(new MapRow());
        }
        // 遍历模板,对每个模板格式化字符串进行处理
        for (PrinterPagerItemData item : pager.getItems()) {
            // 判断是否需要格式化
            if (StringHelper.isEmpty(item.getFormat()) && !StringHelper.isEmpty(item.getName())) {
                item.setFormat("{0}");
            }
            // 生成目标格式化字符串
            String format = StringHelper.getFormat(item.getFormat(), item.getName(), (sb, group, fieldFull, field, command) -> {
                // 对现有的字段进行加密
                sb.append("{");
                String fieldTo = field;
                if (!StringHelper.isEmpty(command)) {
                    fieldTo = StringHelper.md5(fieldFull);
                }
                sb.append(fieldTo);
                sb.append("}");

                // 写入加密后的数目
                for (int i = 0; i < length; i++) {
                    Object rowFrom = from.getDatas().get(i);
                    String fromValue = ObjectHelper.getString(rowFrom, field);
                    String toValue = fromValue;
                    if (!StringHelper.isEmpty(command)) {
                        toValue = FormatCenter.getFormatValue(command, fromValue);
                    }
                    MapRow rowTo = to.getDatas().get(i);
                    rowTo.put(fieldTo, toValue);
                }
            });
            item.setFormat(format);
        }
        // 设置生成模板
        to.setPager(JsonHelper.serialize(pager));
        return to;
    }

    /**
     * 将数据格式化为新得数据,用于转换单行数据
     *
     * @param resultTo     结果数据
     * @param resultFrom   结果来源
     * @param format       格式化
     * @param defaultField 默认字段
     * @return 格式化后的字符串
     */
    public static String getFormatTo(Map<String, Object> resultTo, Object resultFrom,
                                     String format, String defaultField) {
        return StringHelper.getFormat(format, defaultField, (sb, group, fieldFull, field, command) -> {
            sb.append("{");
            Object fieldValue = ObjectHelper.get(resultFrom, field);
            String fieldTo = field;
            if (!StringHelper.isEmpty(command)) {
                fieldTo = StringHelper.md5(fieldFull);
            }
            sb.append(fieldTo);
            resultTo.put(fieldTo, fieldValue);
            sb.append("}");
        });
    }

    /**
     * 获取结果字符串,用于转换单行数据,调用本方法前请先调用getFormatTo函数
     *
     * @param resultFrom 来源字符
     * @param format     格式化字符串
     * @return 获取结果字符串
     */
    public static String getResult(Object resultFrom, String format) {
        return StringHelper.getFormat(format, StringHelper.EMPTY, (sb, group, fieldFull, field, command) -> {
            Object fieldValue = ObjectHelper.get(resultFrom, field);
            sb.append(fieldValue);
        });
    }
}