package net.heartsome.cat.ts.ui.qa.export;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;

import net.heartsome.cat.common.innertag.factory.PlaceHolderEditModeBuilder;
import net.heartsome.cat.common.innertag.factory.XliffInnerTagFactory;
import net.heartsome.cat.common.resources.ResourceUtils;
import net.heartsome.cat.common.ui.utils.InnerTagUtil;
import net.heartsome.cat.ts.ui.Constants;
import net.heartsome.cat.ts.ui.bean.XliffEditorParameter;
import net.heartsome.cat.ts.ui.qa.Activator;
import net.heartsome.cat.ts.ui.qa.model.QAResultBean;
import net.heartsome.cat.ts.ui.qa.resource.Messages;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 导出品质检查结果视图
 * @author robert	2013-07-31
 */
public class ExportQAResult {
	/** 是否合并打开 */
	private boolean isMultiFile;
	private String exportFilePath;
	private List<String> filePathList = new ArrayList<String>();
	public static final Logger LOGGER = LoggerFactory.getLogger(ExportQAResult.class);
	/** 已经合并的合并 id, 之后遇到不再合并 */
	private Set<String> mergedIdSet = new HashSet<String>();
	
	protected PlaceHolderEditModeBuilder placeHolderBuilder = new PlaceHolderEditModeBuilder();
	protected XliffInnerTagFactory innerTagFactory = new XliffInnerTagFactory(placeHolderBuilder);
	
	public ExportQAResult(){ }

	public ExportQAResult(boolean isMultiFile, String exportFilePath){
		this.isMultiFile = isMultiFile;
		this.exportFilePath = exportFilePath;
	}
	

	
	public void beginExport(List<QAResultBean> dataList, List<String> fileLCList, IProgressMonitor monitor){
		if (monitor == null) {
			monitor = new NullProgressMonitor();
		}
		// 分成十份,其中解析文件 1 份,其余 9 份
		monitor.beginTask("", 10);
		monitor.setTaskName(Messages.getString("qa.export.ExportQAResult.monitor.title"));
		
		// 将 fileLCList 转换成相对路径
		List<File> fileList = new ArrayList<File>();
		for (String fileLC : fileLCList) {
			fileList.add(new File(fileLC));
		}
		for(IFile iFile : ResourceUtils.filesToIFiles(fileList)){
			filePathList.add(iFile.getFullPath().toOSString());
		}
		
		if (monitor.isCanceled()) {
			throw new OperationCanceledException();
		}
		monitor.worked(1);
		
		// UNDO 这里按文件排序给注释了。。。。
//		// 先按文件排序
//		sort(dataList);
		
		// 工作簿
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 创建sheet页
		XSSFSheet sheet = workbook.createSheet();
		
		// 设置sheet名称
		workbook.setSheetName(0, Messages.getString("qa.export.ExportQAResult.sheet.title"));
		sheet.setColumnWidth(0, 255*6);
		sheet.setColumnWidth(1, 255*20);
		sheet.setColumnWidth(2, 255*30);
		sheet.setColumnWidth(3, 255*60);
		sheet.setColumnWidth(4, 255*60);

		XSSFFont titleFont = workbook.createFont();
		titleFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex());
		titleFont.setBold(true);
		titleFont.setFontHeight(20);

		XSSFFont headerFont = workbook.createFont();
		headerFont.setBold(true);
		headerFont.setFontHeight(14);
		
		XSSFFont errorFont = workbook.createFont();
		errorFont.setColor(IndexedColors.RED.getIndex());
		
		XSSFCellStyle titleStyle = workbook.createCellStyle();
		titleStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		titleStyle.setAlignment(HorizontalAlignment.CENTER);
		titleStyle.setFont(titleFont);
		
		XSSFCellStyle headerStyle = workbook.createCellStyle();
		headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
		headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
		headerStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		headerStyle.setFont(headerFont);
		
		XSSFCellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		cellStyle.setWrapText(true);
		
		XSSFCellStyle errorCellStyle = workbook.createCellStyle();
		errorCellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		errorCellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		errorCellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		errorCellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		errorCellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		errorCellStyle.setWrapText(true);
		errorCellStyle.setFont(errorFont);
		
		
		// 生成标题行
		XSSFRow row = sheet.createRow(0);
		XSSFCell cell = row.createCell(0);
        cell.setCellStyle(titleStyle);
        cell.setCellValue(Messages.getString("qa.export.ExportQAResult.titleCell"));
		
