import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:path/path.dart' as path;
import 'package:http/http.dart' as http;
import 'package:upload/file_formdata.dart';

import 'file_request.dart';

const String _API_KEY_DEV = "";
const String _FILE_PATH = "\\build\\app\\outputs\\apk\\release\\app-release.apk";

void _log(String message) {
  stdout.write(message);
}

Future<void> getToken() async {
  _log("\n获取上传token和endpoint中");
  final url = Uri.https("www.pgyer.com", "apiv2/app/getCOSToken");
  var result = await http.post(url, body: {
    "_api_key": "804cf948c5fcf01bc70bb8d086721a58",
    "buildType": "android",
  });

  if (result.statusCode == 200) {
    _log("\n获取token和endpoint成功\n");
    var json = jsonDecode(result.body)["data"];
    final String uploadUrl = json["endpoint"];
    final String key = json["key"];

    final Map<String, dynamic> params = json["params"];
    final String signature = params["signature"];
    final String xCosSecurityToken = params["x-cos-security-token"];

    await upload2(uploadUrl, key, signature, xCosSecurityToken);
  } else {
    _log("\n获取token和endpoint失败\n");
  }
}

Future<void> upload(
  String url,
  String key,
  String sign,
  String token,
) async {
  final endPoint = Uri.tryParse(url);
  final file = File(Directory.current.path + _FILE_PATH);

  if (endPoint != null) {
    var formData = FileRequest("POST", endPoint, (current, total) {
      _log("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%");
    });

    formData.fields["key"] = key;
    formData.fields["signature"] = sign;
    formData.fields["x-cos-security-token"] = token;

    formData.files.add(await http.MultipartFile.fromPath(
      path.basename(file.path),
      file.path,
    ));

    _log("\n开始上传APK到蒲公英:${DateTime.now().toString()}\n\n");
    var response = await formData.send();

    if (response.statusCode == 204) {
      _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}");
    } else {
      _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}");
    }
  }
}

Future<void> upload2(
  String url,
  String key,
  String sign,
  String token,
) async {
  final file = File(Directory.current.path + _FILE_PATH);

  var dio = Dio();

  dio.options.connectTimeout = 5000;
  dio.options.receiveTimeout = 5000;

  var form = FileFormData((current, total) {
    stdout.write("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%");
  });

  form.fields.add(MapEntry("key", key));
  form.fields.add(MapEntry("signature", sign));
  form.fields.add(MapEntry("x-cos-security-token", token));

  form.files.add(MapEntry("file", await MultipartFile.fromFile(file.path, filename: path.basename(file.path))));

  _log("\n准备开始上传到蒲公英:${DateTime.now().toString()}\n");
  var response = await dio.post(
    url,
    data: form,
    options: Options(
      method: "POST",
      responseType: ResponseType.json,
    ),
  );

  if (response.statusCode == 204) {
    _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}");
  } else {
    _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}");
  }
}