package com.github.vbauer.jackdaw.util;

import com.github.vbauer.jackdaw.context.ProcessorContextHolder;

import javax.annotation.processing.Filer;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.tools.JavaFileObject;

/**
 * @author Vladislav Bauer
 */

public final class ProcessorUtils {

    private ProcessorUtils() {
        throw new UnsupportedOperationException();
    }


    public static JavaFileObject createSourceFile(
        final TypeElement baseElement, final String packageName, final String className
    ) throws Exception {
        final ProcessingEnvironment env = ProcessorContextHolder.getProcessingEnvironment();
        final Filer filer = env.getFiler();

        return filer.createSourceFile(packageName + SourceTextUtils.PACKAGE_SEPARATOR + className, baseElement);
    }

    public static String packageName(final TypeElement element) {
        final ProcessingEnvironment env = ProcessorContextHolder.getProcessingEnvironment();
        final Elements elementUtils = env.getElementUtils();
        final PackageElement packageElement = elementUtils.getPackageOf(element);
        return packageElement.getQualifiedName().toString();
    }

    public static TypeElement getWrappedType(final TypeMirror mirror) {
        final ProcessingEnvironment env = ProcessorContextHolder.getProcessingEnvironment();
        final Types typeUtils = env.getTypeUtils();

        final TypeKind kind = mirror.getKind();
        final boolean primitive = kind.isPrimitive();

        if (primitive) {
            return typeUtils.boxedClass((PrimitiveType) mirror);
        }
        return (TypeElement) typeUtils.asElement(mirror);
    }

}