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";
const currentDay = "current_day";
const dateFormat = "yyyy-MM-dd";

/// 获取更新版本信息
/// url 请求地址
/// versionNumber 当前应用versionCode
/// productNo 产品号
/// onceDay 一天提示一次(应用首页设置true)
void checkVersion({
  required String url,
  required int versionNumber,
  required int productNo,
  bool onceDay = false,
  Function()? jumpAppStore, // 跳转AppStore
  Function(String? path)? installApk, // 安装Apk
  Function()? downloadApkError, // 下载Apk错误
}) async {
  try {
    final Response response = await Dio().request(
      url,
      options: Options(method: 'GET'),
      queryParameters: {
        "versionNumber": versionNumber,
        "productNo": productNo,
      },
    );
    // 网络请求成功
    var responseData = response.data;
    var requestOptions = response.requestOptions;
    var headers = response.headers;
    debugPrint("========== 网络请求成功 ==========\n"
        "path:${requestOptions.path}\n"
        "method:${requestOptions.method}\n"
        "queryParameters:${requestOptions.queryParameters}\n"
        "headers:${headers.map}\n\n"
        "responseData:$responseData\n");
    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['versionContent'],
        isUpdateMore: result['versionForce'] == 1,
        versionPath: result['versionPath'],
        jumpAppStore: jumpAppStore,
        installApk: installApk,
        downloadApkError: downloadApkError,
      ),
    );
  } on DioException catch (e) {
    debugPrint(
        "===== 网络请求错误:${e.response?.statusCode} ${e.response?.statusMessage}");
  }
}

/// 打开浏览器
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');
  }
}