# Maintainer: WithTheBraid <info@braid.business>
# Co-Maintainer: Polarian <polarian@polarian.dev>, Fredy García <frealgagu at gmail dot com>
# Contributor: Philip Goto <philip.goto@gmail.com>

pkgbase=flutter
_group=flutter
groups=("$_group")
pkgver=3.38.1
_enginever=b5990e5ccc5e325fd24f0746e7d6689bbebc7c65
_materialfontsver=3012db47f3130e62f7cc0beabff968a33cbec8d8
_gradlewver=fd5c1f2c013565a3bea56ada6df9d2b8e96d56aa
_flutterarch=$(echo "$CARCH" | sed s/aarch64/arm64/ | sed s/x86_64/x64/)
_dartver="3.10.0"
_dartmin="3.10.0"
_dartmax="3.11.0"
# this host is blocked in China, according to Flutter docs, the FLUTTER_STORAGE_BASE_URL environment variable
# should be used to provide an alternative mirror
_storagebase="${FLUTTER_STORAGE_BASE_URL:-"https://storage.googleapis.com"}"
pkgrel=3
pkgdesc="A new mobile app SDK to help developers and designers build modern mobile apps for iOS and Android."
_pkgdesc="Flutter SDK component"
arch=("x86_64" "aarch64")
url="https://${_group}.dev"
license=("custom" "BSD" "CCPL")
makedepends=(
	"dart>=${_dartmin}"
	"dart<${_dartmax}"
	"jq"
	"gradle"
	"unzip"
	"tar"
)
options=("!emptydirs")
source=(
  "${_group}-${pkgver}.tar.xz::https://github.com/${_group}/${_group}/archive/refs/tags/${pkgver/.hotfix/+hotfix}.tar.gz"

  # ARTIFACTS

  # material_fonts
  "material_fonts-${_materialfontsver}.zip::${_storagebase}/flutter_infra_release/flutter/fonts/${_materialfontsver}/fonts.zip"
  # gradle_wrapper
  "gradle_wrapper-${_gradlewver}.tar.gz::${_storagebase}/flutter_infra_release/gradle-wrapper/${_gradlewver}/gradle-wrapper.tgz"

  # engine/android-x86
  "android-x86-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x86/artifacts.zip"
  # engine/android-x64
  "android-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x64/artifacts.zip"
  # engine/android-arm
  "android-arm-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm/artifacts.zip"
  # engine/android-arm-profile
  "android-arm-profile-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm-profile/artifacts.zip"
  # engine/android-arm-release
  "android-arm-release-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm-release/artifacts.zip"
  # engine/android-arm64
  "android-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm64/artifacts.zip"
  # engine/android-arm64-profile
  "android-arm64-profile-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm64-profile/artifacts.zip"
  # engine/android-arm64-release
  "android-arm64-release-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm64-release/artifacts.zip"

  # engine/android-x64-profile
  "android-x64-profile-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x64-profile/artifacts.zip"
  # engine/android-x64-release
  "android-x64-release-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x64-release/artifacts.zip"

  # flutter_web_sdk
  "flutter_web_sdk-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/flutter-web-sdk.zip"
  # pkg
  "sky_engine-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/sky_engine.zip"

  # engine/common
  "flutter_patched_sdk-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/flutter_patched_sdk.zip"
  # engine/common
  "flutter_patched_sdk_product-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/flutter_patched_sdk_product.zip"

  # PATCHES

  "system-dart.patch"
  "gradle-user-home.patch"

  # thanks to lauren n. liberda from Alpine for the awesome patchset used here !
  "${_group}.sh"
  "version.patch"
  "no-lock.patch"
  "no-runtime-download.patch"
  "doctor.patch"
  "opt-in-analytics.patch"
)
source_x86_64=(
  # dart-sdk
  "dart-sdk-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/dart-sdk-linux-x64.zip"
  # engine/android-arm-profile/linux-x64
  "android-arm-profile-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm-profile/linux-x64.zip"
  # engine/android-arm-release/linux-x64
  "android-arm-release-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm-release/linux-x64.zip"
  # engine/android-arm64-profile/linux-x64
  "android-arm64-profile-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm64-profile/linux-x64.zip"
  # engine/android-arm64-release/linux-x64
  "android-arm64-release-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-arm64-release/linux-x64.zip"
  # engine/android-x64-profile/linux-x64
  "android-x64-profile-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x64-profile/linux-x64.zip"
  # engine/android-x64-release/linux-x64
  "android-x64-release-linux-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/android-x64-release/linux-x64.zip"

  # engine/linux-$ARCH
  "engine-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-x64/artifacts.zip"
  # engine/linux-$ARCH
  "gtk-debug-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-x64-debug/linux-x64-flutter-gtk.zip"
  # engine/linux-$ARCH-profile
  "gtk-profile-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-x64-profile/linux-x64-flutter-gtk.zip"
  # engine/linux-$ARCH-release
  "gtk-release-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-x64-release/linux-x64-flutter-gtk.zip"
  # engine/linux-$ARCH
  "font-subset-x64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-x64/font-subset.zip"
)
source_aarch64=(
  # dart-sdk
  "dart-sdk-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/dart-sdk-linux-arm64.zip"
  # engine/linux-$ARCH
  "engine-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-arm64/artifacts.zip"
  # engine/linux-$ARCH
  "gtk-debug-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-arm64-debug/linux-arm64-flutter-gtk.zip"
  # engine/linux-$ARCH-profile
  "gtk-profile-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-arm64-profile/linux-arm64-flutter-gtk.zip"
  # engine/linux-$ARCH-release
  "gtk-release-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-arm64-release/linux-arm64-flutter-gtk.zip"
  # engine/linux-$ARCH
  "font-subset-arm64-${_enginever}.zip::${_storagebase}/flutter_infra_release/flutter/${_enginever}/linux-arm64/font-subset.zip"
)
noextract=(
  "material_fonts-${_materialfontsver}.zip"
  "gradle_wrapper-${_gradlewver}.tar.gz"

  "android-x86-${_enginever}.zip"
  "android-x64-${_enginever}.zip"
  "android-arm-${_enginever}.zip"
  "android-arm-profile-${_enginever}.zip"
  "android-arm-release-${_enginever}.zip"
  "android-arm64-${_enginever}.zip"
  "android-arm64-profile-${_enginever}.zip"
  "android-arm64-release-${_enginever}.zip"

  "android-x64-profile-${_enginever}.zip"
  "android-x64-release-${_enginever}.zip"

  "flutter_web_sdk-${_enginever}.zip"
  "sky_engine-${_enginever}.zip"
  "flutter_patched_sdk-${_enginever}.zip"
  "flutter_patched_sdk_product-${_enginever}.zip"

  # x64
  "android-arm-profile-linux-x64-${_enginever}.zip"
  "android-arm-release-linux-x64-${_enginever}.zip"
  "android-arm64-profile-linux-x64-${_enginever}.zip"
  "android-arm64-release-linux-x64-${_enginever}.zip"
  "android-x64-profile-linux-x64-${_enginever}.zip"
  "android-x64-release-linux-x64-${_enginever}.zip"

  "engine-x64-${_enginever}.zip"
  "gtk-debug-x64-${_enginever}.zip"
  "gtk-profile-x64-${_enginever}.zip"
  "gtk-release-x64-${_enginever}.zip"
  "font-subset-x64-${_enginever}.zip"

  # arm64
  "engine-arm64-${_enginever}.zip"
  "gtk-debug-arm64-${_enginever}.zip"
  "gtk-profile-arm64-${_enginever}.zip"
  "gtk-release-arm64-${_enginever}.zip"
  "font-subset-arm64-${_enginever}.zip"

  # dart
  "dart-sdk-x64-${_enginever}.zip"
  "dart-sdk-arm64-${_enginever}.zip"
)

