import groovy.json.JsonSlurper

import java.security.MessageDigest

apply plugin: 'com.android.application'
apply from: '../common.gradle'
apply plugin: 'com.google.devtools.ksp'
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'com.huawei.agconnect'
apply plugin: 'android.aop'

// Android 代码规范文档：https://github.com/getActivity/AndroidCodeStandard
android {

    // 设置命名空间：https://developer.android.com/build/configure-app-module#set-namespace
    namespace 'cn.cqautotest.sunnybeach'

    // 资源目录存放指引：https://developer.android.google.cn/guide/topics/resources/providing-resources
    defaultConfig {

        // 无痛修改包名：https://www.jianshu.com/p/17327e191d2e
        applicationId 'cn.cqautotest.sunnybeach'
        // 仅保留中文语种的资源
        // 仅保留 xxhdpi 图片资源（目前主流分辨率 1920 * 1080）
        resourceConfigurations += ['zh,zh-rCN', 'xxhdpi']

        // 混淆配置
        proguardFiles 'proguard-sdk.pro', 'proguard-app.pro'

        // 日志打印开关
        buildConfigField('boolean', 'LOG_ENABLE', '' + LOG_ENABLE + '')
        // 测试包下的 BuglyId
        buildConfigField('String', 'BUGLY_ID', '"' + BUGLY_ID + '"')
        // 测试服务器的主机地址
        buildConfigField('String', 'HOST_URL', '"' + HOST_URL + '"')

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    // Apk 签名的那些事：https://www.jianshu.com/p/a1f8e5896aa2
    signingConfigs {
        config {
            storeFile file(StoreFile)
            storePassword StorePassword
            keyAlias KeyAlias
            keyPassword KeyPassword
        }
    }
    // 剔除这个包下的所有文件（不会移除签名信息）
    packagingOptions {
        jniLibs {
            excludes += ['META-INF/*******']
        }
        resources {
            excludes += ['META-INF/*******']
        }
    }

    // 构建配置：https://developer.android.google.cn/studio/build/build-variants
    buildTypes {

        debug {
            // 给包名添加后缀
            applicationIdSuffix '.debug'
            // 调试模式开关
            debuggable true
            jniDebuggable true
            // 压缩对齐开关
            zipAlignEnabled false
            // 移除无用的资源
            shrinkResources false
            // 代码混淆开关
            minifyEnabled false
            // 签名信息配置
            signingConfig signingConfigs.config
            // 添加清单占位符
            addManifestPlaceholders([
                    'app_name': '阳光沙滩 Debug 版'
            ])
            // 调试模式下只保留一种架构的 so 库，提升打包速度
            ndk {
                // abiFilters 'armeabi-v7a'
                // 为方便在模拟器上调试，添加了 arm64-v8a 架构的 so 库
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }

        preview.initWith(debug)
        preview {
            applicationIdSuffix ''
            // 添加清单占位符
            addManifestPlaceholders([
                    'app_name': '阳光沙滩 Preview 版'
            ])
        }

        release {
            // 调试模式开关
            debuggable false
            jniDebuggable false
            // 压缩对齐开关
            zipAlignEnabled true
            // 移除无用的资源
            shrinkResources true
            // 代码混淆开关
            minifyEnabled true
            // 签名信息配置
            signingConfig signingConfigs.config
            // 添加清单占位符
            addManifestPlaceholders([
                    'app_name': '@string/app_name'
            ])
            // 仅保留两种架构的 so 库，根据 Bugly 统计得出
            ndk {
                // armeabi：万金油架构平台（占用率：0%）
                // armeabi-v7a：曾经主流的架构平台（占用率：10%）
                // arm64-v8a：目前主流架构平台（占用率：95%）
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }

    applicationVariants.configureEach { variant ->
        // apk 输出文件名配置
        variant.outputs.configureEach { output ->
            outputFileName = rootProject.getName() + '_v' + variant.versionName + '_' + variant.buildType.name
            if (variant.buildType.name == buildTypes.release.getName()) {
                outputFileName += '_' + new Date().format('MMdd')
            }
            outputFileName += '.apk'
        }
    }
}

tasks.register('printReleaseAppConfig') {
    doLast {
        printAppConfig("release")
    }
}

tasks.register('printPreviewAppConfig') {
    doLast {
        printAppConfig("preview")
    }
}

tasks.register('printDebugAppConfig') {
    doLast {
        printAppConfig("debug")
    }
}

def printAppConfig(final variantName) {
    try {
        def outputDirPath = "${projectDir.path}${File.separator}$variantName"
        def apkConfig = new File("$outputDirPath${File.separator}output-metadata.json").getText()
        def apkConfigJson = new JsonSlurper().parseText(apkConfig)
        def elements = apkConfigJson.elements
        def outputConfig = elements[0]
        def outputFileName = outputConfig.outputFile
        def versionName = outputConfig.versionName
        def versionCode = outputConfig.versionCode
        def apkFile = new File(outputDirPath + File.separator + outputFileName)
        def apkMd5 = generateMD5(apkFile)
        println("apkConfig：===> variantName is $variantName versionName is $versionName")
        println("apkConfig：===> variantName is $variantName versionCode is $versionCode")
        println("apkConfig：===> variantName is $variantName apkSize     is ${apkFile.length()}")
        println("apkConfig：===> variantName is $variantName apkHash     is $apkMd5")
    } catch (FileNotFoundException ignored) {
        println("printAppConfig：===> variantName is $variantName 未识别到打包后的 apk 文件或目录")
    } catch (Throwable t) {
        t.printStackTrace()
    }
}

static def generateMD5(final file) {
    MessageDigest digest = MessageDigest.getInstance("MD5")
    file.withInputStream() { is ->
        byte[] buffer = new byte[8192]
        while ((read = is.read(buffer)) > 0) {
            digest.update(buffer, 0, read)
        }
    }
    byte[] md5sum = digest.digest()
    BigInteger bigInt = new BigInteger(1, md5sum)
    bigInt.toString(16).padLeft(32, '0')
}

// MiPush 接入文档：https://dev.mi.com/console/doc/detail?pId=41#_0_0
// 添加构建依赖项：https://developer.android.google.cn/studio/build/dependencies
// api 与 implementation 的区别：https://www.jianshu.com/p/8962d6ba936e
dependencies {
    def paging_version = "3.2.0"
    def nav_version = "2.7.7"
    def emoji2_version = "1.0.0-beta01"
    def room_version = "2.6.1"
    def work_version = "2.9.0"
    def markwon_version = "4.6.2"
    def prism_version = "2.0.0"
    def qmui_arch_version = '2.0.1'
    def aria_version = '3.8.16'

    // 基类封装
    // implementation project(':library:base')
    // 控件封装
    // implementation project(':library:widget')
    // 友盟封装
    // implementation project(':library:umeng')
    // 网络封装
    // implementation project(':library:network')

    // 友盟公共库
    implementation 'com.umeng.umsdk:common:9.4.7'
    implementation 'com.umeng.umsdk:asms:1.4.1'
    // 友盟分享库
    implementation 'com.umeng.umsdk:share-core:7.1.7'
    // 友盟微信分享
    implementation 'com.umeng.umsdk:share-wx:7.1.7'
    // 友盟 QQ 分享
    implementation 'com.umeng.umsdk:share-qq:7.1.7'

    // QQ 组件：https://wiki.open.qq.com/wiki/QQ%E7%94%A8%E6%88%B7%E8%83%BD%E5%8A%9B
    implementation 'com.tencent.tauth:qqopensdk:3.53.0'
    // 微信组件：https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9'

    // 单元测试
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.2.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'

    implementation 'androidx.core:core-ktx:1.12.0'
    implementation 'androidx.activity:activity-ktx:1.8.2'
    implementation 'androidx.fragment:fragment-ktx:1.6.2'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'

    // Room 数据库：https://developer.android.com/jetpack/androidx/releases/room
    // CodeLab：https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0
    implementation "androidx.room:room-runtime:$room_version"
    // 使用 Kotlin 注解处理工具
    ksp "androidx.room:room-compiler:$room_version"
    // 对 Room 的 Kotlin 扩展和协程支持
    implementation "androidx.room:room-ktx:$room_version"

    // Paging 分页库：https://developer.android.google.cn/jetpack/androidx/releases/paging
    implementation "androidx.paging:paging-runtime-ktx:$paging_version"
    // Navigation 导航
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    // Feature module Support
    implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"
    // Emoji2：https://developer.android.google.cn/jetpack/androidx/releases/emoji2
    // implementation("androidx.emoji2:emoji2:$emoji2_version")
    // implementation("androidx.emoji2:emoji2-views:$emoji2_version")
    // implementation("androidx.emoji2:emoji2-views-helper:$emoji2_version")
    // WorkManager（Kotlin + coroutines）：https://developer.android.google.cn/jetpack/androidx/releases/work
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // 权限请求框架：https://github.com/getActivity/XXPermissions
    implementation 'com.github.getActivity:XXPermissions:20.0'

    // 标题栏框架：https://github.com/getActivity/TitleBar
    implementation 'com.github.getActivity:TitleBar:10.5'

    // 吐司框架：https://github.com/getActivity/Toaster
    implementation 'com.github.getActivity:Toaster:12.8'

    // 网络请求框架：https://github.com/getActivity/EasyHttp
    implementation 'com.github.getActivity:EasyHttp:10.2'
    // OkHttp 框架：https://github.com/square/okhttp
    compileOnly 'com.squareup.okhttp3:okhttp:4.12.0'
    // Android网络请求库：https://github.com/square/retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.11.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'

    // Json 解析框架：https://github.com/google/gson
    implementation 'com.google.code.gson:gson:2.12.1'
    // Gson 解析容错：https://github.com/getActivity/GsonFactory
    implementation 'com.github.getActivity:GsonFactory:9.6'

    // Shape 框架：https://github.com/getActivity/ShapeView
    implementation 'com.github.getActivity:ShapeView:8.5'

    implementation "io.github.FlyJingFish.AndroidAop:android-aop-core:${android_aop_version}"
    implementation "io.github.FlyJingFish.AndroidAop:android-aop-annotation:${android_aop_version}"
    ksp "io.github.FlyJingFish.AndroidAop:android-aop-ksp:${android_aop_version}"

    // 图片加载框架：https://github.com/bumptech/glide
    // 官方使用文档：https://github.com/Muyangmin/glide-docs-cn
    implementation 'com.github.bumptech.glide:glide:4.16.0'
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.16.0'
    ksp 'com.github.bumptech.glide:compiler:4.16.0'

    // 沉浸式框架：https://github.com/gyf-dev/ImmersionBar
    implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
    // kotlin扩展（可选）
    implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2'

    // 手势 ImageView：https://github.com/Baseflow/PhotoView
    implementation 'com.github.Baseflow:PhotoView:2.3.0'

    // Bugly 异常捕捉：https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20190418140644
    implementation 'com.tencent.bugly:crashreport:3.4.4'
    implementation 'com.tencent.bugly:nativecrashreport:3.9.2'

    // 动画解析库：https://github.com/airbnb/lottie-android
    // 动画资源：https://lottiefiles.com、https://icons8.com/animated-icons
    implementation 'com.airbnb.android:lottie:6.0.0'

    // 上拉刷新下拉加载框架：https://github.com/scwang90/SmartRefreshLayout
    implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0'
    implementation 'io.github.scwang90:refresh-header-material:2.0.5'
    implementation 'io.github.scwang90:refresh-header-classics:2.1.0'

    // 日志打印框架：https://github.com/JakeWharton/timber
    implementation 'com.jakewharton.timber:timber:5.0.1'

    // 指示器框架：https://github.com/ongakuer/CircleIndicator
    implementation 'me.relex:circleindicator:2.1.6'

    // 腾讯 MMKV：https://github.com/Tencent/MMKV
    implementation 'com.tencent:mmkv-static:1.3.9'

    // 内存泄漏监测框架：https://github.com/square/leakcanary
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
    previewImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'

    // 多语种：https://github.com/getActivity/MultiLanguages
    // 悬浮窗：https://github.com/getActivity/XToast
    // 日志输出：https://github.com/getActivity/Logcat
    // 工具类：https://github.com/Blankj/AndroidUtilCode
    implementation 'com.blankj:utilcodex:1.31.1'
    // 轮播图：https://github.com/bingoogolapple/BGABanner-Android
    // 二维码：https://github.com/bingoogolapple/BGAQRCode-Android
    // 跑马灯：https://github.com/sunfusheng/MarqueeView
    // 对象注解：https://www.jianshu.com/p/f1f888e4a35f
    // 平板适配：https://github.com/JessYanCoding/AndroidAutoSize
    // 图片压缩：https://github.com/Curzibn/Luban
    implementation 'top.zibin:Luban:1.1.8'
    // 对象注解：https://www.jianshu.com/p/f1f888e4a35f
    // 对象存储：https://github.com/leavesC/DoKV
    // 第三方支付：https://github.com/Cuieney/RxPay
    // 多渠道打包：https://github.com/Meituan-Dianping/walle
    // 设备唯一标识：http://msa-alliance.cn/col.jsp?id=120
    // 嵌套滚动容器：https://github.com/donkingliang/ConsecutiveScroller
    // 隐私调用监控：https://github.com/huage2580/PermissionMonitor

    // 一个强大并且灵活的RecyclerViewAdapter：https://github.com/CymChad/BaseRecyclerViewAdapterHelper
    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'
    // 轮播图库：https://github.com/youth5201314/banner
    implementation 'io.github.youth5201314:banner:2.2.3'

    // 小米更新SDK：https://dev.mi.com/console/doc/detail?pId=4
    implementation 'mi-appstore:xiaomi-update-sdk:4.0.3'

    // // Markwon是一个适用于 Android 的Markdown库：https://noties.io/Markwon/
    // implementation "io.noties.markwon:core:$markwon_version"
    // implementation "io.noties.markwon:html:$markwon_version"
    // // implementation "io.noties.markwon:image:$markwon_version"
    // implementation "io.noties.markwon:image-glide:$markwon_version"
    // implementation "io.noties:prism4j:${prism_version}"
    // kapt "io.noties:prism4j-bundler:${prism_version}"
    // implementation "io.noties.markwon:syntax-highlight:$markwon_version"
    // // 自动生成语法高亮类的注解处理器
    // annotationProcessor "io.noties:prism4j-bundler:${prism_version}"
    // 支持动画展开和折叠其子视图的 Android 布局类：https://github.com/cachapa/ExpandableLayout
    // implementation 'com.github.cachapa:ExpandableLayout:2.9.2'

    // 使用 Android ViewBinding 更简单：https://github.com/androidbroadcast/ViewBindingPropertyDelegate
    implementation 'com.github.kirich1409:viewbindingpropertydelegate:1.5.3'
    // Longan 是一个简化 Android 开发的 Kotlin 工具类集合，可以使代码更加简洁易读：https://github.com/DylanCaiCoding/Longan
    implementation 'com.github.DylanCaiCoding.Longan:longan:1.0.0'
    // Optional
    implementation 'com.github.DylanCaiCoding.Longan:longan-design:1.0.0'
    // 一个简单而友好的Android数据库调试库：https://github.com/guolindev/Glance/
    debugImplementation 'com.guolindev.glance:glance:1.1.0'
    // 一个帮助键盘平滑过渡到功能面板的框架：https://github.com/YummyLau/PanelSwitchHelper
    // implementation 'com.github.YummyLau:PanelSwitchHelper:1.4.0'

    // // skin-support
    // implementation 'skin.support:skin-support:4.0.5'
    // // skin-support 基础控件支持
    // implementation 'skin.support:skin-support-appcompat:4.0.5'
    // // skin-support-design material design 控件支持[可选]
    // implementation 'skin.support:skin-support-design:4.0.5'
    // // skin-support-cardview CardView 控件支持[可选]
    // implementation 'skin.support:skin-support-cardview:4.0.5'
    // // skin-support-constraint-layout ConstraintLayout 控件支持[可选]
    // implementation 'skin.support:skin-support-constraint-layout:4.0.5'
    // // 提高 Android UI 开发效率的 UI 库：https://github.com/Tencent/QMUI_Android
    // implementation "com.qmuiteam:qmui:$qmui_arch_version"
    // implementation "com.qmuiteam:arch:$qmui_arch_version"
    // kapt "com.qmuiteam:arch-compiler:$qmui_arch_version"
    // 华为统一扫码服务：https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/service-introduction-0000001050041994
    implementation 'com.huawei.agconnect:agconnect-core:1.6.0.300'
    implementation 'com.huawei.hms:scan:2.6.0.300'

    // Hilt依赖注入：https://developer.android.google.cn/jetpack/androidx/releases/hilt
    // 组件层次结构备忘录：https://dagger.dev/hilt/components.html#component-lifetimes
    implementation "com.google.dagger:hilt-android:2.47"
    ksp "com.google.dagger:hilt-android-compiler:2.47"

    // // 从图片中提取具有代表性的调色板：https://developer.android.com/jetpack/androidx/releases/palette
    implementation 'androidx.palette:palette:1.0.0'

    // Android下打造通用便捷的PopupWindow弹窗库：https://github.com/razerdp/BasePopup
    implementation 'io.github.razerdp:BasePopup:3.2.1'

    // 一个强大的🚀Android 图表视图/图形视图库，支持折线图、雷达图、气泡图和烛台图以及缩放、平移和动画：https://github.com/PhilJay/MPAndroidChart
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'

    // 浮窗从未如此简单（后续考虑替换）：https://github.com/princekin-f/EasyFloat
    implementation 'com.github.princekin-f:EasyFloat:2.0.4'
    // 悬浮窗框架：https://github.com/getActivity/EasyWindow
    implementation 'com.github.getActivity:EasyWindow:11.2'

    // 阿里云视频播放器 SDK：https://help.aliyun.com/document_detail/124711.html?spm=a2c4g.11186623.0.0.7bd24addVQH3VE
    implementation 'com.aliyun.sdk.android:AliyunPlayer:5.4.9.2-full'

    // implementation "me.laoyuyu.aria:core:$aria_version"
    // annotationProcessor "me.laoyuyu.aria:compiler:$aria_version"
    // // 如果需要使用ftp，请增加该组件
    // implementation "me.laoyuyu.aria:ftp:$aria_version"
    // // 如果需要使用ftp，请增加该组件
    // implementation "me.laoyuyu.aria:sftp:$aria_version"
    // // 如果需要使用m3u8下载功能，请增加该组件
    // implementation "me.laoyuyu.aria:m3u8:$aria_version"

    // 消息总线，基于LiveData，具有生命周期感知能力：https://github.com/JeremyLiao/LiveEventBus
    implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0'
}