package org.itsnat.droid.impl.xmlinflater.animinterp.classtree;

import android.content.Context;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.BounceInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;

import org.itsnat.droid.impl.util.MiscUtil;
import org.itsnat.droid.impl.xmlinflater.animinterp.ClassDescInterpolatorMgr;

import java.lang.reflect.Constructor;

/**
 * Created by Jose on 15/10/2015.
 */
public class ClassDescInterpolatorNoField extends ClassDescInterpolatorBased<Interpolator>
{
    protected Class<Interpolator> clasz;
    protected Constructor<? extends Interpolator> constructor;

    public ClassDescInterpolatorNoField(ClassDescInterpolatorMgr classMgr,String tagName)
    {
        super(classMgr, tagName, null);
    }

    @Override
    public Class<Interpolator> getDeclaredClass()
    {
        return clasz;
    }

    @Override
    protected void init()
    {
        initClass();

        super.init();
    }

    //@SuppressWarnings("unchecked")
    protected Class<Interpolator> initClass()
    {
        // El motivo de ésto es evitar usar el .class lo que obliga a cargar la clase aunque no se use, así la clase nativa se carga cuando se necesita por primera vez
        if (clasz == null)
        {
            this.clasz = resolveClass();
        }
        return clasz;
    }

    @SuppressWarnings("unchecked")
    protected Class<Interpolator> resolveClass()
    {
        String tagName = getClassOrDOMElemName();
        String className = Character.toUpperCase(tagName.charAt(0)) + tagName.substring(1);

        return (Class<Interpolator>) MiscUtil.resolveClass(className);
    }

    @Override
    protected Interpolator createResourceNative(Context ctx)
    {
        // Para tres clases no hace falta crear dinámicamente los objetos
        String tagName = getClassOrDOMElemName();
        if ("accelerateDecelerateInterpolator".equals(tagName))
            return new AccelerateDecelerateInterpolator(ctx,null);
        else if ("bounceInterpolator".equals(tagName))
            return new BounceInterpolator(ctx,null);
        else if ("linearInterpolator".equals(tagName))
            return new LinearInterpolator(ctx,null);
        else
            throw MiscUtil.internalError();
    }

}