sha256sums=('3acd76b6a4871fb797b5b3b5f184e9ae8114c533b4c3371a8fc98aae568adefc'
            'e56fa8e9bb4589fde964be3de451f3e5b251e4a1eafb1dc98d94add034dd5a86'
            '31e9428baf1a2b2f485f1110c5899f852649b33d46a2e9b07f9d17752d50190a'
            '73e3593d3fea1a91b1cc2fa5052e7bae989a5188a61a95fa265beb87846d89cd'
            'b9571ae4e063787ce8d2e7bf5688ac9b85b553446d57f15144f320b94519e582'
            '4ccbc8ebf2a4c5743bd671054b664a9d9e908fed2fa3d32f8be099bedc5d7df1'
            '11d57b778d1d372c1750f8c5555f3aa88648243cdaa7b7bc26151d23e64524b4'
            'b477dea985c3d1797674ee10759938f0de51b09156c620456419137283d424d3'
            '4760b508bccd6667fb850996035f11be19f7ed89a12a8f687bcda8482237ca88'
            'b04d6c47b34c7e618bbe4f28c5a2c497a997ef467ffd735350b0593e3901f9de'
            '9256774eedc9fd5d1e301aa03d6a3a866d2e841cd1ffa05ce6fd7c5fe68d2d71'
            '8dbe0a33a7d305f419e92108f452ed7c05c2c9ca2c3374fbcb7bf2a28891d3e1'
            'd549c188daa9f0339006af80460fb9b6a08779577110c7e5f6fc74ff3b450663'
            '044d029d0440cf519c68e885828c4de6deae94953667f3ab7c25327405b9fe69'
            '74ecdf4e74ca29dd356588211168d418baa1bc45fb4e3c0b2b09bf141f3a6201'
            '872110e387e87fa3e15dc98b2504f60781ea2cdd6007d26ce44d7a7c2bc13416'
            '732cc50cc2a502726efd5ab230c5c81af76a07661f34a9a6327622d99de0f30f'
            '47bea61b2d62a4637d56f2807661afd7d427f1f48434d1d132b7e6e10ffb6aa8'
            'e41d25d8cba8b0bb51ee0b20cb6b730bfb2c491d67c669ab8e3550d60b37fb5c'
            'b4c104129eb57e7e3edca2e23376b8b034de2d466189bdc1c3e2a304506889a3'
            'f0c88e34c130f243786f7673d4c5f8fb5d1089c84b0604085aeb35a7fa8b3682'
            'cadd32aaac6beeb91052174d50494bb7e16444759fcdc8224ea13550657f525f'
            'e26c476ad75647fe4441d56888b95837f586db5feb0fada5e51005eb0582ce32'
            '34b02703c48f6686ffb2691a510607cfbe69beff9e726b47834b3298839542ca'
            '1578e819b6ee479b6db7a095bcfa74372d3ff555642c6d6ea7112e97bb6f2027')
