package com.nms.server.thread.file;

import java.io.File;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

import com.nms.server.common.Common;
import com.nms.server.common.Constants;
import com.nms.server.util.FileUtils;
import com.nms.server.util.ZipUtil;

/**
 * XML解析线程
 * 
 * @author ZGGG3
 * 
 */
public class UnZipThread implements Callable<Object> {
	
	Logger logger = Logger.getLogger(UnZipThread.class);
	
	private List<File> zipFileList;
	private String name; // 自定义Thread Name

	public UnZipThread(String name ,List<File> zipFileList) {
		this.zipFileList = zipFileList;
		this.name = name;
	}

	
	public Object call() {
		// 为当前线程命名，用与开发阶段友好输出。
		Thread.currentThread().setName(name);
		try {

			//筛选文件目录下的子目录
			File[] files = FileUtils.sortByFileNameASC(zipFileList.toArray(new File[0])); // 按文件名称 升序排序
			
			if (files != null && files.length > 0) {
				long l = Calendar.getInstance().getTimeInMillis();
				
				String resoveDirPath = null;
				int fileType = -1; // 1：detect  2：result  3：Return
				
				for (File file : files) {
					
					logger.debug("解压文件 :>" + file.getAbsolutePath());
					try {
						// 监测数据 
						if(file.getAbsolutePath().startsWith(new File(Constants.ZIP_FILE_DETECT_DATA_DIR).getAbsolutePath())){
							resoveDirPath = Constants.ZIP_RESOVE_DETECT_DATA_DIR;
							fileType = 1;
						}
						
						// 任务结果
						else if(file.getAbsolutePath().startsWith(new File(Constants.ZIP_FILE_TASK_RESULT_DIR).getAbsolutePath())){
							resoveDirPath = Constants.ZIP_RESOVE_TASK_RESULT_DIR;
							fileType = 2;
						}
						
						// 回传文件
						else if(file.getAbsolutePath().startsWith(new File(Constants.ZIP_FILE_TASK_RETURN_DIR).getAbsolutePath())){
							resoveDirPath = Constants.ZIP_RESOVE_TASK_RETURN_DIR;
							fileType = 3;
						}
						// 容错处理 删除无效文件
						else{
							file.delete();
							return null;
						}
						
						//解压zip操作
						if(fileType == 3){
							ZipUtil.unZip(file.getAbsolutePath(), resoveDirPath+file.getName());
						}else{
							ZipUtil.unZip(file.getAbsolutePath(), resoveDirPath);
						}
						
						//删除已解压文件
						file.delete();
						
						Future<?> future = Common.getFutureMap().get(resoveDirPath);
						
						//线程不存在 创建和注册
						if(future == null){
							switch (fileType) {
							case 1:			//监测数据  20160909 hyx 为了避免因长时间未收集数据，导致一次性收集大量的数据（nc端默认1000csv打包zip，所以如果监测数据打包发送，表明数据较多）,如果全部进行解析入库，会导致内存溢出，所以存入dc_overrun等待之后慢慢解析
//								future = Common.scheduled.scheduleWithFixedDelay(new DetectFileReaderThread("解析 监测数据文件",resoveDirPath), 0, 10, TimeUnit.SECONDS);
								break;
							case 2:			//任务结果
								future = Common.scheduled.scheduleWithFixedDelay(new ResultFileReaderThread("解析 任务结果文件",resoveDirPath), 0, 10, TimeUnit.SECONDS);
								break;
							case 3:			//回传文件
								future = Common.scheduled.scheduleWithFixedDelay(new ReturnFileReaderThread("解析 回传文件文件",resoveDirPath), 0, 10, TimeUnit.SECONDS);
								break;
							default:
								break;
							}
							Common.registRunnable(resoveDirPath, future);
						}

					} catch (Exception e) {
						logger.error("Unzip file abnormality "+file.getAbsolutePath(),e);
					}
				}
				logger.debug(zipFileList.size()+"个zip文件 解压完成 共耗时：>"+(Calendar.getInstance().getTimeInMillis()-l));
			}
		} catch (Exception e) {
			logger.error("",e);
		}
		return null;
	}

/*	public static void main(String[] args) {
		List<File> zipFiles = new LinkedList<File>();
		zipFiles.addAll(Arrays.asList(FileUtils.listFilesEndWith(new File(Constants.ZIP_FILE_TASK_RETURN_DIR), ".zip")));
		Common.service.submit(new UnZipThread("解压线程", zipFiles));
	}*/
}
