package com.sw.appcloudv1.service;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class AppDownloadServiceImpl implements AppDownloadService {
    private static final Logger logger = LoggerFactory.getLogger(AppDownloadServiceImpl.class);

    /**
     * app完整包地址
     */
    @Value("${app.file.path}")
    private String filePath;

    /**
     * app更新包地址
     */
    @Value("${app.update.path}")
    private String updatePath;

    /**
     * @Description: 下载文件
     * @Param: [response, version：版本号, projectId：项目id]
     * @Return:
     */
    @Override
    public void download(HttpServletResponse response, Integer projectId) {
        projectId = projectId == null ? 1 : projectId;
        //  获取目录下的全部文件名
        List<String> listFileNames = getFileNames(filePath);
        if (listFileNames.size() == 0) {
            return;
        }
        //  获取最新版本文件名
        String newFile = getNewFileName(listFileNames, projectId);
        if (newFile == null) {
            return;
        }
        //  下载文件
        download(response, newFile, filePath);
    }

    /**
     * @Description: 获取最新的版本号
     * @Param: [projectId]
     * @Return:
     */
    @Override
    public String getNewVersion(Integer projectId) {
        projectId = projectId == null ? 1 : projectId;
        //  获取目录下的全部文件名
        List<String> listFileNames = getFileNames(filePath);
        if (listFileNames.size() == 0) {
            return null;
        }
        //  获取最新版本文件名
        String newFile = getNewFileName(listFileNames, projectId);
        if (newFile == null) {
            return null;
        }
        //  返回
        return newFile.substring(0, newFile.lastIndexOf("."));
    }

    /**
     * @Description: 流文件下载
     * @Param: [response, newFile：最新版本的文件名, path：文件目录]
     * @Return:
     */
    private void download(HttpServletResponse response, String newFile, String path) {
        InputStream fis = null;
        try {
            path = path + "/" + newFile;
            File file = new File(path);
            // 取得文件的后缀名。
            String ext = newFile.substring(newFile.lastIndexOf(".") + 1).toUpperCase();
            // 以流的形式下载文件。
            fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(newFile.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
            logger.info("下载app文件成功！");
        } catch (IOException ex) {
            ex.printStackTrace();
            logger.info("下载app文件失败！");
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.info("关闭文件流失败！");
                }
            }
        }
    }

    /**
     * @Description: 获取最新版本的文件名
     * @Return:
     */
    private String getNewFileName(List<String> listFileNames, Integer projectId) {
        String newFile = null;
        Integer maxVersionId = 1;
        for (String fileName : listFileNames) {
            Integer pid = Integer.parseInt(fileName.substring(9, 11));
            //  判断项目id
            if (pid.equals(projectId)) {
                if (newFile == null) {
                    newFile = fileName;
                } else {
                    //  获取最新版本号
                    Integer versionId = Integer.parseInt(fileName.substring(12, 14));
                    if (versionId > maxVersionId) {
                        maxVersionId = versionId;
                        newFile = fileName;
                    }
                }
            }
        }
        return newFile;
    }

    /**
     * @Description: 获取目录下的全部文件名
     * @Return:
     */
    private List<String> getFileNames(String path) {
        //  目录下的文件名
        List<String> listFileNames = new ArrayList<>();
        //  判断是否存在目录
        File dir = new File(path);
        if (!dir.exists() || !dir.isDirectory()) {
            return new ArrayList<>();
        }
        //  读取目录下的所有目录文件信息
        String[] files = dir.list();
        //  循环，添加文件名或回调自身
        for (int i = 0; i < files.length; i++) {
            File file = new File(dir, files[i]);
            //  如果文件
            if (file.isFile()) {
                //  添加文件全路径名
//                listFileNames.add(dir + "\\" + file.getName());
//                listFileNames.add(file.getName().substring(0, file.getName().lastIndexOf(".")));
                listFileNames.add(file.getName());
            }
        }
        return listFileNames;
    }
}