sha256sums_x86_64=('d7a72203bd9eb3b577f19660366577712dcd9750d678c7d006a37597eb2946fd'
                   '2315a4bb6d2b8f916767339a3b718256ab205ca4ecafb2206a6617e3aa953728'
                   '02d6bb8f5643a3b7d01ccbb4729d0e7c283e47117b87a413e505a4e64ab2354c'
                   '0c5172d2a4bf5c758826baeb8ad4e46dd1266e496f56d5ac2c300069a7297263'
                   '3c22a86e00b4afc5e26c9061599daa11a685af538ec78de272e57798490eea40'
                   '11a75a25cb0c1635734e2cb2104593b0da41d111d39461912af1f141474421ac'
                   '280154880af3c4518cceb8c045a27f1c52f1fdaabe14385e4a08e7841420513e'
                   'ef6fd550e3e9c23593a2b3cd23751cf4595a8349ecdff4ae59e1e305d7672a71'
                   '5f4109c734800c2226a5fca6a55c4e5171f19f4c31c690d529a4da0729cac453'
                   'bfce72ffc09df73ed26895574fb6297b5365c907ed17b8c02251676fcd177e1d'
                   '60289fc0f424b8ed5df36b88457089c82f59cdebcbaaaf3d3c2e9f1123228cf0'
                   '100c1e411ff89872331fb4c82963ecebda525bbc0e1ff4ca8e1e9dd7ba2397d1')
sha256sums_aarch64=('e4f9a7856b7628d2aca06150c111fe55a38314f3f42012f7eb779aaa201cc760'
                    '7b411e6f7ef86b900c05e4156a57416740a574cb3c6ef3e9ad52d8d9bf121abd'
                    '2187a8bdade05f18be75aef926c8b71a6f873a9014fd4e2fc28282f6b07d5666'
                    '53e2fccdc9a8a18fcf56d83ab637ce0e5f26382b99ed9a4c9914d6f95a992790'
                    'd8a5c350a903b4671311a7d128edc2d3f49568fcd5a331dfed63e3245b07d5c3'
                    'ae9e5df7d8fe07dc27e2144006b43934dad01eded2f028276604d2b8a1ef5649')

