package com.lzh.replugindemo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.net.Uri;

import com.alibaba.fastjson.JSON;
import com.lzh.compiler.parceler.Parceler;
import com.lzh.compiler.parceler.annotation.FastJsonConverter;
import com.lzh.nonview.router.Router;
import com.lzh.nonview.router.RouterConfiguration;
import com.lzh.nonview.router.anno.RouteConfig;
import com.lzh.nonview.router.host.RouterHostService;
import com.lzh.replugindemo.verify.RePluginVerification;
import com.lzh.router.RouterRuleCreator;
import com.lzh.router.replugin.core.IPluginCallback;
import com.lzh.router.replugin.host.HostRouterConfiguration;
import com.lzh.router.replugin.update.IUpdateCombine;
import com.lzh.router.replugin.update.UpdateRePluginCallbacks;
import com.qihoo360.replugin.RePluginApplication;
import com.qihoo360.replugin.RePluginCallbacks;
import com.qihoo360.replugin.RePluginConfig;

import org.lzh.framework.updatepluginlib.UpdateConfig;
import org.lzh.framework.updatepluginlib.base.UpdateChecker;
import org.lzh.framework.updatepluginlib.base.UpdateParser;
import org.lzh.framework.updatepluginlib.base.UpdateStrategy;
import org.lzh.framework.updatepluginlib.model.CheckEntity;
import org.lzh.framework.updatepluginlib.model.Update;

// 指定生成路由的baseUrl。此baseUrl会与使用RouteRule所指定的path所组合。形成一个完整的路由地址。
// 生成的路由表。参考下方添加路由规则的RouterRuleCreator类。
@RouteConfig(baseUrl = "host://")
public class HostApplication extends RePluginApplication{

    @Override
    public void onCreate() {
        super.onCreate();

        // 启动远程路由前。加入安全验证器。
        RouterHostService.setVerify(new RePluginVerification());

        HostRouterConfiguration.init("com.lzh.replugindemo", this);
        HostRouterConfiguration.get().setCallback(new PluginCallback());
        // 添加路由规则。
        RouterConfiguration.get().addRouteCreator(new RouterRuleCreator());
        Parceler.setDefaultConverter(FastJsonConverter.class);

        Router.DEBUG = true;
    }

    @Override
    protected RePluginConfig createConfig() {
        RePluginConfig config = super.createConfig();
        config.setUseHostClassIfNotFound(true);
        return config;
    }

    @Override
    protected RePluginCallbacks createCallbacks() {
        return new UpdateRePluginCallbacks(this,
                // 设置UpdateConfig。用于进行远程plugin更新。
                UpdateConfig.createConfig()
                        .setUpdateChecker(new PluginChecker())
                        .setUpdateParser(new JsonParser())
                        .setUpdateStrategy(new PluginStrategy()),
                // 设置远程插件更新接口api组装。
                new HostUpdateCombine());
    }

    /**
     * 插件接口返回数据json解析器。在此解析出接口api更新信息。并下载。
     */
    private static class JsonParser implements UpdateParser {
        @Override
        public Update parse(String httpResponse) throws Exception {

            return JSON.parseObject(httpResponse, Update.class);
        }
    }

    /**
     * 对插件api通过上方JsonParser解析后的更新实体类进行检查。检查是否需要进行更新下载安装。
     */
    private static class PluginChecker implements UpdateChecker {

        @Override
        public boolean check(Update update) throws Exception {
            return true;
        }
    }

    /**
     * 插件的更新通知策略:显示检查到有插件可用时的弹窗以及下载进度条。
     */
    private static class PluginStrategy implements UpdateStrategy {
        @Override
        public boolean isShowUpdateDialog(Update update) {
            return true;
        }

        @Override
        public boolean isAutoInstall() {
            return true;
        }

        @Override
        public boolean isShowDownloadDialog() {
            return true;
        }
    }

    /**
     * 根据插件名组装出真正的插件api地址。
     */
    private static class HostUpdateCombine implements IUpdateCombine {

        @Override
        public CheckEntity combine(String alias) {
            return new CheckEntity().setUrl("https://raw.githubusercontent.com/JumeiRdGroup/Router/master/demos/RePluginDemo/mocked/api/" + alias + ".json");
        }
    }

    private static class PluginCallback implements IPluginCallback {

        ProgressDialog dialog;

        @Override
        public void onInvalidUri(Uri uri) {
            // 当uri为非法
        }

        @Override
        public void notFound(Uri uri, String alias) {

        }

        @Override
        public void onResume(Uri uri) {

        }

        @Override
        public void onStartLoading(Uri uri, String alias) {
            if (dialog != null) {
                return;
            }
            Activity top = ActivityStackHelper.top();
            dialog = new ProgressDialog(top);
            dialog.setTitle("加载插件" + alias + "中...");
            dialog.show();
        }

        @Override
        public void onLoadedCompleted(Uri uri, String alias) {
            if (dialog == null) {
                return;
            }

            dialog.dismiss();
            dialog = null;
        }
    }
}