#!/usr/bin/env bash
set -e
set -u
set -o pipefail

. ./build_script/android/functions.sh

trap handle_error ERR



# 构建类型 release debug profile
BUILD_TYPE=$1
# 构建环境 dev sit uat prod
DOMAIN_ENV=$2
# 版本名字 1.0.0
BUILD_VERSION_NAME=$3
# 版本号 1
BUILD_VERSION_CODE=$4
# 是否构建aab包
IS_AAB=$5
# 分支
BRANCH=$6
# 来自PC构建
IS_PC_BUILD=$7
# 是否发布到uat
IS_PUBLISH_UAT=$8
######################################## 以上入参 ########################################

BUILD_NUM=$(grep "version:" pubspec.yaml | awk '{print $2}' | awk -F'[:+]' '{print $2}')
# 构建号
BUILD_VERSION_CODE_USE=$((BUILD_NUM + BUILD_VERSION_CODE))

# 构建环境
PROJECT_BUILD_ENV="--debug"

# 项目根目录
project_dir=$PWD

OBFUSCATION_SETTINGS=""

output_dir="$project_dir/buildPackage"

# 基于构建环境定义混淆设置
case $1 in
  debug)
    PROJECT_BUILD_ENV="--debug"
    OBFUSCATION_SETTINGS=""
    ;;
  profile)
    PROJECT_BUILD_ENV="--profile"
    OBFUSCATION_SETTINGS=""
    ;;
  release)
    PROJECT_BUILD_ENV="--release"
    OBFUSCATION_SETTINGS="--obfuscate --split-debug-info=$output_dir/$1/lib"
    ;;
  *)
    echo "Invalid build environment: $1"
    exit 1
    ;;
esac

if [ -d "$output_dir" ]; then
  rm -rf "$output_dir"
  echo "以前目录删除成功"
fi

if [ ! -d "$output_dir/$1" ]; then
  mkdir -p "$output_dir/$1"
    echo "创建目录成功"
fi

if [ "$BUILD_TYPE" == "release" ] && [ ! -d "$output_dir/$1/lib" ]; then
  mkdir -p "$output_dir/$BUILD_TYPE/lib"
  echo "创建$output_dir/$BUILD_TYPE/lib目录成功"
fi

######################################## 开始构建 ########################################

# 清理缓存
flutter clean && flutter pub get

echo "flutter build apk $PROJECT_BUILD_ENV --build-name=$BUILD_VERSION_NAME \
--build-number=$BUILD_VERSION_CODE_USE --dart-define=ENVIRONMENT=$DOMAIN_ENV"
# apk开始构建
flutter build apk $PROJECT_BUILD_ENV \
--build-name="$BUILD_VERSION_NAME" \
--build-number=$BUILD_VERSION_CODE_USE \
--dart-define=ENVIRONMENT="${DOMAIN_ENV}"

if [ "$1" == 'release' ]; then
   # upload sentry
   echo "android upload sentry------- start"
   flutter packages pub run sentry_dart_plugin
   echo "android upload sentry ------- end"
fi

# 构建完成
echo "构建完成"

# 文件名
TARGET_FILE_NAME=smdp-$BUILD_VERSION_NAME-$BUILD_VERSION_CODE_USE-$DOMAIN_ENV-$BUILD_TYPE

# 移动文件
cp "$project_dir"/build/app/outputs/apk/"$BUILD_TYPE"/sunda-"$BUILD_VERSION_NAME".apk \
"$output_dir"/"$BUILD_TYPE"
# 重命名
mv "$output_dir"/"$BUILD_TYPE"/sunda-"$BUILD_VERSION_NAME".apk \
"$output_dir"/"$BUILD_TYPE"/"$TARGET_FILE_NAME".apk

# apk路径
PKG_PATH=$output_dir/$BUILD_TYPE/$TARGET_FILE_NAME.apk
# apk名字
PKG_NAME=$TARGET_FILE_NAME.apk
# apk信息
PKG_NAME_INFO=$TARGET_FILE_NAME
echo "构建完成"