prepare() {
  # SDK

  # this is required in case people try to build with `aur/dart-sdk-dev` instead of `extra/dart`
  DART_BINARY=$(readlink $(command -v dart))
  DART_ROOT=${DART_ROOT:-${DART_BINARY/\/bin\/dart*/}}

  if [ "${DART_ROOT}" != "/opt/dart-sdk" ]; then
    echo -e "\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n"

    echo -e "  WARNING !!!\n"

    echo -e "  Your default Dart SDK does not seem to be installed into\n"
    echo -e "    /opt/dart-sdk\n"
    echo -e "  Please consider using the original 'extra/dart' package"
    echo -e "  from the Arch Linux package repositories. We otherwise"
    echo -e "  cannot ensure the Flutter tool will work as expected.\n\n"
    echo -e "  Dart executable:	$(command -v dart)"
    echo -e "  Resolved Dart SDK:	${DART_ROOT}"

    echo -e "\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n"
  fi

  if [[ ! "$DART_ROOT" =~ ^\/opt\/ && ! "$DART_ROOT" =~ ^\/usr\/ ]]; then
    echo "FATAL: DART_ROOT is neither in /opt nor /usr. You must use a system wide Dart installation for this package. Exiting."
    exit 1
  fi

  if [ -d "${srcdir}/${_group}" ]; then
    rm -rf "${srcdir}/${_group}"
  fi

  mv "${srcdir}/${_group}-${pkgver/.hotfix/+hotfix}" "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/system-dart.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/gradle-user-home.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/version.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/no-lock.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/no-runtime-download.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/doctor.patch" -d "${srcdir}/${_group}"
  patch -p1 -i "${srcdir}/opt-in-analytics.patch" -d "${srcdir}/${_group}"

  echo "${pkgver}" > "${srcdir}/${_group}/version"
  mkdir -p "${srcdir}/${_group}/bin/cache/artifacts"
  cat > "${srcdir}/${_group}/bin/cache/flutter.version.json" <<EOF
{
	"frameworkVersion": "$pkgver",
	"channel": "$_channel",
	"repositoryUrl": "https://github.com/flutter/flutter.git",
	"frameworkRevision": "archlinuxaur0000000000000000000000000000",
	"frameworkCommitDate": "2038-01-19 03:14:08",
	"engineRevision": "$(cat "${srcdir}/${_group}/bin/internal/engine.version")",
	"dartSdkVersion": "$(dart --version | awk '{print $4}')",
	"devToolsVersion": $(jq '.version' < ${DART_ROOT}/bin/resources/devtools/version.json),
	"flutterVersion": "$pkgver"
}
EOF

  if [ -d "${srcdir}/gradlew" ]; then
    rm -rf "${srcdir}/gradlew"
  fi

  mkdir "${srcdir}/gradlew"
  pushd ${srcdir}/gradlew
  gradle init --type basic --project-name flutter --dsl kotlin --incubating
  gradle wrapper
  popd

  cd "${srcdir}/${_group}/bin/cache/artifacts"

  # why should we use a pre-build gradle wrapper if we have it in the arch repos ?
  mkdir -p gradle_wrapper/gradle
  cp -pr "${srcdir}/gradlew/gradle/wrapper" gradle_wrapper/gradle
  cp -pr "${srcdir}/gradlew/gradlew" gradle_wrapper

  # ARTIFACTS
  cd "${srcdir}"

  unzip -o -q "${srcdir}/dart-sdk-${_flutterarch}-${_enginever}.zip" -d dart

  mkdir -p "${srcdir}/${_group}/bin/cache/artifacts"

  cd "${srcdir}/${_group}/bin/cache"

  unzip -o -q "${srcdir}/flutter_web_sdk-${_enginever}.zip" -d flutter_web_sdk
  unzip -o -q "${srcdir}/sky_engine-${_enginever}.zip" -d pkg

  cd "${srcdir}/${_group}/bin/cache/artifacts"

  mkdir -p "gradle_wrapper"
  tar -xzf "${srcdir}/gradle_wrapper-${_gradlewver}.tar.gz" -C "gradle_wrapper"
  unzip -o -q "${srcdir}/material_fonts-${_materialfontsver}.zip" -d "material_fonts"

  mkdir -p engine/android-arm-profile
  mkdir -p engine/android-arm64-profile
  mkdir -p engine/android-x64-profile
  mkdir -p engine/android-arm-release
  mkdir -p engine/android-arm64-release
  mkdir -p engine/android-x64-release

  if [ "$CARCH" == "x86_64" ]; then

  unzip -o -q "${srcdir}/android-arm-profile-linux-x64-${_enginever}.zip" -d engine/android-arm-profile/linux-x64
  unzip -o -q "${srcdir}/android-arm-release-linux-x64-${_enginever}.zip" -d engine/android-arm-release/linux-x64
  unzip -o -q "${srcdir}/android-arm64-profile-linux-x64-${_enginever}.zip" -d engine/android-arm64-profile/linux-x64
  unzip -o -q "${srcdir}/android-arm64-release-linux-x64-${_enginever}.zip" -d engine/android-arm64-release/linux-x64
  unzip -o -q "${srcdir}/android-x64-profile-linux-x64-${_enginever}.zip" -d engine/android-x64-profile/linux-x64
  unzip -o -q "${srcdir}/android-x64-release-linux-x64-${_enginever}.zip" -d engine/android-x64-release/linux-x64

  fi

  unzip -o -q "${srcdir}/android-x86-${_enginever}.zip" -d engine/android-x86
  unzip -o -q "${srcdir}/android-x64-${_enginever}.zip" -d engine/android-x64
  unzip -o -q "${srcdir}/android-arm-${_enginever}.zip" -d engine/android-arm
  unzip -o -q "${srcdir}/android-arm-profile-${_enginever}.zip" -d engine/android-arm-profile
  unzip -o -q "${srcdir}/android-arm-release-${_enginever}.zip" -d engine/android-arm-release
  unzip -o -q "${srcdir}/android-arm64-${_enginever}.zip" -d engine/android-arm64
  unzip -o -q "${srcdir}/android-arm64-profile-${_enginever}.zip" -d engine/android-arm64-profile
  unzip -o -q "${srcdir}/android-arm64-release-${_enginever}.zip" -d engine/android-arm64-release

  unzip -o -q "${srcdir}/android-x64-profile-${_enginever}.zip" -d engine/android-x64-profile
  unzip -o -q "${srcdir}/android-x64-release-${_enginever}.zip" -d engine/android-x64-release

  unzip -o -q "${srcdir}/flutter_patched_sdk-${_enginever}.zip" -d engine/common
  unzip -o -q "${srcdir}/flutter_patched_sdk_product-${_enginever}.zip" -d engine/common

  unzip -o -q "${srcdir}/engine-${_flutterarch}-${_enginever}.zip" -d engine/linux-${_flutterarch}
  unzip -o -q "${srcdir}/gtk-debug-${_flutterarch}-${_enginever}.zip" -d engine/linux-${_flutterarch}
  unzip -o -q "${srcdir}/gtk-profile-${_flutterarch}-${_enginever}.zip" -d engine/linux-${_flutterarch}-profile
  unzip -o -q "${srcdir}/gtk-release-${_flutterarch}-${_enginever}.zip" -d engine/linux-${_flutterarch}-release
  unzip -o -q "${srcdir}/font-subset-${_flutterarch}-${_enginever}.zip" -d engine/linux-${_flutterarch}
}

