package com.hzya.frame.sys.file.download.service.impl;

import com.hzya.frame.basedao.service.impl.BaseService;
import com.hzya.frame.sys.file.upload.entity.FileUploadDto;
import com.hzya.frame.web.exception.BaseSystemException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.hzya.frame.sys.file.download.entity.FileDownloadEntity;
import com.hzya.frame.sys.file.download.service.IFileDownloadService;
import com.hzya.frame.sys.file.download.dao.IFileDownloadDao;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * @description: 系统文件下载  service
 * @tableName:   sys_file
 * @entityName:  FileDownloadEntity
 * @author: 	 gjh
 * @history:	 1.0
 */
@Service(value="sys_fileDownloadService")
public class  FileDownloadServiceImpl extends BaseService< FileDownloadEntity,Long> implements IFileDownloadService{

	protected IFileDownloadDao  filedownloadDao;
	@Value("${savefile.path}")
	public String DSK;

	@Value("${savefile.pluginpath}")
	public String PLUGINPATH;

	@Value("${savefile.tomcatpath}")
	public String TOMCATPATH;
	@Autowired
	public void setFileDownloadDao(IFileDownloadDao dao) {

		this.filedownloadDao = dao;
		this.dao=dao;
	}

	@Override
	public FileDownloadEntity fileDownload(String fileSaveName)throws Exception {
		/** 如果fileSaveName直接为空，或者null直接抛出异常*/
		if(null == fileSaveName || "".equals(fileSaveName)){
            throw new BaseSystemException("请传入fileSaveName参数!");
		}

		/** 根据唯一名称获取文件信息*/
		FileDownloadEntity queryEntity = new FileDownloadEntity();
		queryEntity.setFilesavename(fileSaveName);
		/** 查询出文件信息*/
		FileDownloadEntity fileDownloadEntity =filedownloadDao.queryOne(queryEntity);
		/** 查询不到文件的时候，直接抛出异常*/
		if(fileDownloadEntity == null){
            throw new BaseSystemException("文件不存在!");
		}
		/** 拼接文件路径*/
		String filePath = fileDownloadEntity.getFilepath()+"/"+fileSaveName;
		/** 获取file文件*/
		File file = new File(filePath);
		/** 设置file*/
		fileDownloadEntity.setFile(file);

		return fileDownloadEntity;
	}

