package me.lpk.mapping;

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

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.tree.ClassNode;

public class MappingProcessor {

	/**
	 * Given a map of ClassNodes and mappings, returns a map of class names to
	 * class bytes.
	 * 
	 * @param nodes
	 * @param mappings
	 * @return
	 */
	public static Map<String, byte[]> process(Map<String, ClassNode> nodes, Map<String, MappedClass> mappings, boolean useMaxs) {
		Map<String, byte[]> out = new HashMap<String, byte[]>();
		SkidRemapper mapper = new SkidRemapper(mappings);
		try {
			for (ClassNode cn : nodes.values()) {
				ClassWriter cw = new MappingClassWriter(mappings, useMaxs ? ClassWriter.COMPUTE_MAXS : ClassWriter.COMPUTE_FRAMES);
				ClassVisitor remapper = new ClassRemapper(cw, mapper);
				cn.accept(remapper);
				out.put(mappings.containsKey(cn.name) ? mappings.get(cn.name).getNewName() : cn.name, cw.toByteArray());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return out;
	}
}