build() {
  export PUB_CACHE="${srcdir}/${_group}/pub-cache"
  cd "${srcdir}/${_group}"
  dart pub get -C "packages/flutter_tools" --no-offline --no-precompile
  dart --verbosity=error --disable-dart-dev \
		--snapshot="bin/cache/flutter_tools.snapshot" --snapshot-kind="app-jit" \
		--packages="packages/flutter_tools/.dart_tool/package_config.json" \
		--no-enable-mirrors "packages/flutter_tools/bin/flutter_tools.dart" --version
  cd ../..

  echo "${_enginever}" > "${srcdir}/${_group}/bin/cache/engine.stamp"
  touch "${srcdir}/${_group}/bin/cache/engine.realm"

  sed -Ei 's|'"$PUB_CACHE"'|/usr/lib/flutter/pub-cache|g' "${srcdir}/${_group}/packages/flutter_tools/.dart_tool/package_config.json"
  find "$PUB_CACHE" -name '*.aot' -delete
}

# SDK

_package() {
  pkgdesc="${_pkgdesc} - full installation of development tool and runtime"
  depends=(
	  "${pkgbase}-devel" "${pkgbase}-target-linux" "${pkgbase}-target-android" "${pkgbase}-target-web" "${pkgbase}-intellij-patch")
  conflicts=("${pkgbase}")
}

