package cn.wisenergy.chnmuseum.party.common.dfs;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Date;
import javax.imageio.ImageIO;

import org.apache.commons.io.FilenameUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ueditor
 */
public class FastdfsUtil {

	private static final Logger logger = LoggerFactory.getLogger(FastdfsUtil.class);

	private static boolean isInit = false;

	private static void init() throws Exception {
		String classPath = new File(FastdfsUtil.class.getResource("/").getFile()).getCanonicalPath();
		String configFilePath = classPath + File.separator + "fastdfs-client.properties";
		logger.info("FastdfsUtils.init加载配置文件:" + configFilePath);
		ClientGlobal.initByProperties(configFilePath);
	}

	private static TrackerClient getTrackerClient() throws Exception {
		if (!isInit) {
			init();
			isInit = true;
		}

		TrackerClient trackerClient = new TrackerClient();
		return trackerClient;
	}

	private static TrackerServer getTrackerServer() throws Exception {
		return getTrackerClient().getConnection();
	}

	private static StorageClient getStorageClient() throws Exception {
		TrackerServer trackerServer = getTrackerServer();

		// StorageServer storageServer = null;
		// StorageClient storageClient = new StorageClient(trackerServer,
		// storageServer);
		StorageClient storageClient = new StorageClient(trackerServer, null);
		return storageClient;
	}

	/**
	 * 文件方式上传
	 */
	public static Map<String, Object> uploadFile(File file) {
		String fileName = file.getName();
		byte[] fileBuff = FileUtil.getBytes(file);
		return uploadFile(fileBuff, fileName);
	}

	/**
	 * 是否是图片
	 */
	private static boolean isImage(String fileName) {
		return FileTypeUtil.isImageByExtension(fileName);
	}

	/**
	 * 字节流方式上传
	 */
	public static Map<String, Object> uploadFile(byte[] fileBuff, String fileName) {
		String originalFileName = FilenameUtils.getName(fileName);// 文件名
		String fileExtName = FilenameUtils.getExtension(originalFileName);// 文件后缀名
		long length = fileBuff.length;// 字节
		boolean isImage = isImage(originalFileName);
		String mimeType = FileUtil.getMimeType(fileName);
		int width = 0;
		int height = 0;
		if (isImage) {
			int[] imageInfo = getImageInfo(fileBuff);
			if (imageInfo != null) {
				width = imageInfo[0];
				height = imageInfo[1];
			}
		}

		NameValuePair[] metaList = new NameValuePair[] { new NameValuePair("fileName", fileName),
				new NameValuePair("isImage", isImage + ""), new NameValuePair("mimeType", mimeType),
				new NameValuePair("width", width + ""), new NameValuePair("height", height + ""),
				new NameValuePair("author", "FastdfsUtils") };
		boolean status = false;
		String message = "文件上传失败!";
		logger.info("startTIme:" + (new Date().getMinutes()));
		String[] responseData = storeFile(fileBuff, fileExtName, metaList);
		logger.info("startTIme:" + (new Date().getMinutes()));


		Map<String, Object> uploadResult = new HashMap<String, Object>();
		if (responseData != null) {
			status = true;
			message = "文件上传成功!";
			uploadResult.put("isImage", isImage);
			if (isImage) {
				uploadResult.put("width", width);
				uploadResult.put("height", height);
			}
			uploadResult.put("groupName", responseData[0]);
			uploadResult.put("storageFileName", responseData[1]);
			uploadResult.put("link", responseData[0] + "/" + responseData[1]);// 文件访问链接
		}

		uploadResult.put("status", status);
		uploadResult.put("message", message);

		uploadResult.put("fileName", fileName);
		uploadResult.put("mimeType", mimeType);
		uploadResult.put("length", length);

		return uploadResult;
	}

	private static int[] getImageInfo(byte[] fileBuff) {
		try {
			// File转为BufferedImage
			// BufferedImage buff = ImageIO.read(new
			// FileImageInputStream(file));
			// BufferedImage buff = ImageIO.read(file);

			// byte[]转为BufferedImage
			ByteArrayInputStream in = new ByteArrayInputStream(fileBuff);// 将byte[]作为输入流;
			BufferedImage image = ImageIO.read(in);// 将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
			int width = image.getWidth();
			int height = image.getHeight();
			return new int[] { width, height };
		} catch (Exception e) {
			logger.error("FastdfsUtils.getImageInfo时发生异常:", e);
		}
		return new int[] { 0, 0 };
	}

	private static String[] storeFile(byte[] fileBuff, String fileExtName, NameValuePair[] metaList) {
		String[] responseData = null;
		try {
			StorageClient storageClient = getStorageClient();
			responseData = storageClient.upload_file(fileBuff, fileExtName.toLowerCase(), metaList);
		} catch (Exception e) {
			logger.error("FastdfsUtils.storeFile时发生异常:", e);
		}
		return responseData;
	}

}