package com.maniu.arouter;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import dalvik.system.DexFile;

/**
 * 中间人 路由表(所有的Activity的类对象的存储容器)
 */
public class ARouter {
    private static ARouter aRouter = new ARouter();
    //路由表
    private Map<String,Class<? extends Activity>> map;
    //上下文
    private Context context;

    public void init(Context context){
        this.context = context;
        //执行生成的文件的里面的putActivity的方法
        List<String> classNames =  getClassName("com.maniu.util");
        for (String className : classNames) {
            try {
                Class<?> aClass = Class.forName(className);
                //判断这个类是否是IRouter的子类
                if(IRouter.class.isAssignableFrom(aClass)){
                    //通过接口的引用指向子类的实例
                    IRouter iRouter = (IRouter) aClass.newInstance();
                    iRouter.putActivity();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private ARouter(){
        map = new HashMap<>();
    }

    public static ARouter getInstance(){
        return aRouter;
    }

    /**
     * 给路由表添加数据
     * @param key
     * @param clazz
     */
    public void addActivity(String key,Class<? extends Activity> clazz){
        if(key!=null && clazz !=null && !map.containsKey(key)){
            map.put(key,clazz);
        }
    }

    /**
     * 跳转窗体的方法
     * @param key
     * @param bundle
     */
    public void jumpActivity(String key, Bundle bundle){
        Class<? extends Activity> activityClass = map.get(key);
        if( activityClass!=null){
            Intent intent = new Intent(context,activityClass);
            if(bundle !=null){
                intent.putExtras(bundle);
            }
            context.startActivity(intent);
        }
    }


    /**
     * 通过包名获取这个包下面的所有的类名
     * @param packageName
     * @return
     */
    private List<String> getClassName(String packageName) {
        //创建一个class对象的集合
        List<String> classList = new ArrayList<>();
        String path = null;
        try {
            //通过包管理器   获取到应用信息类然后获取到APK的完整路径
            path = context.getPackageManager().getApplicationInfo(
                    context.getPackageName(), 0).sourceDir;
            //根据APK的完整路径获取到编译后的dex文件目录
            DexFile dexfile = new DexFile(path);
            // 获得编译后的dex文件中的所有class
            Enumeration entries = dexfile.entries();
            //然后进行遍历 遍历了当前应用的所有的文件 com.maniu.util.ActivityUtil1588773971051
            while (entries.hasMoreElements()) {
                //通过遍历所有的class的包名
                String name = (String) entries.nextElement();
                // 判断类的包名是否符合 com.dongnao.util
                if(name.contains(packageName)){
                    //如果符合 就添加到集合中
                    classList.add(name);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return classList;
    }

}
