/*
 * ********************************************************************************************************************
 *
 *                     :*$@@%$*:                         ;:                ;;    ;;
 *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
 *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
 *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
 *                  =@*                                  %!              @ $= % %@=   =%@!      %=
 *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
 *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
 *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
 *         $@*   ;@@@%=!:                *@*
 *         =@$    ;;;!=%@@@@=!           =@!
 *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
 *           ;%@@$=$@@%*       *@@@$=%@@%;
 *              ::;::             ::;::                                              All rights reserved.
 *
 * ********************************************************************************************************************
 */

package com.persagy.revit.services.endpoint

import com.alibaba.fastjson.JSONObject
import java.io.FileNotFoundException
import java.io.IOException
import java.io.InputStream
import java.nio.charset.Charset
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream

/**
 * 上传文件服务
 *
 * @author jxing
 */
object UploadService {

//    private val BUFFER = 512
//    /**
//     * 解压缩方法
//     *
//     *
//     * @param zipFile 压缩文件名
//     * @param dstPath 解压目标路径
//     *
//     * @return
//     */
//    fun unzip(zipFile: InputStream, dstPath: String): Boolean {
//        println("zip uncompressing...")
//
//        try {
//            val zipInputStream = ZipInputStream(zipFile)
//            var zipEntry: ZipEntry? = null
//            val buffer = ByteArray(BUFFER)//缓冲器
//            var readLength = 0//每次读出来的长度
//            zipEntry = zipInputStream.nextEntry
//            while (zipEntry != null) {
//                if (zipEntry!!.isDirectory) {//若是zip条目目录，则需创建这个目录
//                    val dir = File(dstPath + "\\" + zipEntry.name)
//
//                    if (!dir.exists()) {
//                        dir.mkdirs()
//                        println("mkdirs: " + dir.canonicalPath)
//                    }
//                    zipEntry = zipInputStream.nextEntry
//                    continue
//                }
//
//                val file = createFile(dstPath, zipEntry.name)//若是文件，则需创建该文件
//
//                println("file created: " + file.canonicalPath)
//
//                val outputStream = FileOutputStream(file)
//                readLength = zipInputStream.read(buffer, 0, BUFFER)
//                while (readLength != -1) {
//                    outputStream.write(buffer, 0, readLength)
//                    readLength = zipInputStream.read(buffer, 0, BUFFER)
//                }
//
//                outputStream.close()
//                println("file uncompressed: " + file.canonicalPath)
//                zipEntry = zipInputStream.nextEntry
//            }    // end while
//        } catch (e: FileNotFoundException) {
//            println(e.message)
//            e.printStackTrace()
//            println("unzip fail!")
//
//            return false
//        } catch (e: IOException) {
//            println(e.message)
//            e.printStackTrace()
//            println("unzip fail!")
//
//            return false
//        }
//
//        println("unzip success!")
//
//        return true
//    }


    /**
     * 解压缩方法
     *
     *
     * @param zipFile 压缩文件名
     * @param dstPath 解压目标路径
     *
     * @return  Map<文件路径/文件名, 文件字节数组>
     */
    fun unzipFileToByteArray(zipFile: InputStream): Map<String, ByteArray> {
        println("zip uncompressing...")
        val map = HashMap<String, ByteArray>()
        try {
            val zipInputStream = ZipInputStream(zipFile, Charset.forName("GBK"))
            var zipEntry: ZipEntry?
            zipEntry = zipInputStream.nextEntry
            while (zipEntry != null) {
                if (zipEntry.isDirectory) {//若是zip条目目录, 跳过
                    zipEntry = zipInputStream.nextEntry
                    continue
                }
//                println(zipInputStream.readBytes())
//                val byteArr = ByteArray(zipInputStream.available());
//                zipInputStream.read(byteArr, 0, zipInputStream.available())
                val byteArr = zipInputStream.readBytes()

                map[zipEntry.name] = byteArr
                zipEntry = zipInputStream.nextEntry
            }    // end while
        } catch (e: FileNotFoundException) {
            println(e.message)
            e.printStackTrace()
            println("unzip fail!")

            return map
        } catch (e: IOException) {
            println(e.message)
            e.printStackTrace()
            println("unzip fail!")
            return map
        } catch (e: Exception) {
            println(e.message)
            e.printStackTrace()
            println("unzip fail!")
            return map
        }
        return map
    }

    /**
     * 解压zip文件, 将里面的json文件返回
     *
     * @return Map<文件路径/文件名, json文件内容>
     */
    fun getJSONObjectMap(zipFile: InputStream) : Map<String, JSONObject>{
        val byteArrMap = unzipFileToByteArray(zipFile)

        val ret = HashMap<String, JSONObject>()
        for((name, byteArr) in byteArrMap){
            try {
                val str = String(byteArr, charset("utf-8"))
                val obj = JSONObject.parseObject(str)//JSONObject(str)
                ret[name] = obj
            }catch (e: Exception) {
            }
        }
        return ret
    }


//    /**
//     * 创建文件
//     * 根据压缩包内文件名和解压缩目的路径，创建解压缩目标文件，
//     * 生成中间目录
//     * @param dstPath 解压缩目的路径
//     * @param fileName 压缩包内文件名
//     *
//     * @return 解压缩目标文件
//     *
//     * @throws IOException
//     */
//    @Throws(IOException::class)
//    private fun createFile(dstPath: String, fileName: String): File {
//        val dirs = fileName.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()//将文件名的各级目录分解
//        var file = File(dstPath)
//
//        if (dirs.size > 1) {//文件有上级目录
//            for (i in 0 until dirs.size - 1) {
//                file = File(file, dirs[i])//依次创建文件对象知道文件的上一级目录
//            }
//
//            if (!file.exists()) {
//                file.mkdirs()//文件对应目录若不存在，则创建
//                println("mkdirs: " + file.canonicalPath)
//            }
//
//            file = File(file, dirs[dirs.size - 1])//创建文件
//
//            return file
//        } else {
//            if (!file.exists()) {
//                file.mkdirs()//若目标路径的目录不存在，则创建
//                println("mkdirs: " + file.canonicalPath)
//            }
//
//            file = File(file, dirs[0])//创建文件
//
//            return file
//        }
//    }

}