package com.fxy.base;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.multidex.MultiDex;
import android.util.Log;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.request.RequestOptions;
import com.elvishew.xlog.LogConfiguration;
import com.elvishew.xlog.LogLevel;
import com.elvishew.xlog.XLog;
import com.elvishew.xlog.flattener.DefaultFlattener;
import com.elvishew.xlog.printer.AndroidPrinter;
import com.elvishew.xlog.printer.ConsolePrinter;
import com.elvishew.xlog.printer.Printer;
import com.elvishew.xlog.printer.file.FilePrinter;
import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy;
import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator;
import com.lzy.ninegrid.NineGridView;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import com.fxy.baselibrary.language.LanguageCountry;
import com.fxy.baselibrary.language.other.MultiLanguageUtil;
import com.fxy.baselibrary.pagemanager.MyPageManager;
import com.fxy.baselibrary.util.JsonUtil;
import com.fxy.BuildConfig;
import com.fxy.R;
import com.fxy.bean.ActionBean;
import com.fxy.bean.UpdateModel;
import com.fxy.net.Urls;

import org.lzh.framework.updatepluginlib.UpdateConfig;
import org.lzh.framework.updatepluginlib.base.UpdateParser;
import org.lzh.framework.updatepluginlib.model.Update;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import okhttp3.OkHttpClient;
/**
 * 系统全局设置:
 * 1.日志级别
 * 2.网络请求
 * 3.多语言
 * 4.系统更新
 * 5.本地数据库
 * @author James.Jiang
 * @date   2020-01-05
 */
public class StorageApplication extends Application {
    public static StorageApplication context;
//    public LocationService locationService;

    public static StorageApplication getContext() {
        return context;
    }
    public boolean isShowUpdateToast = false;
    // 多语言数组: 英语、简体中文、繁体中文
    public static final String[] PROJECT_LANGUAGES = {
            LanguageCountry.LANGUAGE_OPTION_ES_US,
            LanguageCountry.LANGUAGE_OPTION_ZH_CN,
            LanguageCountry.LANGUAGE_OPTION_ZH_TW
    };
    private static   String overallPutOutInfo;

    public static void setOverallPutOutInfo(String overallPutOutInfo) {
        StorageApplication.overallPutOutInfo = overallPutOutInfo;
    }

    public static String getOverallPutOutInfo() {
        return overallPutOutInfo;
    }


    //static 代码段可以防止内存泄露
//    static {
        //设置全局的Header构建器
//        SmartRefreshLayout.setDefaultRefreshHeaderCreater(new DefaultRefreshHeaderCreater() {
//            @Override
//            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
//                layout.setPrimaryColorsId(R.color.bluemine, android.R.color.white);//全局设置主题颜色
//                return new CircleHeader(context).setsetSpinnerStyle(SpinnerStyle.Translate);//指定为经典Header，默认是 贝塞尔雷达Header
//            }
//        });
//        //设置全局的Footer构建器
//        SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {
//            @Override
//            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
//                //指定为经典Footer，默认是 BallPulseFooter
//                return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate);
//            }
//        });
//    }
    @Override
    public void onCreate() {
        super.onCreate();
//        MultiDex.install(this);
        context = this;
//        LitePal.initialize(this);
        MyPageManager.initWhenAppOnCreate(context,R.layout.pager_empty,R.layout.pager_loading,R.layout.pager_error);
        initLog();
        initOkGo();
        initChangeLanguage();
        initRealm();
//        LanguageSwitcher.getInstance().initLanguage(context,PROJECT_LANGUAGES);
//        NineGridView.setImageLoader(new GlideImageLoder());
        initUpdateConfig();
        //先不发送
        CrashHandler.getInstance().init(getApplicationContext());
        CrashHandler.getInstance().sendError();
//        initUmeng();
//    }
    }

    private void initRealm() {
        Realm.init(context);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("storageRealm.realm") //文件名
                .schemaVersion(0) //版本号
       .build();
        Realm.setDefaultConfiguration(config);
    }

