package cn.com.qmth.stmms.biz.utils;

import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 根据裁切图配置与评卷分组拼接配置，将各显示元素坐标转换为原图坐标
 *
 * @author luoshi
 */
public class PictureConfigTransform {

    /**
     * 转换方法
     *
     * @param sliceConfigs
     *            - 裁切图配置
     * @param groups
     *            - 评卷分组与原始元素列表
     * @return 原图序号与新的显示元素列表，序号从1开始
     */
    public static Map<Integer, List<PictureTag>> process(List<PictureConfigItem> sliceConfigs,
            Map<MarkGroup, List<OriginTag>> groups) {
        Map<Integer, List<PictureTag>> map = new HashMap<>();
        // 不判断裁切坐标是否空白，兼容新的原图遮盖模式
        int sliceCount = sliceConfigs.size();
        for (Entry<MarkGroup, List<OriginTag>> entry : groups.entrySet()) {
            // 遍历所有显示元素
            for (OriginTag tag : entry.getValue()) {
                if (tag.getOffsetIndex() > sliceCount) {
                    // 元素所属裁切图不在裁切坐标范围内，表示裁切图直接使用的原图
                    buildTag(map, tag.getContent(), tag.getOffsetIndex(), tag.getOffsetX(), tag.getOffsetY(),
                            tag.getUserId(), tag.getUserRole(), tag.getGroupNumber());
                } else {
                    // 有裁切坐标时，原图坐标=元素相对坐标+裁切坐标
                    PictureConfigItem config = sliceConfigs.get(tag.getOffsetIndex() - 1);
                    buildTag(map, tag.getContent(), config.getI(), config.getX() + tag.getOffsetX(), config.getY()
                            + tag.getOffsetY(), tag.getUserId(), tag.getUserRole(), tag.getGroupNumber());
                }
            }
        }
        return map;
    }

    /**
     * 根据计算出的拼接块，构造新的原图显示元素
     *
     * @param tags
     *            - 原图显示元素集合
     * @param content
     *            - 显示元素内容
     * @param index
     *            - 所属原图序号
     * @param left
     *            - 在原图内的左偏移
     * @param top
     *            - 在原图内的上偏移
     */
    private static void buildTag(Map<Integer, List<PictureTag>> tags, String content, int index, double left,
            double top, int userId, String userRole, int groupNumber) {
        PictureTag tag = new PictureTag();
        tag.setContent(content);
        tag.setLeft(left);
        tag.setTop(top);
        tag.setUserId(userId);
        tag.setUserRole(userRole);
        tag.setGroupNumber(groupNumber);
        List<PictureTag> list = tags.get(index);
        if (list == null) {
            list = new LinkedList<>();
            tags.put(index, list);
        }
        list.add(tag);
    }

}
