import 'dart:convert';

import 'package:apk_update/utils/toast_util.dart';
import 'package:apk_update/widget/update_dialog.dart';
import 'package:dio/dio.dart';
import 'package:flustars_flutter3/flustars_flutter3.dart';
import 'package:flutter/material.dart';
import 'package:get/route_manager.dart';
import 'package:url_launcher/url_launcher.dart';

// 获取版本号
const String getSystemVersionByNumber =
    "/user-service/system/version/getSystemVersionByNumber";
// 获取OSS 下载授权ak sk token
const String generateByExt = "/msl-document/common/oss/generateByExt";
const currentDay = "current_day";
const dateFormat = "yyyy-MM-dd";

/// 获取更新版本信息
/// url 请求地址
/// versionNumber 当前应用versionCode
/// productNo 产品号
/// onceDay 一天提示一次(应用首页设置true)
void checkVersion(
    {required String url,
    required Method method,
    Map<String, dynamic>? params,
    Map<String, dynamic>? header,
    bool onceDay = false,
    Function()? jumpAppStore, // 跳转AppStore
    Function(String? path)? installApk, // 安装Apk
    Function()? downloadApkError, // 下载Apk错误
    Function(String? path,String? apkPath)? downloadApk, // 使用OSS下载Apk
    int? isOssDownload //1 使用OSS下载
    }) async {
  try {
    final Response response = await Dio().request(
      url,
      options: Options(method: method.value, headers: header),
      queryParameters: params,
      data: params,
    );
    // 网络请求成功
    _printLog(response); // 打印日志
    var responseData = response.data;
    if (responseData.runtimeType == String) {
      // 兼容后端数据返回string
      responseData = json.decode(responseData);
    }
    if (responseData?["code"] != 0) {
      ToastUtil.showToast(responseData?["msg"]);
      return;
    }
    var result = responseData?["data"];
    //获取当前时间
    String spCurrent = SpUtil.getString(currentDay) ?? "";
    String current = DateUtil.formatDate(DateTime.now(), format: dateFormat);
    //一天提示一次升级 & 非强升 & 当天已提示 => 不再提示
    if (onceDay && result?['versionForce'] == 0 && spCurrent == current) {
      // 不再提示
      return;
    }
    //缓存当前时间
    SpUtil.putString(currentDay, current);
    // 一天提示一次升级,是在应用首次设置,不需要提示最新版本toast
    if (!onceDay && result == null) {
      // 当前已经是最新版本
      ToastUtil.showToast("当前已经是最新版本");
      return;
    }
    if (result == null) {
      // 无升级任务,拦截
      return;
    }
    // 升级弹框提示
    Get.dialog(
      UpdateDialog(
        title: result['versionName'],
        content: result['tipContent'] ?? result['versionContent'],
        isUpdateMore: result['versionForce'] == 1,
        versionPath: result['versionPath'],
        jumpAppStore: jumpAppStore,
        installApk: installApk,
        isOssDownload: isOssDownload,
        downloadApk: downloadApk,
        downloadApkError: downloadApkError,
      ),
    );
  } on DioException catch (e) {
    _printLog(e.response); // 打印日志
    ToastUtil.showToast("服务器请求错误");
  }
}

/// 打开浏览器
Future<void> openBrowser(String stringUrl) async {
  final Uri url = Uri.parse(stringUrl);

  if (!await launchUrl(url, mode: LaunchMode.externalApplication)) {
    throw Exception('Could not launch $url');
  }
}

enum Method {
  get,
  post,
  put,
  patch,
  delete,
}

extension MethodExtension on Method {
  String get value => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'][index];
}

/// 日志打印
_printLog(Response? response) {
  var responseData = response?.data;
  var requestOptions = response?.requestOptions;
  var headers = response?.headers;
  debugPrint("========== 网络请求响应 ==========\n"
      "statusCode:${response?.statusCode} \n"
      "statusMessage:${response?.statusMessage}\n"
      "method:${requestOptions?.method}\n"
      "path:${requestOptions?.path}\n"
      "headers:${headers?.map}\n\n"
      "queryParameters:${requestOptions?.queryParameters}\n"
      "data:${requestOptions?.data}\n"
      "responseData:$responseData\n");
}