    private void initChangeLanguage() {
        MultiLanguageUtil.getInstance().setConfiguration(context);
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {
                MultiLanguageUtil.getInstance().setConfiguration(context);
            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        MultiLanguageUtil.getInstance().setConfiguration(context);
    }
    private void initOkGo() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();

        //全局的读取超时时间
        builder.readTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        //全局的写入超时时间
        builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        //全局的连接超时时间
        builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo");
        //log打印级别，决定了log显示的详细程度
        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
        //log颜色级别，决定了log在控制台显示的颜色
        loggingInterceptor.setColorLevel(Level.INFO);
        builder.addInterceptor(loggingInterceptor);         //添加OkGo默认debug日志

        OkGo.getInstance().init(this)                       //必须调用初始化

                .setOkHttpClient(builder.build())               //建议设置OkHttpClient，不设置将使用默认的
                .setCacheMode(CacheMode.NO_CACHE)               //全局统一缓存模式，默认不使用缓存，可以不传
                .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间，默认永不过期，可以不传
                .setRetryCount(1);                             //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0
//                .addCommonHeaders(headers)                      //全局公共头
//                .addCommonParams(params)

    }
        //    private void initUmeng() {
//        PushAgent mPushAgent = PushAgent.getInstance(this);
//        mPushAgent.setDebugMode(true);
//
//        //sdk开启通知声音
//        mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
////        UmengSDK.getInstance().init(this, true);
////        UmengSDK.getInstance().onAppStart();
//        //注册推送服务 每次调用register都会回调该接口
//        mPushAgent.register(new IUmengRegisterCallback() {
//            @Override
//            public void onSuccess(String token) {
//                JLog.d("lzy", "device token: " + token);
//                deviceToken = token;
////                sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
//            }
//
//            @Override
//            public void onFailure(String s, String s1) {
//                JLog.d("lzy", "register failed: " + s + " " + s1);
////                sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
//            }
//        });
//        UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
//            @Override
//            public void dealWithCustomAction(Context context, UMessage msg) {
//                JLog.d("lzy", "==================msg.custom============" + msg.custom);
//                Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
//            }
//        };
//        mPushAgent.setNotificationClickHandler(notificationClickHandler);
//    }
//
//    public String deviceToken() {
//        return deviceToken;
//    }

    public void initLog() {
        LogConfiguration config = new LogConfiguration.Builder()
                .logLevel(BuildConfig.DEBUG ? LogLevel.ALL             // 指定日志级别，低于该级别的日志将不会被打印，默认为 LogLevel.ALL
                        : LogLevel.DEBUG)
                .tag("STO-LOG")                                         // 指定 TAG，默认为 "X-LOG"
                .t()                                                   // 允许打印线程信息，默认禁止
                .st(5)                                                 // 允许打印深度为2的调用栈信息，默认禁止
                .b()                                                   // 允许打印日志边框，默认禁止
//                .jsonFormatter(new MyJsonFormatter())                  // 指定 JSON 格式化器，默认为 DefaultJsonFormatter
//                .xmlFormatter(new MyXmlFormatter())                    // 指定 XML 格式化器，默认为 DefaultXmlFormatter
//                .throwableFormatter(new MyThrowableFormatter())        // 指定可抛出异常格式化器，默认为 DefaultThrowableFormatter
//                .threadFormatter(new MyThreadFormatter())              // 指定线程信息格式化器，默认为 DefaultThreadFormatter
//                .stackTraceFormatter(new MyStackTraceFormatter())      // 指定调用栈信息格式化器，默认为 DefaultStackTraceFormatter
//                .borderFormatter(new MyBoardFormatter())               // 指定边框格式化器，默认为 DefaultBorderFormatter
//                .addObjectFormatter(AnyClass.class,                    // 为指定类添加格式化器
//                        new AnyClassObjectFormatter())                     // 默认使用 Object.toString()
//                .addInterceptor(new BlacklistTagsFilterInterceptor(    // 添加黑名单 TAG 过滤器
//                        "blacklist1", "blacklist2", "blacklist3"))
//                .addInterceptor(new MyInterceptor())                   // 添加一个日志拦截器
                .build();

        Printer androidPrinter = new AndroidPrinter();             // 通过 android.util.Log 打印日志的打印器
        Printer consolePrinter = new ConsolePrinter();             // 通过 System.out 打印日志到控制台的打印器
        Printer filePrinter = new FilePrinter                      // 打印日志到文件的打印器
                .Builder("/sdcard/cargo-pda/pda-log/"+BuildConfig.BUILD_TYPE+"/") // 指定保存日志文件的路径
                .fileNameGenerator(new DateFileNameGenerator())        // 指定日志文件名生成器，默认为 ChangelessFileNameGenerator("log")
                .backupStrategy(new NeverBackupStrategy() )             // 指定日志文件备份策略，默认为 FileSizeBackupStrategy(1024 * 1024)
                        .logFlattener(new DefaultFlattener())                       // 指定日志平铺器，默认为 DefaultFlattener
                        .build();

        XLog.init(                                                 // 初始化 XLog
                config,                                                // 指定日志配置，如果不指定，会默认使用 new LogConfiguration.Builder().build()
                androidPrinter,                                        // 添加任意多的打印器。如果没有添加任何打印器，会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
                consolePrinter,
                filePrinter);
    }


