package shadersmod.transform;

import java.util.Iterator;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import static org.objectweb.asm.Opcodes.*;

import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.tree.MethodNode;

import shadersmod.common.SMCLog;


import net.minecraft.launchwrapper.IClassTransformer;

// for RenderManager
public class STRenderManager implements IClassTransformer {

	@Override
	public byte[] transform(String par1, String par2, byte[] par3) {
		SMCLog.fine("transforming %s %s",par1,par2);
		ClassReader cr = new ClassReader(par3);
		ClassWriter cw = new ClassWriter(cr, 0);
		CVTransform cv = new CVTransform(cw);
		cr.accept(cv,0);
		return cw.toByteArray();
	}

	private static class CVTransform extends ClassVisitor
	{
		String classname;
		boolean endFields = false;
		
		public CVTransform(ClassVisitor cv)
		{
			super(Opcodes.ASM4, cv);		
		}

		@Override
		public void visit(int version, int access, String name,
				String signature, String superName, String[] interfaces) {
			classname = name;
			//SMCLog.info(" class %s",name);
			cv.visit(version, access, name, signature, superName, interfaces);
		}

//		@Override
//		public FieldVisitor visitField(int access, String name, String desc,
//				String signature, Object value) {
//			if (Names.renderManager_entityRenderMap.name.equals(name)) {
//				access = access & (~ACC_PRIVATE & ~ACC_PROTECTED) | ACC_PUBLIC;
//			}
//			return cv.visitField(access, name, desc, signature, value);
//		}

		@Override
		public MethodVisitor visitMethod(int access, String name, String desc,
				String signature, String[] exceptions) {
			if (name.equals("getFieldEntityRenderMap") && desc.equals("()Ljava/util/Map;")) {
				return null;
			}
			return super.visitMethod(access, name, desc, signature, exceptions);
		}

		@Override
		public void visitEnd() {
			AccessorGenerator.generateFieldAccessor(cv, "entityRenderMap", Names.renderManager_entityRenderMap);
//			MethodVisitor mv;
//			mv = cv.visitMethod(ACC_PUBLIC, "getFieldEntityRenderMap", "()Ljava/util/Map;", null, null);
//			mv.visitCode();
//			mv.visitVarInsn(ALOAD, 0);
//			mv.visitFieldInsn(GETFIELD, Names.renderManager_entityRenderMap.clasName, Names.renderManager_entityRenderMap.name, Names.renderManager_entityRenderMap.desc);
//			mv.visitInsn(ARETURN);
//			mv.visitMaxs(1, 1);
//			mv.visitEnd();
//			cv.visitEnd();
		}
		
	}
}