		String[] headers = new String[] {
				Messages.getString("qa.export.ExportQAResult.header.errorLeavel"), // 级别
				Messages.getString("qa.export.ExportQAResult.header.qaType"), // 类型
				Messages.getString("qa.export.ExportQAResult.header.location"), // 位置
				Messages.getString("qa.export.ExportQAResult.header.srcText"), // 源文
				Messages.getString("qa.export.ExportQAResult.header.tgtText") //  译文
		};
		
		
        // 产生表格标题行
		row = sheet.createRow(1);
        for (short i = 0; i < headers.length; i++) {
            cell = row.createCell(i);
            cell.setCellStyle(headerStyle);
            cell.setCellValue(headers[i]);
        }
        
        // 开始生成数据
        int index = 1;
        String rowId = null;

        // 先处理品质检查结果数据为空的情况
        if (dataList.size() <= 0) {
        	if (isMultiFile) {
        		String multiFileStr = getMultiResouce();
        		index++;
				row = sheet.createRow(index);
				for (int i = 0; i < headers.length; i++) {
					cell = row.createCell(i);
					cell.setCellStyle(cellStyle);
					if (i == headers.length - 1) {
						cell.setCellValue(multiFileStr);
					}
				}
			}else {
				for (String filePath : this.filePathList) {
					index++;
					row = sheet.createRow(index);
					for (int i = 0; i < headers.length; i++) {
						cell = row.createCell(i);
						cell.setCellStyle(cellStyle);
						if (i == headers.length - 1) {
							cell.setCellValue(filePath);
						}
					}
				}
			}
        	sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));
		}else {
			 int interval = 1;
		        if (dataList.size() > 9) {
		        	interval = dataList.size() / 9;
				}
		        
		        int startMergeRow = -1;
		        int endMergeRow = -1;
		        
		        for (int i = 0; i < dataList.size(); i++) {
					QAResultBean bean = dataList.get(i);
		        	index++;
		        	System.out.println(index);
		        	if (index % interval == 0) {
						if (monitor.isCanceled()) {
							throw new OperationCanceledException();
						}
						monitor.worked(1);
					}
		        	
		            row = sheet.createRow(index);
		            
		        	// 处理合并 级别 与 类型 两列的行
		            mergeIF:if (bean.getMergeId() != null) {
		            	if (mergedIdSet.contains(bean.getMergeId())) {
							break mergeIF;
						}
		            	
		            	startMergeRow = index;
		            	mergeFor:for (int j = i + 1; j < dataList.size(); j++) {
		            		if (dataList.get(j).getMergeId() != null && dataList.get(j).getMergeId().equals(bean.getMergeId())) {
		            			mergedIdSet.add(bean.getMergeId());
								endMergeRow = index + (j - i);
							}else {
								break mergeFor;
							}
						}
		            	
						if (startMergeRow >= 0 && endMergeRow >= 0) {
							sheet.addMergedRegion(new CellRangeAddress(startMergeRow, endMergeRow, 0, 0));
							sheet.addMergedRegion(new CellRangeAddress(startMergeRow, endMergeRow, 1, 1));
							startMergeRow = -1;
							endMergeRow = -1;
						}
					}
		            
		        	// 循环当前行的每一列
		            for (int h = 0; h < headers.length; h++) {
		            	cell = row.createCell(h);
		            	cell.setCellStyle(cellStyle);
		            	
		            	String text = null;
		            	switch (h) {
						case 0:
							if (bean.getLevel() == 0) {
								text = Messages.getString("qa.export.ExportQAResult.errorLeavel.error");
								cell.setCellStyle(errorCellStyle);
							}else if (bean.getLevel() == 1) {
								text = Messages.getString("qa.export.ExportQAResult.errorLeavel.warning");
							}
							cell.setCellValue(text);
							break;
						case 1:
							text = bean.getQaTypeText();
							cell.setCellValue(text);
							break;
						case 2:
							text = bean.getFileName() + " [" + bean.getLineNumber() + "]";
							cell.setCellValue(text);
							break;
						case 3:
							text = bean.getSrcContent();
							cell.setCellValue(getDisplayText(text));
							break;
						case 4:
							text = bean.getTgtContent();
							cell.setCellValue(getDisplayText(text));
							break;
						default:
							break;
						}
					}
		        }
			    
//	            // 这是合并 文件路径
//	            if (isMultiFile) {
//	            	sheet.addMergedRegion(new CellRangeAddress(resourceIndex, index, 6, 6));
//	    		}else {
//	    			sheet.addMergedRegion(new CellRangeAddress(resourceIndex, index, 6, 6));
//	    		}
//	            sheet.addMergedRegion(new CellRangeAddress(rowidIndex, index, 1, 1));
//	    		sheet.addMergedRegion(new CellRangeAddress(rowidIndex, index, 4, 4));
//	    		sheet.addMergedRegion(new CellRangeAddress(rowidIndex, index, 5, 5));
		        
	    		// 标题行合并(处理未合并完的部份)
	    		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));
		}
        	
       

        try {
			FileOutputStream fileoutputstream = new FileOutputStream(exportFilePath);
			workbook.write(fileoutputstream);
			fileoutputstream.close();
			Display.getDefault().syncExec(new Runnable() {
				public void run() {
					MessageDialog.openInformation(
							Display.getDefault().getActiveShell(),
							Messages.getString("qa.all.dialog.info"),
							Messages.getString("qa.export.ExportQAResult.MSG.exportSuccess"));
				}
			});
		} catch (Exception e) {
			Display.getDefault().syncExec(new Runnable() {
				public void run() {
					MessageDialog.openInformation(
							Display.getDefault().getActiveShell(),
							Messages.getString("qa.all.dialog.info"),
							Messages.getString("qa.export.ExportQAResult.MSG.exportFail"));
				}
			});
			LOGGER.error(Messages.getString("qa.export.ExportQAResult.LOG.exportError"), e);
		}
	}
	
	/**
	 * 根据传入的源文或译文的全文本,获取要显示的文本段内容。
	 * @param srcOrTgtContent
	 * @return
	 */
	private String getDisplayText(String srcOrTgtContent){
		innerTagFactory.reset();
		String displayText = InnerTagUtil.resolveTag(innerTagFactory.parseInnerTag(srcOrTgtContent));
		if (XliffEditorParameter.getInstance().isShowNonpirnttingCharacter()) {
			displayText = displayText.replaceAll("\\n", Constants.LINE_SEPARATOR_CHARACTER + "\n");
			displayText = displayText.replaceAll("\\t", Constants.TAB_CHARACTER + "\u200B");
			displayText = displayText.replaceAll(" ", Constants.SPACE_CHARACTER + "\u200B");
		}
		
		Matcher matcher = PlaceHolderEditModeBuilder.PATTERN.matcher(displayText);
		int tagIdx = 1;
		while(matcher.find()){
			displayText = matcher.replaceFirst("{" + (tagIdx ++) + "}");
			matcher = PlaceHolderEditModeBuilder.PATTERN.matcher(displayText);
		}
		return displayText;
	}

	