    private void initUpdateConfig(){
        UpdateConfig.getConfig()
                // 必填：数据更新接口,url与checkEntity两种方式任选一种填写
                .setUrl(Urls.getVersionUpdate(context) + "?v=" + UUID.randomUUID().toString())
//                .checkEntity(new CheckEntity().setMethod(HttpMethod.GET).setUrl("Urls.update"))
                // 必填：用于从数据更新接口获取的数据response中。解析出Update实例。以便框架内部处理
                .setUpdateParser(new UpdateParser() {
                    @Override
                    public Update parse(String response) {
                        Log.d("CARGO-LOG", response != null ? response : "null");
                        /* 此处根据上面url或者checkEntity设置的检查更新接口的返回数据response解析出
                         * 一个update对象返回即可。更新启动时框架内部即可根据update对象的数据进行处理
                         */
                        Update update = new Update();
                        ActionBean bean = JsonUtil.getObject(response, ActionBean.class);
                        if (bean.code == 0) {
                            UpdateModel updateModel = JsonUtil.getObject(bean.data, UpdateModel.class);
                            if (updateModel != null ) {
                                update.setForced(updateModel.isForced());
                                update.setIgnore(updateModel.isIgnore());
                                update.setUpdateContent(updateModel.getUpdateContent());
                                update.setUpdateUrl(updateModel.getUpdateUrl());
                                update.setVersionCode(updateModel.getVersionCode());
                                update.setVersionName(updateModel.getVersionName());
                            }
                        }
//                        // 此处模拟一个Update对象
//                        Update update = new Update(response);
//                        // 此apk包的更新时间
//                        update.setUpdateTime(System.currentTimeMillis());
//                        // 此apk包的下载地址
//                        update.setUpdateUrl(apkFile);
//                        // 此apk包的版本号
//                        update.setVersionCode(2);
//                        // 此apk包的版本名称
//                        update.setVersionName("2.0");
//                        // 此apk包的更新内容
//                        update.setUpdateContent("测试更新");
//                        // 此apk包是否为强制更新
//                        update.setForced(false);
//                        // 是否显示忽略此次版本更新按钮
//                        update.setIgnore(true);
                        return update;
                    }

                });
    }


    @Override
    protected void attachBaseContext(Context context) {
        // 初始化多语言
        MultiLanguageUtil.init(context);
        super.attachBaseContext(MultiLanguageUtil.getInstance().setConfiguration(context));
        MultiDex.install(context);
    }


    private class GlideImageLoder implements NineGridView.ImageLoader {

        @Override
        public void onDisplayImage(Context context, ImageView imageView, String url) {
            RequestOptions options = new RequestOptions()
                    .centerCrop()
                    .placeholder(R.drawable.ic_default_img)
                    .error(R.drawable.ic_default_img)
                    .priority(Priority.HIGH);
            Glide.with(context).load(url).apply(options).into(imageView);
        }

        @Override
        public Bitmap getCacheImage(String url) {
            return null;
        }
    }
}
