/*********************************************************************************************************
 * 프로그램명 : MreportMake.java 프로그램설명 : 보고한 보고자료와 문서 양식을 조합하여 보고자료 보기 처리 해줌 작성자 : 강원중 작성일 : 2003.11.30 변경일 : 2005-02-04
 **********************************************************************************************************/

package kr.co.kihyun.moumi.report;

import java.text.NumberFormat;

import kr.co.kihyun.beans.totsys.doc.table.item.ItemList;
import kr.co.kihyun.moumi.doc.table.MTable;
import kr.co.kihyun.moumi.doc.table.item.MItem;
import kr.co.kihyun.text.excel.CalculationForm;
import kr.co.kihyun.text.html.Html;
import kr.co.kihyun.text.html.HtmlUtil;
import kr.co.kihyun.text.html.TagFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MReportMaker {
	private static final Logger LOG = LoggerFactory.getLogger(MReportMaker.class);

	public static String reportMake(String form, String[] dataList, ItemList itemList, int strInItemNum, int tableType,
			int outType) {
		return reportMake(form, dataList, itemList.getNumList(), itemList.getNameList(), itemList.getBNWList(),
				itemList.getTypeList(), itemList.getExprList(), strInItemNum, 0, 0, tableType, outType);
	}

	// 보고자료보기의 정적인표, 집계현황의 정적표, 집계표의 정적, 동적표
	public static String reportMake(String form, String[] dataList, int[] itemNumList, int[] itemBNWList,
			int[] itemTypeList, String[] itemExprList, int strInItemNum, int tableType, int outType)
			throws NullPointerException {
		return reportMake(form, dataList, itemNumList, null, itemBNWList, itemTypeList, itemExprList, strInItemNum, 0,
				0, MTable.STATIC, outType);
	}

	// 보고자료보기의 정적인표, 집계현황의 정적표, 집계표의 정적, 동적표
	public static String reportMake(String form, String[] dataList, int[] itemNumList, int[] itemBNWList,
			int[] itemTypeList, int strInItemNum, int tableType, int outType) throws NullPointerException {
		return reportMake(form, dataList, itemNumList, null, itemBNWList, itemTypeList, null, strInItemNum, 0, 0,
				MTable.STATIC, outType);
	}

	// 보고자료보기의 동적인표, 집계현황의 동적인표
	public static String reportMake(String form, String[][] dataList, int[] itemNumList, String[] itemNameList,
			int[] itemBNWList, int[] itemTypeList, String[] itemExprList, int strInItemNum, int titleRowCount,
			int rowCount, int tableType, int outType) throws NullPointerException {
		StringBuffer repoBuf = new StringBuffer();
		for (int i = 0; i < dataList.length; i++) {
			repoBuf.append(reportMake(form, dataList[i], itemNumList, itemNameList, itemBNWList, itemTypeList,
					itemExprList, strInItemNum, titleRowCount, i, tableType, outType));
		}
		return repoBuf.toString();
	}

	// 출력 타입이 html, excel, hml 인지를 구분해서 excel이면 수식을 넣어서 출력한다.
	public static String reportMake(String form, String[] dataList, int[] itemNumList, String[] itemNameList,
			int[] itemBNWList, int[] itemTypeList, String[] itemExprList, int strInItemNum, int titleRowCount,
			int rowCount, int tableType, int outType) throws NullPointerException {
		if (outType == MReport.EXCEL) {
			return excelReportMake(form, dataList, itemNumList, itemNameList, itemBNWList, itemTypeList, itemExprList,
					strInItemNum, titleRowCount, rowCount, tableType);
		} else {
			return nomalReportMake(form, dataList, itemNumList, itemBNWList, itemTypeList, itemExprList, strInItemNum,
					titleRowCount, rowCount, tableType);
		}
	}

	// 동적, 정적 일반 보고지료 보기, 집계현황 보기, 집계표 보기
	private static String nomalReportMake(String form, String[] dataList, int[] itemNumList, int[] itemBNWList,
			int[] itemTypeList, String[] itemExprList, int strInItemNum, int titleRowCount, int rowCount, int tableType)
			throws NullPointerException {
		if (form == null)
			return null;
		StringBuilder repoBuf = new StringBuilder();

		int stTDIndex;
		int edTDIndex;
		int dataIndex = 0;
		int itemAllCount = itemNumList.length - 1; // 0부터 시작한 index의 마지막 값을 위해 -1를 적용함

		for (int i = strInItemNum; i <= itemAllCount; i++) {
			if (dataIndex > itemAllCount)
				break; // dataList의 length 는 itemNameList의 length를 넘을수 없다.

			stTDIndex = form.indexOf("<td");
			if (stTDIndex < 0)
				break;
			edTDIndex = form.indexOf(">", stTDIndex + 1);
			if (edTDIndex < 0)
				break;

			if (itemBNWList[i] == 1)
				dataList[dataIndex] = HtmlUtil.toBR(dataList[dataIndex]); // <TextArea></TextArea>

			if (itemTypeList[i] == MItem.TITLE) { // 타이틀일때
				repoBuf.append(form.substring(0, edTDIndex));
				repoBuf.append(" align=center>");
				/*
				 * repoBuf.append(" bgcolor='"); repoBuf.append(Html.titleBGColor); repoBuf.append("' align=center>");
				 * //출력되는 값들이 생성되는 곳
				 */
			} else if (itemTypeList[i] == MItem.INT) { // 숫자일때
				repoBuf.append(form.substring(0, edTDIndex));
				repoBuf.append(" align=right>");

				if (tableType == MTable.DYNATOTLINE) {
					repoBuf.append("<font color='");
					repoBuf.append(Html.dynaTotLineFontColor);
					repoBuf.append("'>");
					repoBuf.append(changeNumber(dataList[dataIndex])); // 출력되는 값들이 생성되는 곳
					repoBuf.append("</font>");

				} else {
					repoBuf.append(changeNumber(dataList[dataIndex])); // 출력되는 값들이 생성되는 곳
				}
				dataIndex++;

			} else if (itemTypeList[i] == MItem.CHAR) { // 문자일때
				repoBuf.append(form.substring(0, edTDIndex));
				if (itemExprList != null && itemExprList[i] != null && itemExprList[i].matches(".+?\\^.+?"))
					repoBuf.append(" valign=top");
				repoBuf.append(" align=left>");
				repoBuf.append((dataList[dataIndex] == null || dataList[dataIndex].trim().equals("")) ? "&nbsp;"
						: dataList[dataIndex]); // 출력되는 값들이 생성되는 곳
				dataIndex++;

			} else if (itemTypeList[i] == MItem.DATE) { // 날짜일때
				repoBuf.append(form.substring(0, edTDIndex));
				repoBuf.append(" align=left>");
				repoBuf.append((dataList[dataIndex] == null || dataList[dataIndex].trim().equals("")) ? "&nbsp;"
						: dataList[dataIndex]); // 출력되는 값들이 생성되는 곳
				dataIndex++;
			}

			form = form.substring(edTDIndex + 1, form.length());
		}

		repoBuf.append(form);
		return repoBuf.toString();
	}

	// 보고자료 excel저장용이며 excel의 수식이 적용된다.
	private static String excelReportMake(String form, String[] dataList, int[] itemNumList, String[] itemNameList,
			int[] itemBNWList, int[] itemTypeList, String[] itemExprList, int strInItemNum, int titleRowCount,
			int rowCount, int tableType) throws NullPointerException {
		if (form == null)
			return null;
		StringBuffer repoBuf = new StringBuffer();

		int stTDIndex;
		int edTDIndex;
		int dataIndex = 0;
		int itemAllCount = itemNumList.length - 1; // 0부터 시작한 index의 마지막 값을 위해 -1를 적용함

		rowCount = 0;
		String tmpExp = "";
		for (int i = strInItemNum; i <= itemAllCount; i++)
        {
			if (dataIndex > itemAllCount) break; // dataList의 length 는 itemNameList의 length를 넘을수 없다.
			stTDIndex = form.indexOf("<td");
			if (stTDIndex < 0)	break;
			edTDIndex = form.indexOf(">", stTDIndex + 1);
			if (edTDIndex < 0) break;
			if (stTDIndex > form.indexOf("<table") && form.indexOf("<table") > -1) { rowCount = 0; tmpExp = "";	}
			if (tmpExp.equals("") && !(itemExprList[i].equals(""))) tmpExp = itemExprList[i];
			else if ((itemExprList[i].trim()).equals(tmpExp) && !(tmpExp.equals(""))) rowCount++;
			if (itemBNWList[i] == 1) dataList[dataIndex] = HtmlUtil.toBR(dataList[dataIndex]); // <TextArea></TextArea>

			if (itemTypeList[i] == MItem.TITLE)
            { // 타이틀일때
				repoBuf.append(form.substring(0, edTDIndex));
				repoBuf.append(" bgcolor='");
				repoBuf.append(Html.titleBGColor);
				repoBuf.append("' align=center>"); // 출력되는 값들이 생성되는 곳
			} 
            else if (itemTypeList[i] == MItem.INT)
            { // 숫자일때
				repoBuf.append(form.substring(0, edTDIndex));
				if (tableType == MTable.DYNATOTLINE)
                { // 보고자료 보기의 동적표 마지막 집계라인, 한의 열씩 수식을 적용 시켜줌
					repoBuf.append(CalculationForm.getCalculationForm(itemExprList[i], rowCount, "add"));
					repoBuf.append(" align=right>");
					repoBuf.append("<font color='" + Html.dynaTotLineFontColor + "'>");
					repoBuf.append(changeNumber(dataList[dataIndex])); // 출력되는 값들이 생성되는 곳
					repoBuf.append("</font>");
				} 
                else if (tableType == MTable.DYNA)
                { // 행추가 되었으므로 엑셀 수식 변경해줌
					repoBuf.append(CalculationForm.getCalculationForm(itemExprList[i], rowCount, "add"));
					repoBuf.append(" align=right>");
					repoBuf.append(changeNumber(dataList[dataIndex])); // 출력되는 값들이 생성되는 곳

				} 
                else
                { // 정적인표
					repoBuf.append(" align=right>");
					repoBuf.append(changeNumber(dataList[dataIndex])); // 출력되는 값들이 생성되는 곳
				}
				dataIndex++;
			} 
            else
            { // 문자일때, //날짜일때
				repoBuf.append(form.substring(0, edTDIndex));
				if (itemExprList != null && itemExprList[i] != null && itemExprList[i].matches(".+?\\^.+?")) repoBuf.append(" valign=top");
				repoBuf.append(" align=left>");
				repoBuf.append((dataList[dataIndex] == null || dataList[dataIndex].trim().equals("")) ? "&nbsp;" : dataList[dataIndex]); // 출력되는 값들이 생성되는 곳
				dataIndex++;
			}
			form = form.substring(edTDIndex + 1, form.length());
		}
		repoBuf.append(form);
		
                // 2014.08.21 Youngjun Cho
                // 기존 소스
                // 셀 안에 불필요한 태그로 인해 세로로 셀 병합 현상이 발생한다.
                //return (repoBuf.toString()).replaceAll("&nbsp;", "");
                
                //<?xml:namespace 태그를 제거시켜주는 로직 추가
                String repoHTML = TagFilter.removeXmlNamepace(repoBuf.toString());
                
                // 기존대로 &nbsp; 제거
                repoHTML = repoHTML.replaceAll("&nbsp;", "");
                
                //return (repoBuf.toString()).replace("<p style=\"mso-pagination: none; mso-padding-alt: 0.0pt 0.0pt 0.0pt 0.0pt\" class=0>&nbsp; <?xml:namespace prefix = o ns = \"urn:schemas-microsoft-com:office:office\" /><o:p></o:p></p>", "<font> </font>").replaceAll("&nbsp;", "");\
                //return (repoBuf.toString()).replace("<?xml:namespace prefix = o ns = \"urn:schemas-microsoft-com:office:office\" /><o:p></o:p>", "<font> </font>").replaceAll("&nbsp;", "");
                return repoHTML;
	}

	private static String changeNumber(String data) {
		try {
if(data==null || data.equals("")) return "0";
			/* 숫자를 표현하는 문자열에서 콤마 제거 */
			String tmpStr = "";
			String[] strList = data.split(",");

			for (int i = 0; i < strList.length; i++) {
				tmpStr += strList[i];
			}
			data = tmpStr;

			data = NumberFormat.getNumberInstance().format(Double.parseDouble(data.trim()));
		} catch (NumberFormatException ex) {
			System.err.println("numberformat exception data: " + data);
			data = "0";
		} catch (NullPointerException ex) {
			data = " ";
		}
		return data;
	}
}
