package com.abbidot.tracker.util

import android.app.Activity
import android.content.Context
import android.net.Uri
import android.os.Build
import android.os.Environment
import androidx.core.content.FileProvider
import com.abbidot.baselibrary.util.LogUtil
import com.abbidot.tracker.BuildConfig
import java.io.File
import java.math.BigDecimal

/**
 *Created  by .yzq on 2022/3/24/024.
 * @link
 * @description:
 */
class FileUtil {

    companion object {

        /**
         * 保存截屏图片目录名字
         */
        const val SCREENSHOT_DIRECTORY_NAME = "screenShot"

        /**
         * 保存分享资源目录名字
         */
        const val SHARE_DIRECTORY_NAME = "share"

        /**
         * 保存头像目录名字
         */
        const val HEAD_DIRECTORY_NAME = "headImage"

        /**
         * data首页截屏图片文件名字
         */
        const val DATA_HISTORY_FILE_NAME = "dataHistory.png"

        /**
         * 保存DFU固件目录名字
         */
        const val DFU_DIRECTORY_NAME = "dfu"

        /**
         * 保存log文件目录名字
         */
        const val LOG_DIRECTORY_NAME = "log"

        /**
         * fileProvider字段
         */
        const val FILE_PROVIDER = "${BuildConfig.APPLICATION_ID}.fileprovider"

        /**
         * 获取缓存目录
         * <p>
         * 当SD卡存在或者SD卡不可被移除的时候，就调用getExternalCacheDir()方法来获取缓存路径，否则就调用getCacheDir()
         * 方法来获取缓存路径。前者获取到的就是
         * /sdcard/Android/data//cache 这个路径，而后者获取到的是 /data/data//cache 这个路径
         * 注意：这两种方式的缓存都会在卸载app的时候被系统清理到
         * ————————————————
         * 版权声明：本文为CSDN博主「Fannatic」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
         * 原文链接：https://blog.csdn.net/u010001013/article/details/103243859
         *
         * @param context
         * @return
         */
        private fun getDiskCacheDir(context: Context): String {
            return if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState() || !Environment.isExternalStorageRemovable()) {
                //存在外部SD卡上的,在手机里可以直接看到
                context.externalCacheDir!!.path
            } else {
                //存在app的内部存储上,要root以后，用Root Explorer 文件管理器才能看到
                context.cacheDir.path
            }
        }

        /**
         * 创建、获取缓存目录下的文件夹
         */
        fun getDiskCacheDirectory(context: Context, directoryName: String): File {
            val file = File(getDiskCacheDir(context) + "/" + directoryName)
            if (!file.exists()) {
                //只能创建单层目录
                val mkdir = file.mkdir()
                LogUtil.e(directoryName + "目录创建" + mkdir)
            }
            return file
        }

        /**
         * 获取缓存太小MB
         */
        fun getCacheSize(activity: Activity): String {
            val finalSize: String
            var cacheSize = activity.cacheDir.size()
            if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
                cacheSize += activity.externalCacheDir?.size() ?: 0
            }
            finalSize = getFormatSize(cacheSize)
            return finalSize
        }

        fun getFormatSize(size: Long): String {
            if (size <= 0) {
                return "0.00\tKb"
            }
            val kSize = size / 1024f
            if (kSize < 1) {
                val result = BigDecimal(kSize.toString())
                return result.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "\tKb"
            }

            val mSize = kSize / 1024
            val result = BigDecimal(mSize.toString())
            return result.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "\tM"
        }

        /**
         * 清除缓存
         */
        fun clearCache(activity: Activity) {
            activity.cacheDir.clearFile()
            if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
                activity.externalCacheDir?.clearFile()
            }
        }

        /**
         * 获取文件或者文件夹的大小
         */
        fun File.size(): Long {
            var size = 0L
            try {
                if (isFile) {
                    size += length()
                }
                if (isDirectory) {
                    listFiles()?.forEach {
                        size += it.size()
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return size
        }

        /**
         * 删除文件或文件夹
         */
        private fun File.clearFile() {
            if (isFile) delete()
            if (isDirectory) listFiles()?.forEach { it.clearFile() }
        }

        /**
         * 获取文件File的Uri
         */
        fun getUri(cxt: Context, file: File): Uri {
            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                FileProvider.getUriForFile(cxt, FILE_PROVIDER, file)
            } else {
                Uri.fromFile(file)
            }
        }
    }
}