######################################## apk构建完成 ########################################

# aab路径 aab名字 资源包路径 资源包名字 mapping路径 mapping名字
AAB_PATH=$output_dir/$BUILD_TYPE/$TARGET_FILE_NAME.aab
AAB_NAME=$TARGET_FILE_NAME.aab
RESOURCE_PATH=$output_dir/$BUILD_TYPE/resource/$TARGET_FILE_NAME-armeabi-v7a.zip
RESOURCE_NAME=$TARGET_FILE_NAME-armeabi-v7a.zip
MAPPING_PATH=$output_dir/$BUILD_TYPE/resource/$TARGET_FILE_NAME-mapping.txt
MAPPING_NAME=$TARGET_FILE_NAME-mapping.txt

if [ "$IS_AAB" = "true" ] && [ "$BUILD_TYPE" = "release" ]; then
  echo "开始构建aab"
  flutter build appbundle $PROJECT_BUILD_ENV \
  --build-name="$BUILD_VERSION_NAME" \
  --build-number=$BUILD_VERSION_CODE_USE \
  --dart-define=ENVIRONMENT="${DOMAIN_ENV}"

  # 移动文件
  cp "$project_dir"/build/app/outputs/bundle/"$BUILD_TYPE"/app-"$BUILD_TYPE".aab \
  "$output_dir"/"$BUILD_TYPE"
  # 重命名
  mv "$output_dir"/"$BUILD_TYPE"/app-"$BUILD_TYPE".aab \
  "$output_dir"/"$BUILD_TYPE"/"$TARGET_FILE_NAME".aab
  echo "aab构建完成"

  ######################################## 资源包整理 ########################################

  mkdir -p "$output_dir/$1/resource"

  cd "$project_dir"/build/app/intermediates/merged_native_libs/release/out/lib/
  zip -r armeabi-v7a.zip armeabi-v7a
  cd "$project_dir"

  echo '处理mapping文件'
  cp "$project_dir"/build/app/outputs/mapping/"$BUILD_TYPE"/mapping.txt  \
  "$output_dir"/"$BUILD_TYPE"/resource
  mv "$output_dir"/"$BUILD_TYPE"/resource/mapping.txt \
  "$output_dir"/"$BUILD_TYPE"/resource/"$TARGET_FILE_NAME"-mapping.txt

  # 拷贝so文件
  cp -r "$project_dir"/build/app/intermediates/merged_native_libs/release/out/lib/armeabi-v7a.zip \
  "$output_dir"/"$BUILD_TYPE"/resource
  mv "$output_dir"/"$BUILD_TYPE"/resource/armeabi-v7a.zip \
  "$output_dir"/"$BUILD_TYPE"/resource/"$TARGET_FILE_NAME"-armeabi-v7a.zip

fi

# apk文件上传
echo "文件上传开始"
echo "上传到minio开始"
pkg_url=$(python3 ./build_script/android/pkg_upload_minio.py "$PKG_PATH" "$PKG_NAME" "apk")
echo "上传到minio完成"
if [ "$IS_PC_BUILD" == "true" ] && [ "$BUILD_TYPE" == "release" ]; then
  # 上传到aws
  echo "上传到aws开始"
  pkg_url=$(python3 ./build_script/android/pkg_upload_aws_temp.py "$PKG_PATH" "$PKG_NAME")
  echo "上传到aws完成"
fi
echo "pkg_url: $pkg_url"
# apk下载路径二维码生成
qrcode_outputs_path="$project_dir/buildPackage/$BUILD_TYPE"
qrcode_path=$(python3 ./build_script/android/build_qrcode.py "$pkg_url" "$PKG_NAME_INFO", "$qrcode_outputs_path")
# apk下载路径二维码上传
QRCODE_NAME=$TARGET_FILE_NAME.png
qrcode_url=$(python3 ./build_script/android/pkg_upload_minio.py "$qrcode_path" "$QRCODE_NAME" "apkQrcode")
aab_url=""
resource_url=""
mapping_url=""