_package-common() {
  pkgdesc="${_pkgdesc} - common SDK files and pub cache"
  install="${_group}-common.install"

  install -Dm644 "${srcdir}/${_group}/LICENSE" "${pkgdir}/usr/share/licenses/${_group}/LICENSE"

  install -dm755 "${pkgdir}/usr/lib/${_group}"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_driver"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_goldens"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_localizations"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_test"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_web_plugins"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/fuchsia_remote_debug_protocol"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/integration_test"

  cp -ra "${srcdir}/${_group}/packages/flutter/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter"
  cp -ra "${srcdir}/${_group}/packages/flutter_driver/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter_driver"
  cp -ra "${srcdir}/${_group}/packages/flutter_goldens/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter_goldens"
  cp -ra "${srcdir}/${_group}/packages/flutter_localizations/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter_localizations"
  cp -ra "${srcdir}/${_group}/packages/flutter_test/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter_test"
  cp -ra "${srcdir}/${_group}/packages/flutter_web_plugins/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/flutter_web_plugins"
  cp -ra "${srcdir}/${_group}/packages/fuchsia_remote_debug_protocol/"{pubspec.yaml,lib} "${pkgdir}/usr/lib/${_group}/packages/fuchsia_remote_debug_protocol"
  cp -ra "${srcdir}/${_group}/packages/integration_test/"{pubspec.yaml,lib,android} "${pkgdir}/usr/lib/${_group}/packages/integration_test"
}

