package com.bpa.scalage.HBL.Update;


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

import androidx.core.content.FileProvider;

import com.bpa.scalage.HBL.Dialog.AlertDialogButton;
import com.bpa.scalage.HBL.Dialog.DialogManager;
import com.bpa.scalage.helper.Json;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;

import java.io.File;

import okhttp3.MediaType;
import okhttp3.RequestBody;

/**
 * Created by LY on 2019/4/1.
 */
public class UpdateAppUtils {

    /**
     * apk下载地址
     */
    private static String downloadUrl = "";
    /**
     * 当前版本号
     */
    private static String myVersionCode = "1.12";
    /**
     * 服务器的版本号
     */
    private static String serviceVersionCode = "1.0";
    /**
     * 服务器的版本号名称
     */
    private static String serviceVersionName = "";
    /**
     * 更新说明
     */
    private static String description = "";

    private static Context context;

    /**
     * 设置当前app版本
     * @param version 版本号
     */
    public static void setVersion(String version){
        myVersionCode=version;
    }

    /**
     * 更新APP版本入口
     */
    public static void updateApp(Context _context) {
        context=_context;
        //获取当前app版本号
//        myVersionCode = ConfigName.getInstance().Version;//AppUtils.getVersionCode(context);
        //获取json转成Gson，并获取版本等信息
        doPost(_context);
    }
    /**
     * 请求后台服务器，检查apk版本
     */
    private static void doPost(final Context context) {
        VersionMode mode=new VersionMode();
        //大炒
        mode.productCode="1764831932288446464";
        mode.moduleCode="fryingpan";
        mode.serverCode="1764839495105097728";
        mode.branchCode="1764832217979269121";

        String msg= new Json<VersionMode>().objectToJson(VersionMode.class, mode);
        String getNewVersionUrl ="http://111.9.47.105:18097/api/Version/GetLatest";
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(JSON, String.valueOf(msg));
        OkGo.<ResVersion>post(getNewVersionUrl)
                .tag(context)
                .upRequestBody(body)
                .execute(new JsonDialogCallback<ResVersion>(context) {
                    @Override
                    public void onSuccess(Response<ResVersion> response) {
                        ResVersion version= response.body();
                        if (version != null && version.data!=null) {
                            serviceVersionCode = version.data.versionNo;
                            description = version.data.description==null?"暂无描述":version.data.description;
                            //获取apk下载地址
                            downloadUrl = version.data.downloadLink;
                            // 判断Apk是否是最新版本
                            if (compareVersions(serviceVersionCode, myVersionCode))//需要更新
                            {
                                showUpdateDialog(context);
                            } else {
//                                ToastUtils.info("当前版本已是最新版本");
                                DialogManager.showInfo("当前版本已是最新版本", AlertDialogButton.OK,null);
                            }

                        }else
                        {
//                            ToastUtils.info("服务器没有版本");
                            DialogManager.showInfo("当前版本已是最新版本", AlertDialogButton.OK,null);
                        }
                    }
                });
    }

    /**
     * 弹出下载对话框，里面有一些更新版本的信息
     */
    private static void showUpdateDialog(final Context context) {

        DialogManager.showInfo(description, AlertDialogButton.OKCancel,(s)->{
            if(s){
                downloadApk(context);
            }
        });


//        new QMUIDialog.MessageDialogBuilder(context)
//                .setCancelable(false)
//                .setTitle("发现新版本")
//                .setMessage(description)
//                .addAction("取消", new QMUIDialogAction.ActionListener() {
//                    @Override
//                    public void onClick(QMUIDialog dialog, int index) {
//                        dialog.dismiss();
//                    }
//                })
//                .addAction("去更新", new QMUIDialogAction.ActionListener() {
//                    @Override
//                    public void onClick(QMUIDialog dialog, int index) {
//                        downloadApk(context);
//                        dialog.dismiss();
//                    }
//                })
//                .create(AlertDialogUtils.mCurrentDialogStyle)
//                .show();
    }

    private static void downloadApk(final Context context) {
        OkGo.<File>get(downloadUrl)
                .tag(context)
                .execute(new FileProgressDialogCallBack(context) {
                    @Override
                    public void onSuccess(Response<File> response) {
                        File file = response.body();
                        String absolutePath = file.getAbsolutePath();
                        installApk(context, absolutePath);
                    }
                });
    }

    /**
     * 跳转apk安装界面
     */
    public static void installApk(Context context, String filePath) {
//        ConfigName.getInstance().Version=serviceVersionCode;
//        ConfigData.getInstance().SavePZ();

        Intent i = new Intent(Intent.ACTION_VIEW);
        File file = new File(filePath);
        if (file.length() > 0 && file.exists() && file.isFile()) {
            //判断是否是AndroidN以及更高的版本
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", file);
                i.setDataAndType(contentUri, "application/vnd.android.package-archive");
            } else {
                i.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            context.startActivity(i);
        }
    }

    /**
     * 如果版本1 大于 版本2 返回true 否则返回fasle 支持 2.2 2.2.1 比较
     * 支持不同位数的比较  2.0.0.0.0.1  2.0 对比
     *
     * @param v1 版本服务器版本 " 1.1.2 "
     * @param v2 版本 当前版本 " 1.2.1 "
     * @return ture ：需要更新 false ： 不需要更新
     */
    public static boolean compareVersions(String v1, String v2) {
        //判断是否为空数据
        if (v1.isEmpty() || v2.isEmpty()) {
            return false;
        }
        String[] str1 = v1.split("\\.");
        String[] str2 = v2.split("\\.");

        if (str1.length == str2.length) {
            for (int i = 0; i < str1.length; i++) {
                if (Integer.parseInt(str1[i]) > Integer.parseInt(str2[i])) {
                    return true;
                } else if (Integer.parseInt(str1[i]) < Integer.parseInt(str2[i])) {
                    return false;
                } else if (Integer.parseInt(str1[i]) == Integer.parseInt(str2[i])) {

                }
            }
        } else {
            if (str1.length > str2.length) {
                for (int i = 0; i < str2.length; i++) {
                    if (Integer.parseInt(str1[i]) > Integer.parseInt(str2[i])) {
                        return true;
                    } else if (Integer.parseInt(str1[i]) < Integer.parseInt(str2[i])) {
                        return false;

                    } else if (Integer.parseInt(str1[i]) == Integer.parseInt(str2[i])) {
                        if (str2.length == 1) {
                            continue;
                        }
                        if (i == str2.length - 1) {

                            for (int j = i; j < str1.length; j++) {
                                if (Integer.parseInt(str1[j]) != 0) {
                                    return true;
                                }
                                if (j == str1.length - 1) {
                                    return false;
                                }

                            }
                            return true;
                        }
                    }
                }
            } else {
                for (int i = 0; i < str1.length; i++) {
                    if (Integer.parseInt(str1[i]) > Integer.parseInt(str2[i])) {
                        return true;
                    } else if (Integer.parseInt(str1[i]) < Integer.parseInt(str2[i])) {
                        return false;

                    } else if (Integer.parseInt(str1[i]) == Integer.parseInt(str2[i])) {
                        if (str1.length == 1) {
                            continue;
                        }
                        if (i == str1.length - 1) {
                            return false;

                        }
                    }

                }
            }
        }
        return false;
    }
}