if [ "$IS_AAB" == "true" ] && [ "$BUILD_TYPE" == "release" ]; then
  # aab文件上传
  echo "aab文件上传开始"
  aab_url=$(python3 ./build_script/android/pkg_upload_minio.py "$AAB_PATH" "$AAB_NAME" "aab")
  # 资源包上传
  echo "资源包上传开始"
  resource_url=$(python3 ./build_script/android/pkg_upload_minio.py "$RESOURCE_PATH" "$RESOURCE_NAME" "aab")
  # mapping文件上传
  echo "mapping文件上传开始"
  mapping_url=$(python3 ./build_script/android/pkg_upload_minio.py "$MAPPING_PATH" "$MAPPING_NAME" "mapping")
fi

echo "文件上传完成"
echo "pkg_url: $pkg_url"
echo "aab_url: $aab_url"
echo "resource_url: $resource_url"
echo "mapping_url: $mapping_url"
echo "env": "$DOMAIN_ENV"
echo "build_number: $BUILD_VERSION_CODE_USE"
echo "build_name: $BUILD_VERSION_NAME"
echo "qrcode_url: $qrcode_url"

if [ "$IS_PC_BUILD" == "true" ]; then
  apkAddress=$pkg_url
  aabAddress=$aab_url
  debugSymbolAddress=$resource_url
  mappingAddress=$mapping_url
  platform="Android"
  versionNumber=$BUILD_VERSION_CODE_USE
  versionName=$BUILD_VERSION_NAME
  env=$DOMAIN_ENV
  infoResult=$(python3 ./build_script/script/publish_info.py "$apkAddress" "$aabAddress" \
  "$debugSymbolAddress" "$mappingAddress" "$platform" "$versionNumber" "$versionName" "$env")

  if [ "$infoResult" == "200" ]; then
    qwmsg "PC Android端构建成功"
    echo "通知成功"
  else
    qwmsg "PC Android端构建失败 $infoResult"
    echo "通知失败"
  fi
fi


# 发送消息到企微
sendNewsToQW "$pkg_url" "$BRANCH" "$PKG_NAME_INFO" "$qrcode_url"
if [ "$IS_AAB" == "true" ] && [ "$BUILD_TYPE" == "release" ]; then
  sendNewsToQWOnlyDownLoad "$aab_url" "$BRANCH" "$PKG_NAME_INFO" "AAB"
  sendNewsToQWOnlyDownLoad "$resource_url" "$BRANCH" "$PKG_NAME_INFO" "调试符号文件"
  sendNewsToQWOnlyDownLoad "$mapping_url" "$BRANCH" "$PKG_NAME_INFO" "映射文件"
fi

echo "打包过程完成"

# # 发布到uat
# if [ "$DOMAIN_ENV" == "uat" ] && [ "$BUILD_TYPE" == "release" ] && [ "$IS_PUBLISH_UAT" == "true" ]; then
#   echo "开始发布到uat"
#   uat_url=$(python3 ./build_script/android/pkg_upload_aws.py "$PKG_PATH" "$PKG_NAME")
#   echo "发布到uat完成"
#   # 生成uat二维码
#   qr_img_name=smdp-$BUILD_VERSION_NAME-$BUILD_VERSION_CODE_USE-$DOMAIN_ENV-$BUILD_TYPE-uat
#   qrcode_uat_path=$(python3 ./build_script/android/build_qrcode.py "$uat_url" "$qr_img_name", "$qrcode_outputs_path")
#   # 上传uat二维码
#   QRCODE_UAT_NAME=smdp-$BUILD_VERSION_NAME-$BUILD_VERSION_CODE_USE-$DOMAIN_ENV-$BUILD_TYPE-uat.png
#   qrcode_uat_url=$(python3 ./build_script/android/pkg_upload_minio.py "$qrcode_uat_path" "$QRCODE_UAT_NAME" "apkQrcode")
#   # 发送消息到企微
#   sendNewsToQW $uat_url "$BRANCH" $qr_img_name $qrcode_uat_url
#   qwmsguat
# fi