//	private void sort(List<QAResultBean> dataList){
//		//排序
//		Collections.sort(dataList, new Comparator<QAResultBean>() {
//			public int compare(QAResultBean o1, QAResultBean o2) {
//				return o1.getResource().compareTo(o2.getResource());
//			}
//		});
//	}
	
	/**
	 * 如果是合并打开,那么返回
	 * @param datalist
	 * @return
	 */
	private String getMultiResouce(){
		StringBuffer sb = new StringBuffer(); 
		sb.append(Messages.getString("qa.export.ExportQAResult.multifyOpen"));
		for(String resource : filePathList){
			sb.append(resource).append("\n");
		}
		
		return sb.toString();
	}
	
	
	public static byte[] getImageData(String imgPath){
		byte[] arrayByte = null;
		try {
			Bundle buddle = Platform.getBundle(Activator.PLUGIN_ID);
			URL defaultUrl = buddle.getEntry(imgPath);
			String imagePath = imgPath;
			imagePath = FileLocator.toFileURL(defaultUrl).getPath();
			arrayByte = IOUtils.toByteArray(new FileInputStream(new File(imagePath)));
		} catch (Exception e) {
		}
		
		return arrayByte;
	}
	
	
	public static void main(String[] args) {
		int index = 0;
		thisIF:if (index < 10) {
			System.out.println(index);
			index += 10;
			if (index > 5) {
				break thisIF;
			}
			System.out.println(index);
		}
		
		
		
	}
	
}