package com.knight.arch;

import android.app.Application;

import com.facebook.stetho.Stetho;
import com.knight.arch.model.AccessTokenResponse;
import com.knight.arch.module.AppModule;
import com.knight.arch.module.Injector;
import com.orhanobut.logger.LogLevel;
import com.orhanobut.logger.Logger;
import com.umeng.analytics.MobclickAgent;

import java.util.Arrays;
import java.util.List;

import dagger.ObjectGraph;

/**
 * @author andyiac
 * @date 15-8-4
 * @web http://blog.andyiac.com/
 */
public class ClientApplication extends Application implements Injector {
    private static final String LOGGER_TAG = "<<=TAG=>>";

    private AccessTokenResponse accessTokenResponse;

    private ObjectGraph objectGraph;

    public void onCreate() {
        super.onCreate();
        initStetho();
        initLogger();
        initDagger();
        initUmeng();
    }

    private void initUmeng() {
        MobclickAgent.openActivityDurationTrack(false);
    }


    private void initDagger() {
        objectGraph = ObjectGraph.create(getModules().toArray());
        objectGraph.inject(this);
    }

    private void initLogger() {
        Logger.init(LOGGER_TAG)               // default PRETTYLOGGER or use just init()
                .setMethodCount(4)            // default 2
                .setLogLevel(LogLevel.FULL)   // default LogLevel.FULL
                .setMethodOffset(2);          // default 0
               //.hideThreadInfo()             // default shown
    }

    private void initStetho() {
        Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
                        .build());
    }

    public List<Object> getModules() {
        return Arrays.<Object>asList(new AppModule(this));
    }

    @Override
    public void inject(Object target) {
        this.objectGraph.inject(target);
    }

    @Override
    public ObjectGraph plus(Object[] modules) {
        return objectGraph.plus(modules);
    }

    public ObjectGraph plus(Injector injector) {
        return this.objectGraph.plus(injector.getModules().toArray());
    }
}