package mcframe.serverMAUD.MAUDL5010;


import java.io.File;
import mcframe.commonCore.lang.MCBinary;
import mcframe.commonCore.lang.MCStringUtil;
import mcframe.commonCore.report.MCCSVFile;
import mcframe.commonCore.report.MCReportFile;
import mcframe.commonCore.report.MCSVFFile;
import mcframe.commonCore.report.container.MCReportInfoR;
import mcframe.commonCore.report.container.MCReportMeta;
import mcframe.commonCore.report.container.MCReportSet;
import mcframe.serverCore.report.MCReportConf;
import mcframe.serverCore.report.MCServerReportCartridge;
import mcframe.serverCore.resource.MCConst;
import mcframe.serverCore.sys.MCSys;
import mcframe.commonCore.annotation.EI;
import mcframe.commonCore.container.MCRow;
import static mcframe.serverMAUC.MAUCL0010.MAUCL_MCDataUtil.*;


/* 改　版　履　歴
 * 
 * DATE             Seq         Editor          Description
 * =============    ========    ============    ============================
 * 2025-04-11       r1.00       NS.You          PJ_TKN-533 新規作成
 * 2025-04-25       r1.01       NS.You          PJ_TKN-413 ヘッダ出力
 * 2025-05-26       r1.02       NS.You          PJ_TKN-534 再印刷でもサーバ側のカートリッジを使用する
 * 
 */
@EI
public class MAUDL_ZDwnldCartridge extends MCServerReportCartridge {
	
	protected static final String DAT_EXTENSION = "datExtension";// 拡張子
	protected static final String USE_HEADING = "useHeading";// 1行目を見出し行として使用するか
	protected static final String LINE_SEPARATOR = "lineSeparator";// 改行コード
	protected static final String DOUBLE_QUOTATION = "doubleQuotation";// 文字列をダブルクォートで囲む
	protected static final String WRITE_BOM = "writeBOM";// ボムを出力するかどうか
	protected static final String CHARSET = "charset";// キャラクタセット

	/**
	 * サーバ印刷（帳票種類=MCReportType.SERVER）時のエントリーメソッド
	 */
	@Override
	public String print(MCReportSet reportSet, java.lang.String... option){
		return super.print(reportSet,option);
	}
	
	/**
	 * クライアント-サーバ印刷（帳票種類=MCReportType.CLIENT_SERVER）時のエントリーメソッド ※abstract
	 */
	@Override
	public MCBinary requestCS(MCReportSet reportSet, String... option) {
		return writeDataFile(reportSet, option);
	}

	/**
	 * データファイル作成の処理 ※abstract
	 */
	@Override
	public MCBinary writeDataFile(MCReportSet reportSet, String... option) {
		MCReportInfoR infoRow = reportSet.getReportInfo();
		String stKey = MCConst.createKey(infoRow.cartridge(), infoRow.report_id());

		// 暗黙Path 
		String filePath = MCReportFile.setSeparator(MCReportConf.getDataPath(this));

		//ファイル名
		// プラグインリソースより拡張子を制御する。
		String datExtension = MCConst.plugin.getString(MCConst.createKey(stKey, DAT_EXTENSION), MCCSVFile.CSV_EXTENSION); // 拡張子  暗黙：csv
// r1.01 MOD START
//		String file_nm = infoRow.report_id() + MCCSVFile.NAME_SEPARATOR + MCDate.now() + MCCSVFile.NAME_SEPARATOR + datExtension;
		String file_nm = reportSet.getReportID() + 
				MCReportFile.NAME_SEPARATOR + 
				MCReportFile.createFileName(datExtension);
		
		// 出力設定
//		MCCSVFile csvFile =  new MCCSVFile();
		MCCSVFileH csvFile =  new MCCSVFileH();
// r1.01 MOD END

		// プラグインリソースよりヘッダありなしを制御予定
		// 改行コード  暗黙：CRLF_COD
		String ls = MCConst.plugin.getString(MCConst.createKey(stKey, LINE_SEPARATOR), null);
		if (isSame("1",ls)) {
			// 1:改行コード（CR）
			csvFile.setLineSeparator(MCStringUtil.CR_CODE);
		} else if (isSame("2",ls)) {
			// 2:改行コード（LF）
			csvFile.setLineSeparator(MCStringUtil.LF_CODE);
		} else if (isSame("3",ls)) {
			// 3:改行コード（CR/LF）
			csvFile.setLineSeparator(MCStringUtil.CRLF_CODE);
		} else {
			// 上記以外（暗黙：CR/LF）
			csvFile.setLineSeparator(MCStringUtil.CRLF_CODE);
		}
		
		csvFile.useHeading(MCConst.plugin.getBoolean(MCConst.createKey(stKey, USE_HEADING), false)); // 1行目を見出し行として使用するか  暗黙：false
		csvFile.setDoubleQuotation(MCConst.plugin.getBoolean(MCConst.createKey(stKey, DOUBLE_QUOTATION), false)); // 文字列をダブルクォートで囲む 暗黙：false
		csvFile.setWriteBOM(MCConst.plugin.getBoolean(MCConst.createKey(stKey, WRITE_BOM), false)); // ボムを出力するかどうか 暗黙：false
		csvFile.setCharset(MCConst.plugin.getString(MCConst.createKey(stKey, CHARSET), MCCSVFile.ENCODE_MS932));	 // キャラクタセット 暗黙：ENCODE_MS932
		
		csvFile.append(false);
		csvFile.setManualClose(false);
		csvFile.setLocale(MCSys.user.locale());	// 引数のMCReportSetのロケールを元に、 フォーマット情報を初期化
		
		// 出力ResportSet設定
		csvFile.setReportSet(reportSet);
		
		File outFile = new File(filePath, file_nm);

		// ファイル出力
		csvFile.setFilePath(outFile.getAbsolutePath());
		csvFile.write();
		csvFile.writeClose();		// ファイルを閉じる
		
		infoRow.data_file_name(file_nm);
		infoRow.save_file(true);
		infoRow.save_file_name(outFile.getAbsolutePath());
		
		//MCBinaryで返す
		return MCBinary.valueOf(outFile);
	}
	