	@Override
	public FileDownloadEntity fileDownload(FileUploadDto fileUploadDto) {
		/** 如果fileSaveName直接为空，或者null直接抛出异常*/
		if(fileUploadDto == null || fileUploadDto.getId() == null || "".equals(fileUploadDto.getId())){
			throw new BaseSystemException("请传入参数!");
		}

		/** 根据唯一名称获取文件信息*/
		FileDownloadEntity queryEntity = new FileDownloadEntity();
		queryEntity.setId(fileUploadDto.getId());
		queryEntity.setSts("Y");
		/** 查询出文件信息*/
		FileDownloadEntity fileDownloadEntity =filedownloadDao.queryOne(queryEntity);
		/** 查询不到文件的时候，直接抛出异常*/
		if(fileDownloadEntity == null){
            throw new BaseSystemException("文件不存在!");
		}
		/** 拼接文件路径*/
		String filePath = "";
		if(fileDownloadEntity.getFileType() != null && fileDownloadEntity.getFileType().equals("2")){
			filePath = PLUGINPATH + fileDownloadEntity.getFilepath().replace("/",File.separator).replace("\\",File.separator);
		}else{
			filePath = DSK + fileDownloadEntity.getFilepath().replace("/",File.separator).replace("\\",File.separator);
		}

		/** 获取file文件*/
		File file = new File(filePath);
		/** 设置file*/
		fileDownloadEntity.setFile(file);
		return fileDownloadEntity;
	}

//	@Override
//	public FileDownloadEntity pluginZipUpate(FileUploadDto fileUploadDto) throws Exception {
//		/** 如果fileUploadDto的id直接为空，或者null直接抛出异常*/
//		if(fileUploadDto == null || fileUploadDto.getId() == null || "".equals(fileUploadDto.getId())){
//			throw new BaseSystemException("请传入参数!");
//		}
//		/** 根据唯一名称获取文件信息*/
//		FileDownloadEntity queryEntity = new FileDownloadEntity();
//		queryEntity.setId(fileUploadDto.getId());
//		queryEntity.setSts("Y");
//		FileDownloadEntity fileDownloadEntity =filedownloadDao.queryOne(queryEntity);
//		String filePath = fileDownloadEntity.getFilepath();
//		//插件附件路径
//		String inputFile = PLUGINPATH + filePath;
//
//		File srcFile = new File(inputFile);//获取当前压缩文件
//		// 判断源文件是否存在
//		if (!srcFile.exists()) {
//			throw new Exception(srcFile.getPath() + "所指文件不存在");
//		}
//		ZipFile zipFile = new ZipFile(srcFile);//创建压缩文件对象
//		//开始解压
//		Enumeration<?> entries = zipFile.entries();
//		boolean isFirst = true;
//		String firstName = "";
//		while (entries.hasMoreElements()) {
//			ZipEntry entry = (ZipEntry) entries.nextElement();
//			// 构造解压后的文件路径,去掉压缩包的名字
//			String unzipPath = entry.getName().replace(firstName,"");
//			String classPath = "com\\hzya\\frame\\plugin";
//			String xmlPath = "cfgHome\\plugin";
//
//			String dirPath = "";
//			if(unzipPath.contains("classfile/")){
//				dirPath = TOMCATPATH + "/" + classPath + unzipPath.replace("classfile","");
//			}
//			if(unzipPath.contains("xmlfile/")){
//				dirPath = 	TOMCATPATH + "/" + xmlPath + unzipPath.replace("xmlfile","");
//			}
//
//			// 如果是文件夹，就创建个文件夹
//			if (entry.isDirectory()) {
//				if(isFirst == false){
//					File dir = new File(dirPath);
//					dir.mkdirs();
//				}else{
//					firstName = entry.getName();
//					isFirst = false;
//				}
//			} else {
//				// 如果是文件，就先创建一个文件，然后用io流把内容copy过去
//				File targetFile = new File(dirPath);
//				// 保证这个文件的父文件夹必须要存在
//				if (!targetFile.getParentFile().exists()) {
//					targetFile.getParentFile().mkdirs();
//				}
//				targetFile.createNewFile();
//				// 将压缩文件内容写入到这个文件中
//				InputStream is = zipFile.getInputStream(entry);
//				FileOutputStream fos = new FileOutputStream(targetFile);
//				int len;
//				byte[] buf = new byte[1024];
//				while ((len = is.read(buf)) != -1) {
//					fos.write(buf, 0, len);
//				}
//				// 关流顺序，先打开的后关闭
//				fos.close();
//				is.close();
//			}
//		}
//
//
//
//		return fileDownloadEntity;
//	}

	@Override
	public FileDownloadEntity pluginZipUpate(FileUploadDto fileUploadDto) throws Exception {
		/** 如果fileUploadDto的id直接为空，或者null直接抛出异常*/
		if(fileUploadDto == null || fileUploadDto.getId() == null || "".equals(fileUploadDto.getId())){
			throw new BaseSystemException("请传入参数!");
		}
		/** 根据唯一名称获取文件信息*/
		FileDownloadEntity queryEntity = new FileDownloadEntity();
		queryEntity.setId(fileUploadDto.getId());
		queryEntity.setSts("Y");
		FileDownloadEntity fileDownloadEntity =filedownloadDao.queryOne(queryEntity);
		String filePath = fileDownloadEntity.getFilepath();
		//插件附件路径
		String inputFile = PLUGINPATH + filePath;

		File srcFile = new File(inputFile);//获取当前压缩文件
		// 判断源文件是否存在
		if (!srcFile.exists()) {
			throw new Exception(srcFile.getPath() + "所指文件不存在");
		}
		ZipFile zipFile = new ZipFile(srcFile);//创建压缩文件对象
		//开始解压
		Enumeration<?> entries = zipFile.entries();

		while (entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			String unzipPath = entry.getName();

			String dirPath = TOMCATPATH + unzipPath;

			// 如果是文件夹，就创建个文件夹
			if (entry.isDirectory()) {
					File dir = new File(dirPath);
					dir.mkdirs();
			} else {
				// 如果是文件，就先创建一个文件，然后用io流把内容copy过去
				File targetFile = new File(dirPath);
				// 保证这个文件的父文件夹必须要存在
				if (!targetFile.getParentFile().exists()) {
					targetFile.getParentFile().mkdirs();
				}
				targetFile.createNewFile();
				// 将压缩文件内容写入到这个文件中
				InputStream is = zipFile.getInputStream(entry);
				FileOutputStream fos = new FileOutputStream(targetFile);
				int len;
				byte[] buf = new byte[1024];
				while ((len = is.read(buf)) != -1) {
					fos.write(buf, 0, len);
				}
				// 关流顺序，先打开的后关闭
				fos.close();
				is.close();
			}
		}

		return fileDownloadEntity;
	}


}
