package com.unis.sxzcl.util;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;

import androidx.core.content.FileProvider;

import com.unis.model.Constant;
import com.unis.model.DataCallback;
import com.unis.model.UrlPath;
import com.unis.model.VersionModel;
import com.unis.model.bean.VersionBean;
import com.unis.sxzcl.BuildConfig;
import com.unis.sxzcl.service.AppUpdateService;
import com.unis.sxzcl.widget.dialog.VersionDialog;
import com.xyxsbj.mylibrary.tool.LogTool;
import com.xyxsbj.mylibrary.tool.SPTool;
import com.xyxsbj.mylibrary.tool.ToastTool;
import com.xyxsbj.mylibrary.tool.VersionTool;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.io.File;
import java.util.List;

/**
 * 版本检查工具类
 * 创建人: mQ
 * 创建时间: 2021/1/8 16:03
 * 1.调用start()方法获取服务器版本信息
 * 2.线上版本大于本地版本时显示更新按钮
 * 3.用户点击更新时,启动后台服务下载安装包
 * 4.下载过程中刷新对话框中的进度
 * 5.安装包下载完切换对话框状态,并启动安装程序
 * 6.关闭页面时,请调用destroy()方法
 */
public class VersionCheckTool {

    private Context mContext;
    private UpdateCallback mUpdateCallback;
    private Error mError;
    private VersionDialog mVersionDialog;
    private String apkName;

    public VersionCheckTool(Context context) {
        mContext = context;
        init();
    }

    private void init() {
        EventBus.getDefault().register(this);
    }

    /**
     * 启动版本检查
     */
    public VersionCheckTool start() {
        getVersion();
        return this;
    }

    /**
     * 销毁
     */
    public void destroy() {
        //解除EventBus
        EventBus.getDefault().unregister(this);
    }

    /**
     * 获取线上版本
     */
    private void getVersion() {
        VersionModel.get().getVersionInfo(new DataCallback<List<VersionBean>>() {
            @Override
            public void onSuccess(List<VersionBean> data) {
                if (data == null || data.size() == 0) {
                    // 已是最新版本
                    mUpdateCallback.onUpdateListener(data, true);
                    return;
                }
                // 本地版本
                long versionCode = VersionTool.getVersionCode(mContext);
                // 对比线上版本
                VersionBean bean = data.get(0);
                apkName = bean.getFileName();
                LogTool.i("本地版本:" + versionCode + " 线上版本:" + bean.getVersionCode());
                mUpdateCallback.onUpdateListener(data, !(versionCode < bean.getVersionCode()));
            }

            @Override
            public void onError(String error) {
                super.onError(error);
                mError.onError(error);
            }
        });
    }

    /**
     * 显示版本对话框
     */
    public void showUpdateDialog(VersionBean bean) {
        if (bean == null) {
            ToastTool.showLong("没有版本信息");
            return;
        }

        // 创建对话框
        if (mVersionDialog == null)
            mVersionDialog = new VersionDialog(mContext);

        // 填充信息
        mVersionDialog.setContent(bean.getContent())
                .setVersionName("v" + bean.getVersionName())
                .setCancelable(!bean.isMust())//强制更新时不可关闭窗口
                .setUpdateListener(dialog -> {
                    SPTool.saveString(Constant.KEY_APK_PATH, UrlPath.apk_path + bean.getFileName());
                    startUpdateService();
                })
                .setInstallCallback(dialog -> install(bean.getFileName()))
                .show();
    }

    /**
     * 启动后台下载服务
     */
    private void startUpdateService() {
        Intent intent = new Intent(mContext, AppUpdateService.class);
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            mContext.startForegroundService(intent);
//        } else {
        mContext.startService(intent);
//        }
    }

    /**
     * 获取本地安装包文件
     */
    private File getApkFile(String apkName) {
        return new File(Environment.getExternalStorageDirectory() + "/Download"
                , apkName);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(VersionState bean) {
        if (bean == null) return;
        if (bean.getState() == 2) {
            ToastTool.showLong(bean.getMsg());
        } else if (bean.getState() == 1) {
            ToastTool.showLong("下载成功");
            if (mVersionDialog != null)
                mVersionDialog.showInstall();
            install(apkName);
        } else {
            if (mVersionDialog != null)
                mVersionDialog.setProgress(bean.getProgress());
        }
    }

    /**
     * 安装apk
     */
    public void install(String apkName) {
        File file = getApkFile(apkName);
        if (!file.exists()) {
            ToastTool.showLong("文件不存在");
            if (mVersionDialog != null)
                mVersionDialog.showInit();
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 使用新栈启动页面
        if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
            //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
            Uri apkUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileProvider", file);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file),
                    "application/vnd.android.package-archive");
        }
        mContext.startActivity(intent);
    }

    public VersionCheckTool setUpdateCallback(UpdateCallback updateCallback) {
        mUpdateCallback = updateCallback;
        return this;
    }

    public VersionCheckTool setError(Error error) {
        mError = error;
        return this;
    }

    public interface UpdateCallback {
        void onUpdateListener(List<VersionBean> data, boolean newest);
    }

    public interface Error {
        void onError(String error);
    }
}
