package com.jsoniter.output;

import com.jsoniter.spi.Decoder;
import com.jsoniter.spi.EmptyEncoder;
import com.jsoniter.spi.Encoder;
import com.sun.org.apache.xml.internal.utils.StringBufferPool;
import javassist.*;

class DynamicCodegen {

    static ClassPool pool = ClassPool.getDefault();

    static {
        pool.insertClassPath(new ClassClassPath(Encoder.class));
    }

    public static Encoder gen(Class clazz, String cacheKey, CodegenResult source) throws Exception {
        source.flushBuffer();
        CtClass ctClass = pool.makeClass(cacheKey);
        ctClass.setInterfaces(new CtClass[]{pool.get(Encoder.class.getName())});
        ctClass.setSuperclass(pool.get(EmptyEncoder.class.getName()));
        String staticCode = source.toString();
        CtMethod staticMethod = CtNewMethod.make(staticCode, ctClass);
        ctClass.addMethod(staticMethod);
        String wrapperCode = source.generateWrapperCode(clazz);
        if ("true".equals(System.getenv("JSONITER_DEBUG"))) {
            System.out.println(">>> " + cacheKey);
            System.out.println(wrapperCode);
            System.out.println(staticCode);
        }
        CtMethod interfaceMethod = CtNewMethod.make(wrapperCode, ctClass);
        ctClass.addMethod(interfaceMethod);
        return (Encoder) ctClass.toClass().newInstance();
    }
}