	/**
	 * 印刷 (abstract)
	 */
	@Override
	public void print(String reportId, String dataFile, String formFile,
			String printer, String... option) {
		return;		// サーバ印刷時、処理不要
	}
	
// r1.01 ADD START
	public class MCCSVFileH extends MCCSVFile {

		final String DOUBLE_QUOTATION_NULL = "";// 空文字
		
		@Override
		public String writeHeadingLine() {
			
			csvLabelInit();
			
			StringBuilder lb = new StringBuilder();
			
			StringBuilder sb = MCSVFFile.createHeaderLine(getReportSet());
			String[] csvColumns = sb.toString().split(",");

			// 必須チェック
			if(csvColumns == null) {
				//項目なし
				return super.writeHeadingLine();
			}
			int i = 0;
			for (String col : csvColumns) {
				if (i != 0) {
					// 先頭項目以外
					lb.append(",");
				}
				lb.append(getLabel(col));
				
				i++;
			}
			
			return lb.toString();
		}

		/**
		 * 帳票項目のラベル名を読み込みます
		 * 
		 * @param colPath
		 */
		protected void csvLabelInit() {
			String[] arr = getReportSet().getClass().getName().split("\\.");	// [mcframe][commonMSBG][MSBGZR010][MSBGR_Bill_CSV]
			String pkg = arr[0] + "/" + arr[1] + "/" + arr[2];
			MCConst.loadInit(pkg);
		}

		/**
		 * 帳票項目のラベル名を取得します
		 * 
		 * @param colPath
		 * @return
		 */
		protected String getLabel(String colPath) {
			String[] arr = getReportSet().get(0).getClass().getName().split("\\.");	// [mcframe][commonMSBG][MSBGZR010][MSBGR_Bill_CSV][BillCSVR]
			String blk = arr[arr.length - 1];					// BillCSVR
			blk = blk.substring(0, blk.length() - 1);			// BillCSV

			return getRptLabel(getReportSet().getModuleID(), getReportSet().getReportID(), blk, colPath);
		}

		/**
		 * 帳票用のリソースからラベル名を取得します
		 * 	
		 * @param rptSet
		 * @param blk
		 * @param nm
		 * @return
		 */
		protected String getRptLabel(String mId, String rptId, String blk, String nm) {
			String key = MCConst.createKey(mId, rptId, blk, nm, "label");
			String value = MCConst.repotlbl.getLabel(key); 
			
			String lb = isNull(value) ? nm : value;

			if (isDoubleQuotation()) {
				lb = "\"" + lb + "\"";
			}
			
			return lb;
		}
		
		@Override
		protected String fireWriteGetValue(int rowIndex, int colIndex, MCRow r, 
				String value, MCReportMeta rmeta) {
			
			String str = super.fireWriteGetValue(rowIndex, colIndex, r, value, rmeta);
			
			if (isNull(str) && isDoubleQuotation()) {
				str = DOUBLE_QUOTATION_NULL;
			}
			
			return str;
		}
		
	}
// r1.01 ADD END
// r1.02 ADD START
	public void printDataRecreation(MCReportInfoR info) {
		super.printDataRecreation(info);
	}
// r1.02 ADD END
}

