using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Microsoft.VisualBasic.FileIO;


namespace CSV変換ツール
{
    abstract class C03CSV取込処理基底
    {
        ////////////////////////////////////////////////////////////////////////
        // メンバ変数
        ////////////////////////////////////////////////////////////////////////
        #region メンバ変数
        //読み込んだCSVデータの配列
        private List<List<string>> mデータ;
        protected string mLastErrorMessage;
        protected string mErrorDetail;
        //protected DateTime m現在日時;
        //protected int mログインユーザ;
        #endregion

        ////////////////////////////////////////////////////////////////////////
        // プロパティ
        ////////////////////////////////////////////////////////////////////////
        #region プロパティ

        public string LastErrorMessage
        {
            get { return mLastErrorMessage; }
        }

        public string ErrorDetail
        {
            get { return mErrorDetail; }
        }
        #endregion

        ////////////////////////////////////////////////////////////////////////
        // 共通メソッド 
        ////////////////////////////////////////////////////////////////////////
        #region 共通メソッド
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public C03CSV取込処理基底()
        {
            mデータ = null;
            mLastErrorMessage = string.Empty;
            mErrorDetail = string.Empty;
        }

        /// <summary>
        /// CSV取込メイン処理として、以下の処理を実施し引数のDataTableに変換された値を返す。<br/>
        /// これら処理は継承先で定義する。
        /// 　①基底CSV取込クラスからの検証
        /// 　②基底CSV取込クラスからのデータ変換
        /// </summary>
        /// <param name="CSVファイル名">入力元のCSVファイルを指定する。</param>
        /// <param name="dt">０行にクリアされているDataTableを渡す。</param>
        /// <returns>検証に失敗した場合はfalseを返す。そうでない場合はtrueを返す。</returns>
        public bool CSV変換(string CSVファイル名, ref D10顧客.D10顧客販売履歴DataTable dt)
        {
            mデータ = new List<List<string>>();

            int readcnt = 0;
            TextFieldParser tfp = new TextFieldParser(CSVファイル名, System.Text.Encoding.GetEncoding("Shift_JIS"));
            using (tfp)
            {
                tfp.TextFieldType = FieldType.Delimited;
                tfp.SetDelimiters(",");

                while (!tfp.EndOfData)
                {
                    readcnt++;

                    string[] row = tfp.ReadFields();

                    List<string> col = new List<string>();

                    foreach (string field in row)
                        col.Add(field);

                    mデータ.Add(col);
                }
            }

            for (int i = 1; i < mデータ.Count; i++)
            {
                int colcnt = mデータ[i].Count;
                if (colcnt != 基底CSV取込クラスからの列数取得())
                {
                    mLastErrorMessage = Properties.Resources.MSG_INF_051;
                    mErrorDetail = string.Format(Properties.Resources.MSG_INF_055, 基底CSV取込クラスからの列数取得());
                    return false;
                }

                for (int j = 0; j < colcnt; j++)
                {
                    if (!基底CSV取込クラスからの検証(i, j, mデータ[i][j].Trim()))
                    {
                        mLastErrorMessage = string.Format(Properties.Resources.MSG_INF_049, i + 1, j + 1);
                        return false;
                    }
                }
            }

            for (int i = 1; i < mデータ.Count; i++)
            {
                if (基底CSV取込クラスからのデータ変換(i, mデータ[i], ref dt, ref mLastErrorMessage) == false)
                    return false;
            }

            //if (!基底CSV取込クラスからの全体検証(dt))
            //    return false;

            return true;
        }

        
        /// <summary>
        /// 各項目で共通の検証（必須、桁数、書式）を行う
        /// </summary>
        /// <param name="value">検証値を指定する</param>
        /// <param name="Is必須入力チェックを行う">必須入力の場合はtrue。そうでない場合はfalseを指定する。</param>
        /// <param name="maxlength">最大桁数を指定する</param>
        /// <param name="正規表現idx">正規表現を指定する</param>
        /// <returns>検証が成功した場合はtrue。そうでない場合はfalseを指定する。</returns>
        protected bool IsValidate共通(string value, bool Is必須入力チェックを行う, int maxlength, enm正規表現 正規表現idx, string header, long lng最大値)
        {
            if (Is必須入力チェックを行う)
            {
                if (value == string.Empty)
                {
                    mErrorDetail = string.Format(Properties.Resources.MSG_INF_075, header);
                    return false;
                }
            }

            if (value.Length > maxlength)
            {
                mErrorDetail = string.Format(Properties.Resources.MSG_INF_033, header, maxlength);
                return false;
            }


            if (value == "") return true;   // データが無ければ、後のチェックを行わない。

            if (!Program.業務共通処理.IsMatch(value, 正規表現idx))
            {
                if (((正規表現idx == enm正規表現.半角数字) || (正規表現idx == enm正規表現.メールアドレス)) &&
                    (value == string.Empty))
                {
                    //半角数字、メールアドレス、IPアドレスの場合で空文字の場合はエラーとしない
                    return true;
                }

                if (正規表現idx == enm正規表現.半角数字)
                {
                    //if (header == "単価")
                    //    mErrorDetail = string.Format(Properties.Resources.MSG_INF_100, header, (long)enm最大値.商品単価);
                    //else if (header == "個数")
                    //    mErrorDetail = string.Format(Properties.Resources.MSG_INF_100, header, (long)enm最大値.販売個数);
                    //else if (header == "年齢")
                    //    mErrorDetail = string.Format(Properties.Resources.MSG_INF_100, header, (long)enm最大値.年齢);

                    mErrorDetail = string.Format(Properties.Resources.MSG_INF_100, header, lng最大値);
                }
                else
                {
                    mErrorDetail = string.Format(Properties.Resources.MSG_INF_052, header, 正規表現idx.ToString());
                }

                return false;
            }

            return true;
        }



        protected virtual int 基底CSV取込クラスからの列数取得() { return 0; }
        protected virtual bool 基底CSV取込クラスからの検証(int rowIndex, int colIndex, string value) { return true; }
        protected virtual bool 基底CSV取込クラスからの検証_各種マスタ(int rowIndex, int colIndex, string value, string str区分) { return true; }
        //protected virtual bool 基底CSV取込クラスからの全体検証(DataTable dt) { return true; }
        protected virtual bool 基底CSV取込クラスからのデータ変換(int rowIndex, List<string> values, ref D10顧客.D10顧客販売履歴DataTable dt, ref string strErrDetail) { return true ; }
        #endregion
    }
}
