package com.platform.glusterfs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import com.platform.utils.Constant;

public class CheckoutMD5 {
	public static Logger log = Logger.getLogger(CheckoutMD5.class);
	String sourcePath;
	String destPath;
	String dataName;
	// String cmd_crateSourceMD5File="find "+sourcePath+dataName+"/app/ -type f
	// -print0 | xargs -0 md5sum | sort >"+deskPath+dataName+"_md5.txt";
	String cmd_getSourceMD5File;
	// String cmd_crateDestMD5File="find "+destPath+dataName+"/app/ -type f
	// -print0 | xargs -0 md5sum | sort >"+deskPath+dataName+"_md5.txt";
	String cmd_getDestMD5File;
	Map<String, String> source_md5 = new HashMap<String, String>();
	Map<String, String> dest_md5 = new HashMap<String, String>();

	public CheckoutMD5() {
		// TODO Auto-generated constructor stub
	}

	public CheckoutMD5(String sourcePath, String destPath, String dataName) {
		// TODO Auto-generated constructor stub
		this.sourcePath = sourcePath;
		this.destPath = destPath;
		this.dataName = dataName;
		cmd_getSourceMD5File = "find " + sourcePath + dataName + "/app/ -type f -print0 | xargs -0 md5sum | sort ";
		cmd_getDestMD5File = "find " + destPath + dataName + "/app/ -type f -print0 | xargs -0 md5sum | sort ";
	}

	/**
	 * 文件夹校验 校验sourcePath和destPath是否完全相同，如果相同，返回1；
	 * 如果不相同，返回0，如果获取文件MD5出错，返回-1；如何源文件不存在返回-2；目标文件不存在，返回-3；
	 * 
	 * @param sourcePath
	 * @param destPath
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public int checkoutMD5Folder(String sourcePath, String destPath) {
		log.info("start checkout md5 "+sourcePath+" and "+ destPath);
		List<String> wrong_files = new ArrayList<String>();
		String source_cmd = "find " + sourcePath + " -type f -print0 | xargs -0 md5sum";
		String dest_cmd = "find " + destPath + " -type f -print0 | xargs -0 md5sum";
		List<String> sourceReStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(source_cmd);
		if (sourceReStrings == null || sourceReStrings.size() == 0) {
			log.error("get " + sourcePath + " MD5 error!");
			return -1;
		}
		if(sourceReStrings.get(0).contains(Constant.noSuchFile)){
			log.error(sourcePath+" is not exist!");
			return -2;
		}
		List<String> destReStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(dest_cmd);
		if (destReStrings == null || destReStrings.size() == 0) {
			log.error("get " + destReStrings + " MD5 error!");
			return -1;
		}
		if(destReStrings.get(0).contains(Constant.noSuchFile)){
			log.error(destPath+" is not exist!");
			return -3;
		}
		Map<String, String> source_md5 = new HashMap<String, String>();
		Map<String, String> dest_md5 = new HashMap<String, String>();
		for (String line : sourceReStrings) {
			String[] lines = line.split("  ");
			String key = lines[1].replace(sourcePath, "").trim();
			String value = lines[0].trim();
			source_md5.put(key, value);
		}
		for (String line : destReStrings) {
			String[] lines = line.split("  ");
			String key = lines[1].replace(destPath, "").trim();
			String value = lines[0].trim();
			dest_md5.put(key, value);
		}
		for (Map.Entry<String, String> mapEntry : source_md5.entrySet()) {
			if (!(dest_md5.containsKey(mapEntry.getKey())
					&& dest_md5.get(mapEntry.getKey()).equals(mapEntry.getValue()))) {
				
				log.info(sourcePath + " and " + destPath + " is not same!");
				return 0;
				// System.out.println(mapEntry.getKey());
			}

		}

		log.info(sourcePath + " and " + destPath + " is  same!");
		return 1;
	}

	public static void main(String[] args) {
		CheckoutMD5 checkoutMD5 = new CheckoutMD5();
		System.out.println(checkoutMD5.checkoutMD5Folder("/home/v1_copy","/home/ubuntu"));
	}
}
