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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

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

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

    /**
     * 转换方法
     * 
     * @param sliceConfigs
     *            - 裁切图配置
     * @param sliceSet
     *            - 实际裁切图序号
     * @param tags
     *            - 原始标记内容
     * @return 原图序号与新的显示元素列表，序号从1开始
     */
    public static Map<Integer, List<PictureTag>> process(List<PictureConfigItem> sliceConfigs, Set<Integer> sliceSet,
            List<OriginTag> tags) {
        Map<Integer, List<PictureTag>> map = new HashMap<>();
        if (sliceConfigs.isEmpty()) {
            return map;
        }
        if (sliceSet.isEmpty() || tags.isEmpty()) {
            return map;
        }

        int maxWidth = 0;
        int totalHeight = 0;
        int index = 0;
        List<PictureConfigItem> slices = new ArrayList<PictureConfigItem>();
        // 计算评卷分组拼接图的总高度与最大宽度
        for (PictureConfigItem config : sliceConfigs) {
            index++;
            if (!sliceSet.contains(index)) {
                continue;
            }
            // 直接使用裁切图的宽高
            maxWidth = Math.max(maxWidth, config.getW());
            totalHeight += config.getH();
            slices.add(config);
        }
        // 遍历所有显示元素
        for (OriginTag tag : tags) {
            // 计算显示元素在拼接图内的绝对位置
            int left = (int) (maxWidth * tag.getPositionX());
            int top = (int) (totalHeight * tag.getPositionY());
            int start = 0;
            for (PictureConfigItem config : slices) {
                if (top <= (config.getH() + start)) {
                    // 根据绝对高度判断显示元素是否落在当前拼接块
                    buildTag(map, config, tag.getContent(), left, top - start);
                    break;
                } else {
                    start += config.getH();
                }
            }
        }
        return map;
    }

    /**
     * 根据计算出的拼接块，构造新的原图显示元素
     * 
     * @param tags
     *            - 原图显示元素集合
     * @param config
     *            - 当前裁切图配置
     * @param content
     *            - 显示元素内容
     * @param left
     *            - 在拼接块内的左偏移
     * @param top
     *            - 在拼接块内的上偏移
     */
    private static void buildTag(Map<Integer, List<PictureTag>> tags, PictureConfigItem config, String content,
            int left, int top) {
        PictureTag tag = new PictureTag();
        tag.setContent(content);
        // 原图内偏移=拼接块内偏移+拼接块在裁切图内偏移+裁切图在原图内偏移
        tag.setLeft(left + config.getX());
        tag.setTop(top + config.getY());

        List<PictureTag> list = tags.get(config.getI());
        if (list == null) {
            list = new LinkedList<>();
            tags.put(config.getI(), list);
        }
        list.add(tag);
    }

}
