// This code is generated by blanco Framework.
// <summary>ファイル定義書(固定長)から作成されたライタクラス</summary>
using System.IO;

using blanco.sample.fixedlength.record;
using blanco.sample.fixedlength.util;

namespace blanco.sample.fixedlength.io
{
    /// <summary>ファイル定義[SAMPLE_FIXED_LENGTH/固定長ファイルのサンプル。このクラスは単にサンプルです。実際の動作には利用されません。]のライタクラス</summary>
    /// <remarks>
    /// <newpara>このクラスはファイル定義書(固定長)から自動生成されたライタクラスです。</newpara>
    /// <newpara>　1.文字列長チェックには、デフォルトエンコーディングを利用します。</newpara>
    /// <newpara>　2.クラスの利用した後は必ず close()を呼び出してください。</newpara>
    /// </remarks>
    public class SampleFixedLengthFixedLengthWriter
    {
        /// <summary>ライタオブジェクト</summary>
        /// <remarks>
        /// <newpara>内部的に実際に出力を行うのライタを記憶します。</newpara>
        /// </remarks>
        private TextWriter fWriter;

        /// <summary>処理中の行カウンタ</summary>
        /// <remarks>
        /// <newpara>現在処理を行っている行の位置を記憶します。</newpara>
        /// </remarks>
        private long fLineCounter = 0;

        /// <summary>項目[field_5]の書き込みの際に利用するフォーマッター</summary>
        /// <remarks>
        /// <newpara>※インスタンス化しておくことによりメモリゴミ発生を抑制します。</newpara>
        /// </remarks>
        private string fSimpleDateFormatField5;

        /// <summary>固定長ファイルライタクラスのコンストラクタ</summary>
        /// <remarks>
        /// <newpara>与えられたライタと連結します。</newpara>
        /// </remarks>
        /// <param name="arg">連結するライタ</param>
        public SampleFixedLengthFixedLengthWriter(TextWriter arg)
        {
            fWriter = arg;
            fSimpleDateFormatField5 = "yyyy/MM/dd HH:mm:ss";
        }

        /// <summary>与えられた一行を書き出します&lt;br&gt;</summary>
        /// <remarks>
        /// <newpara>データはデリミタで区切られながらライタに出力され、最後に改行コードが付与されます。</newpara>
        /// </remarks>
        /// <param name="record">レコードオブジェクト</param>
        public void WriteRecord(SampleFixedLengthFixedLengthRecord record)
        {
            string writeToken = null;

            // 項目番号[1] 項目名[field_1/フィールド1]
            // 任意項目で文字列の項目に nullまたは長さ0の文字列が与えられた場合には、いずれも値が入っていないものとみなします。
            // この場合には長さチェックは行いません。
            writeToken = record.GetField1() == null ? "" : record.GetField1();
            // 指定の長さまでパディングします。
            writeToken = BlancoFixedLengthRuntimeUtil.PadRight(writeToken, 10, ' ');
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length < 10) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[field_1/フィールド1]の処理中において長さ(10)よりも短い値[" + writeToken + "]を検知しました。");
            }
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length > 10) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 1項目目。項目番号[1] 項目名[field_1/フィールド1]の処理中において長さ(10)よりも長い値[" + writeToken + "]を検知しました。");
            }
            fWriter.Write(writeToken);

            // 項目番号[2] 項目名[field_2/フィールド2]
            writeToken = record.GetField2().ToString();
            // 指定の長さまでパディングします。
            writeToken = BlancoFixedLengthRuntimeUtil.PadLeft(writeToken, 9, ' ');
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length < 9) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 2項目目。項目番号[2] 項目名[field_2/フィールド2]の処理中において長さ(9)よりも短い値[" + writeToken + "]を検知しました。");
            }
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length > 9) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 2項目目。項目番号[2] 項目名[field_2/フィールド2]の処理中において長さ(9)よりも長い値[" + writeToken + "]を検知しました。");
            }
            fWriter.Write(writeToken);

            // 項目番号[3] 項目名[field_3/フィールド3]
            writeToken = record.GetField3().ToString();
            // 指定の長さまでパディングします。
            writeToken = BlancoFixedLengthRuntimeUtil.PadLeft(writeToken, 10, ' ');
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length < 10) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 3項目目。項目番号[3] 項目名[field_3/フィールド3]の処理中において長さ(10)よりも短い値[" + writeToken + "]を検知しました。");
            }
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length > 10) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 3項目目。項目番号[3] 項目名[field_3/フィールド3]の処理中において長さ(10)よりも長い値[" + writeToken + "]を検知しました。");
            }
            fWriter.Write(writeToken);

            // 項目番号[4] 項目名[field_4/フィールド4]
            writeToken = record.GetField4() == null ? "" : record.GetField4().ToString();
            // 指定の長さまでパディングします。
            writeToken = BlancoFixedLengthRuntimeUtil.PadLeft(writeToken, 7, ' ');
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length < 7) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 4項目目。項目番号[4] 項目名[field_4/フィールド4]の処理中において長さ(7)よりも短い値[" + writeToken + "]を検知しました。");
            }
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length > 7) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 4項目目。項目番号[4] 項目名[field_4/フィールド4]の処理中において長さ(7)よりも長い値[" + writeToken + "]を検知しました。");
            }
            fWriter.Write(writeToken);

            // 項目番号[5] 項目名[field_5/フィールド5]
            if (record.GetField5() == null) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 5項目目。項目番号[5] 項目名[field_5/フィールド5]の処理中において項目にnullが与えられていることを検知しました。");
            }
            writeToken = record.GetField5().ToString(fSimpleDateFormatField5);
            // 指定の長さまでパディングします。
            writeToken = BlancoFixedLengthRuntimeUtil.PadRight(writeToken, 19, ' ');
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length < 19) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 5項目目。項目番号[5] 項目名[field_5/フィールド5]の処理中において長さ(19)よりも短い値[" + writeToken + "]を検知しました。");
            }
            if (BlancoFixedLengthRuntimeUtil.GetBytes(writeToken).Length > 19) {
                throw new BlancoFixedLengthIOException("出力" + (fLineCounter + 1) + "行目 5項目目。項目番号[5] 項目名[field_5/フィールド5]の処理中において長さ(19)よりも長い値[" + writeToken + "]を検知しました。");
            }
            fWriter.Write(writeToken);

            // 最後に改行コードが付与されます。
            fWriter.WriteLine();
            fLineCounter++;
        }

        /// <summary>現在処理中の行カウンタを返します。</summary>
        /// <returns>現在処理中の行カウンタ。</returns>
        public long GetLineCounter()
        {
            return fLineCounter;
        }

        /// <summary>このライタをフラッシュします。&lt;br&gt;</summary>
        /// <remarks>
        /// <newpara>関連づけられていたライタに対してもflush()を呼び出します。</newpara>
        /// </remarks>
        public void Flush()
        {
            fWriter.Flush();
        }

        /// <summary>このライタを閉じます。&lt;br&gt;</summary>
        /// <remarks>
        /// <newpara>関連づけられていたライタに対してもclose()を呼び出します。</newpara>
        /// </remarks>
        public void Close()
        {
            fWriter.Close();
        }
    }
}