_package-target-linux() {
  pkgdesc="${_pkgdesc} - linux target files"
  depends=(
	"${_group}-tool"
"${_group}-engine-linux"
	"dart>=${_dartmin}"
	"clang"
	"cmake"
	"ninja"
	"pkgconf" # base-devel, but runtime dependency
	# runtime shared libraries
	"gtk3"
	"libglvnd" # https://github.com/flutter/engine/pull/16924
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/bin"

  cp -ra "${srcdir}/${_group}/packages/flutter_tools/bin/tool_backend.sh" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/bin"
  cp -ra "${srcdir}/${_group}/packages/flutter_tools/bin/tool_backend.dart" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/bin"
}

_package-target-web() {
  pkgdesc="${_pkgdesc} - web target files"
  depends=(
	"${_group}-tool"
	"${_group}-engine-web"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/lib/src/web"

  cp -ra "${srcdir}/${_group}/packages/flutter_tools/lib/src/web/file_generators" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/lib/src/web"
}

_package-target-android() {
  pkgdesc="${_pkgdesc} - android target files"
  depends=(
	"${_group}-tool"
	"${_group}-engine-android"
	"${_group}-gradle"
  )
  optdepends=("android-sdk: develop for Android devices"
	    "java-environment: develop for Android devices"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools"
  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/internal"

  cp -ra "${srcdir}/${_group}/packages/flutter_tools/gradle" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools"
  # TODO: get rid of this ugly hack
  mkdir -m777 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/gradle/.kotlin"

  install -Dm644 "${srcdir}/${_group}/bin/internal/engine.version" "${pkgdir}/usr/lib/${_group}/bin/internal"

}

_package-gradle() {
  pkgdesc="${_pkgdesc} - gradle wrapper"
  provides=(
	"${_group}-gradle"
  )
  conflicts=(
	"${_group}-gradle"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/gradle_wrapper" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts"
}

_package-tool() {
  pkgdesc="${_pkgdesc} - CLI tool (for packaging only)"
  depends=(
	"${_group}-common"
	# TODO: completely compile Flutter tool standalone and drop dependency
	"dart>=${_dartmin}"
	# commands first
	"bash"
	"curl"
	"file" # base-devel, but runtime dependency
	"git"
	"coreutils" # explicit dependency to mkdir, rm
	"unzip"
	"which" # base-devel, but runtime dependency
	"xz"
	"zip"
	"glu" # libGLU.so.1 required for flutter test
  )


  install -dm755 "${pkgdir}/usr/lib/${_group}"
  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache"
  install -dm755 "${pkgdir}/usr/lib/${_group}/dev"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/.dart_tool"

  # otherwise flutter analyze will crash
  touch "${pkgdir}/usr/lib/${_group}/dev/.hack-flutter-analyze"

  install -Dm644 "${srcdir}/${_group}/bin/cache/engine.stamp" "${pkgdir}/usr/lib/${_group}/bin/cache"
  install -Dm644 "${srcdir}/${_group}/bin/cache/engine.realm" "${pkgdir}/usr/lib/${_group}/bin/cache"
  install -Dm644 "${srcdir}/${_group}/bin/cache/flutter_tools.snapshot" "${pkgdir}/usr/lib/${_group}/bin/cache"
  install -Dm644 "${srcdir}/${_group}/bin/cache/flutter.version.json" "${pkgdir}/usr/lib/${_group}/bin/cache"
  install -Dm644 "${srcdir}/${_group}/version" "${pkgdir}/usr/lib/${_group}"
  install -Dm644 "${srcdir}/${_group}/packages/flutter_tools/.dart_tool/package_config.json" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools/.dart_tool"

  install -dm755 "${pkgdir}/usr/bin"
  install -Dm755 "${srcdir}/${_group}.sh" "${pkgdir}/usr/lib/${_group}/bin/flutter"
  ln -sf "/usr/lib/flutter/bin/flutter" "${pkgdir}/usr/bin/flutter"
}

_package-devel() {
  pkgdesc="${_pkgdesc} - CLI tool (for application development)"
  depends=(
	"${_group}-tool"
	"dart>=${_dartmin}"
  )
  replaces=("${_group}-tool-developer")

  install -dm755 "${pkgdir}/usr/lib/${_group}"
  install -dm755 "${pkgdir}/usr/lib/${_group}/packages/flutter_tools"

  cp -ra "${srcdir}/${_group}/examples" "${pkgdir}/usr/lib/${_group}"
  cp -ra "${srcdir}/${_group}/packages/flutter_tools/templates" "${pkgdir}/usr/lib/${_group}/packages/flutter_tools"
  
  # TODO: patch `flutter create` to run without pub cache
  cp -ra "${srcdir}/${_group}/pub-cache" "${pkgdir}/usr/lib/${_group}/pub-cache"
}

_package-intellij-patch() {
  pkgdesc="${_pkgdesc} - IntelliJ Flutter plugin hotfix"
  depends=("${_group}-common")
  optdepends=(
    "android-studio"
    "intellij-idea-community-edition"
    "intellij-idea-ultimate-edition"
  )

  # this is required in case people try to build with `aur/dart-sdk-dev` instead of `extra/dart`
  DART_BINARY=$(readlink $(command -v dart))
  DART_ROOT=${DART_ROOT:-${DART_BINARY/\/bin\/dart*/}}

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache"
  
  # * not my fault grumble * : The IntelliJ Flutter plugin enforces this relative Dart SDK
  ln -sf "${DART_ROOT}/bin/dart" "${pkgdir}/usr/lib/${_group}/bin/dart"
  ln -sf "${DART_ROOT}" "${pkgdir}/usr/lib/${_group}/bin/cache/dart-sdk"
}

# ARTIFACTS

_package-artifacts-engine-common-google-bin() {
  pkgdesc="${_pkgdesc} - common engine files"
  depends=(
	"${_group}-common"
	"${_group}-sky-engine"
	"${_group}-material-fonts"
	"dart>=${_dartmin}"
  )
  provides=(
	"${_group}-engine-common=${pkgver}"
  )
  conflicts=(
	"${_group}-engine-common"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/common" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine/common"
}

_package-artifacts-sky-engine-google-bin() {
  pkgdesc="${_pkgdesc} - sky-engine"
  provides=(
	"${_group}-sky-engine=${pkgver}"
  )
  conflicts=(
	"${_group}-sky-engine"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache"

  cp -ra "${srcdir}/${_group}/bin/cache/pkg" "${pkgdir}/usr/lib/${_group}/bin/cache/pkg"
}

_package-artifacts-material-fonts-google-bin() {
  pkgdesc="${_pkgdesc} - material fonts"
  provides=(
	"${_group}-material-fonts=${pkgver}"
  )
  conflicts=(
	"${_group}-material-fonts"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/material_fonts" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/material_fonts"
}

_package-artifacts-engine-linux-google-bin() {
  pkgdesc="${_pkgdesc} - linux engine"
  depends=(
	"${_group}-engine-common"
  )
  provides=(
	"${_group}-engine-linux=${pkgver}"
  )
  conflicts=(
	"${_group}-engine-linux"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/linux-${_flutterarch}" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/linux-${_flutterarch}-profile" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/linux-${_flutterarch}-release" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
}

_package-artifacts-engine-web-google-bin() {
  pkgdesc="${_pkgdesc} - web engine"
  depends=(
	"${_group}-engine-common"
  )
  provides=(
	"${_group}-engine-web=${pkgver}"
  )
  conflicts=(
	"${_group}-engine-web"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache"

  cp -ra "${srcdir}/${_group}/bin/cache/flutter_web_sdk" "${pkgdir}/usr/lib/${_group}/bin/cache"
}

_package-artifacts-gradle-google-bin() {
  pkgdesc="${_pkgdesc} - gradle wrapper"
  depends=(
	"${_group}-common"
  )
  provides=(
	"${_group}-gradle=${pkgver}"
  )
  conflicts=(
	"${_group}-gradle"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/gradle_wrapper" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts"
}

_package-artifacts-engine-android-google-bin() {
  pkgdesc="${_pkgdesc} - android engine"
  depends=(
	"${_group}-engine-common"
  )
  provides=(
	"${_group}-engine-android=${pkgver}"
  )
  conflicts=(
	"${_group}-engine-android"
  )

  install -dm755 "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm-release" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm-profile" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm64" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm64-release" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-arm64-profile" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-x64" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-x64-release" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-x64-profile" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"

  cp -ra "${srcdir}/${_group}/bin/cache/artifacts/engine/android-x86" "${pkgdir}/usr/lib/${_group}/bin/cache/artifacts/engine"
}

_package-artifacts-dart-google-bin() {
  pkgdesc="${_pkgdesc} - Dart SDK"
  depends=(
	"glibc"
  )
  provides=(
	"dart=${_dartver}"
  )
  conflicts=(
	"dart"
  )

  install -dm755 "${pkgdir}/opt"
  install -dm755 "${pkgdir}/usr/bin"
  install -Dm755 "${srcdir}/dart/LICENSE.dart_sdk_archive.md" "${pkgdir}/usr/share/licenses/dart/LICENSE"

  cp -ra "${srcdir}/dart/dart-sdk" "${pkgdir}/opt/dart-sdk"

  chmod -R ugo+rX "${pkgdir}/opt"

  ln -sf "/opt/dart-sdk/bin/dart" "${pkgdir}/usr/bin/dart"
  ln -sf "/opt/dart-sdk/bin/dartaotruntime" "${pkgdir}/usr/bin/dartaotruntime"
}

pkgname=("${_group}" "${_group}-common" "${_group}-gradle" "${_group}-tool" "${_group}-devel" "${_group}-target-linux" "${_group}-target-android" "${_group}-target-web" "${_group}-intellij-patch" "${_group}-artifacts-engine-common-google-bin" "${_group}-artifacts-engine-linux-google-bin" "${_group}-artifacts-engine-web-google-bin" "${_group}-artifacts-engine-android-google-bin" "${_group}-artifacts-sky-engine-google-bin" "${_group}-artifacts-material-fonts-google-bin" "${_group}-artifacts-gradle-google-bin" "${_group}-artifacts-dart-google-bin")

for _p in "${pkgname[@]}"; do
  eval "package_$_p() {
    $(declare -f "_package${_p#$_group}")
    _package${_p#$_group}
  }"
done

