#!/usr/bin/env bash

flutter_version="3.29.0"
#版本查询地址：https://pub.dev/packages/flutter
distribution_url="https://github.com/flutter/flutter.git"
#git地址：https://github.com/flutter/flutter.git 如果下载太慢可以使用 https://gitee.com/mirrors/Flutter.git
flutter_channel="master"
#master分支上version tag是最全的

bash_path=$(cd `dirname $0`; pwd) # work_path=$(pwd)
download_dir="$bash_path/.flutter"

# 初始化命令
export PUB_HOSTED_URL=https://pub.dev
export FLUTTER_STORAGE_BASE_URL=https://storage.googleapis.com
if [[ "$(uname)" == *NT* ]] #判断是否是Windows系统，嵌套中括号是支持正则使用
then
    flutter_command="$download_dir/bin/flutter.bat"
    dart_command="$download_dir/bin/cache/dart-sdk/bin/dart.exe"
else
    flutter_command="$download_dir/bin/flutter"
    dart_command="$download_dir/bin/cache/dart-sdk/bin/dart"
fi

# 执行方法封装
execFlutter() {
    if [[ $1 == "dart" ]]; then
        if command -v dart >/dev/null 2>&1; then
            # 使用系统 dart
            str=$*
            substr=${str:4}
            dart $substr
        else
            # 使用本地 dart
            str=$*
            substr=${str:4}
            $dart_command $substr
        fi
    else
        if command -v flutter >/dev/null 2>&1; then
            # 使用系统 flutter
            flutter $*
        else
            # 使用本地 flutter
            $flutter_command $*
        fi
    fi
}

# 更新dart sdk、处理 pub
handleSDK() {
	# 下载 或 更新 dart sdk
    $flutter_command doctor
    # 获取版本号
    curFlutterVersion=`$flutter_command --version | grep '^Flutter' | cut -d ' ' -f2`
    # 更新.android、.ios内部的flutter sdk路径
    $flutter_command pub get
    echo "===SDK handle success：$curFlutterVersion"
}

# 检查系统 Flutter
check_system_flutter() {
    if command -v flutter >/dev/null 2>&1; then
        local sys_version=$(flutter --version | grep '^Flutter' | cut -d ' ' -f2)
        echo "===系统已安装 Flutter 版本: $sys_version"
        if [ "$sys_version" == "$flutter_version" ]; then
            return 0  # 版本匹配
        fi
        return 1  # 版本不匹配
    fi
    return 2  # 未安装
}

# 检查本地 Flutter
check_local_flutter() {
    if [ -r "$flutter_command" ]; then
        local local_version=$($flutter_command --version | grep '^Flutter' | cut -d ' ' -f2)
        echo "===本地已安装 Flutter 版本: $local_version"
        if [ "$local_version" == "$flutter_version" ]; then
            return 0  # 版本匹配
        fi
        return 1  # 版本不匹配
    fi
    return 2  # 未安装
}

# 下载或更新Flutter SDK
handle_flutter_sdk() {
    # 检查系统 Flutter
    check_system_flutter
    local sys_result=$?
    
    if [ $sys_result -eq 0 ]; then
        # 系统 Flutter 版本匹配，使用系统的 Flutter
        echo "===使用系统 Flutter $flutter_version"
        execFlutter $*
        return
    fi
    
    # 检查本地 Flutter
    check_local_flutter
    local local_result=$?
    
    if [ $local_result -eq 0 ]; then
        # 本地 Flutter 版本匹配，使用本地的
        echo "===使用本地 Flutter $flutter_version"
        execFlutter $*
        return
    fi
    
    # 都不匹配，需要下载或更新
    if [ $sys_result -eq 1 ]; then
        echo "===系统 Flutter 版本不匹配，将下载所需版本到本地"
    elif [ $local_result -eq 1 ]; then
        echo "===本地 Flutter 版本不匹配，将更新到所需版本"
    else
        echo "===未找到 Flutter，将下载所需版本"
    fi
    
    # 下载或更新流程
    handle_flutter_sdk $*
}

# 主流程
main() {
    # 检查系统 Flutter
    check_system_flutter
    local sys_result=$?
    
    if [ $sys_result -eq 0 ]; then
        # 系统 Flutter 版本匹配，直接使用系统的 Flutter
        echo "===使用系统 Flutter $flutter_version"
        execFlutter $*
        return
    fi
    
    # 系统 Flutter 不匹配或未安装，使用或下载本地版本
    if [ ! -d $download_dir ]; then
        echo "===创建目录：$download_dir"
        mkdir -p $download_dir
    fi
    
    if [ ! -r $flutter_command ]; then
        echo "===开始下载 Flutter SDK"
        git clone -b $flutter_channel $distribution_url $download_dir
        if [ ! -r $flutter_command ]; then
            echo "===SDK 下载失败"
            exit -1
        fi
        handleSDK
    fi
    
    execFlutter $*
}

# 调用主流程
main $*

# 备注
# 获取某个命令的返回值 使用 STR=$(uname) 或者 STR=`uname`
# 变量赋值等号前后不能有空格 如 STR="123"
# shell if 是对空格敏感 如：if [ "dd" == "dd" ]
# if [[ "$(uname)" == *AA* ]] 嵌套中括号是支持正则使用