using SinoChemCommonUtilities;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SinochemInternetPlusApp
{
    public static class DbModelConstructors
    {       
        public static Xiaofei2Model ConstructXiaofei2Model(SqlDataReader reader)
        {
            //var identifiableEntity = new IdentifiableEntity(0, "EpsMain", "", null);
            //DebugLogger debugLogger = new DebugLogger(identifiableEntity);

            if (reader.Read())
            {
                Xiaofei2Model xiaofei2Model = new Xiaofei2Model();    

                xiaofei2Model.jihao = DbFieldReader.SafelyReadDbField<int>(reader["jihao"]);
                xiaofei2Model.youpin = DbFieldReader.SafelyReadDbField <string>(reader["youpin"]);
                xiaofei2Model.qty = DbFieldReader.SafelyReadDbField<double>(reader["qty"]);
                xiaofei2Model.danjia = DbFieldReader.SafelyReadDbField<double>(reader["danjia"]);
                xiaofei2Model.amount = DbFieldReader.SafelyReadDbField<double>(reader["amount"]);
                xiaofei2Model.xf_date = DbFieldReader.SafelyReadDbField<DateTime>(reader["xf_date"]);
                xiaofei2Model.xf_time = DbFieldReader.SafelyReadDbField <string>(reader["xf_time"]);
                xiaofei2Model.liushuino = DbFieldReader.SafelyReadDbField <string>(reader["liushuino"]);
                xiaofei2Model.fzqty = DbFieldReader.SafelyReadDbField <string>(reader["fzqty"]);
                xiaofei2Model.fzamount = DbFieldReader.SafelyReadDbField<double>(reader["fzamount"]);

                return xiaofei2Model;
            }
            else
            {
                return null;
            }
        }

        public static JyInfoModel ConstructJyInfoModel(SqlDataReader reader)
        {
            if (reader.Read())
            {
                JyInfoModel jyInfoModel = new JyInfoModel();

                jyInfoModel.jihao = DbFieldReader.SafelyReadDbField<int>(reader["jihao"]);
                jyInfoModel.status = DbFieldReader.SafelyReadDbField<string>(reader["status"]);
                jyInfoModel.youpin = DbFieldReader.SafelyReadDbField<string>(reader["youpin"]);
                jyInfoModel.qty = DbFieldReader.SafelyReadDbField<double>(reader["qty"]);
                jyInfoModel.amount = DbFieldReader.SafelyReadDbField<double>(reader["amount"]);
                jyInfoModel.fzqty = DbFieldReader.SafelyReadDbField <string>(reader["fzqty"]);
                jyInfoModel.fzamount = DbFieldReader.SafelyReadDbField<double>(reader["fzamount"]);

                return jyInfoModel;
            }
            else
            {
                return null;
            }
        }

        public static List<EpsTransactionModel> ConstructEpsTrxModelList(SqlDataReader reader)
        {
            List<EpsTransactionModel> epsTrxModelList = new List<EpsTransactionModel>();

            while (reader.Read())
            {
                EpsTransactionModel epxTrxModel = FillEpsTrxModelWithReaderReady(reader);
                epsTrxModelList.Add(epxTrxModel);
            }

            return epsTrxModelList;
        }

        public static List<EpsTransaction> ConstructEpsTrxList(SqlDataReader reader)
        {
            List<EpsTransaction> epsTrxList = new List<EpsTransaction>();

            while (reader.Read())
            {
                EpsTransactionModel epxTrxModel = FillEpsTrxModelWithReaderReady(reader);
                epsTrxList.Add(EpsTransaction.RestroeEpsTrxFrom(epxTrxModel));
            }

            return epsTrxList;
        }

        // assume the reader on the valid table row
        private static EpsTransactionModel FillEpsTrxModelWithReaderReady(SqlDataReader reader)
        {
            #region for debugging purpose
            /*
            int vid = (int)reader["id"];
            int vjihao = (int)reader["jihao"];
            string vyoupin = (string)reader["youpin"];
            double vqty = (double)reader["qty"];
            double vdanjia = (double)reader["danjia"];
            double vamount = (double)reader["amount"];
            DateTime vxf_date = (DateTime)reader["xf_date"];
            string vxf_time = (string)reader["xf_time"];
            string vliushuino = (string)reader["liushuino"];
            string vfzqty = (string)reader["fzqty"];
            double vfzamount = (double)reader["fzamount"];
            EpsTrxStatus vtrx_status = (EpsTrxStatus)reader["trx_status"];
            TransactionMode vmop = (TransactionMode)reader["mop"];
            string vcar_number = (string)reader["car_number"];
            string vcard_no = (string)reader["card_no"];
            string vttc = (string)reader["ttc"];
            string vtoken = (string)reader["token"];
            string vtid = (string)reader["tid"];
            string vmac = (string)reader["mac"];
            double vbalance_before_trx = (double)reader["balance_before_trx"];
            double vreal_pay_amount = (double)reader["real_pay_amount"];
            string vauth_time = (string)reader["auth_time"];
            string vbill_id = (string)reader["bill_id"];
            DateTime v_created_time = (DateTime)reader["created_time"];
            string v_shift_id = (string)reader["shift_id"];
            string v_business_date = (string)reader["business_date"];
            NotifyPosFlag v_notify_pos = (NotifyPosFlag)reader["notify_pos"];
            string vcardNo_masked = (string)reader["cardNo_masked"];
            */
            #endregion

            EpsTransactionModel epxTrxModel = new EpsTransactionModel
            {
                id = DbFieldReader.SafelyReadDbField<int>(reader["id"]),
                jihao = DbFieldReader.SafelyReadDbField<int>(reader["jihao"]),
                youpin = DbFieldReader.SafelyReadDbField<string>(reader["youpin"]),
                qty = DbFieldReader.SafelyReadDbField<double>(reader["qty"]),
                danjia = DbFieldReader.SafelyReadDbField<double>(reader["danjia"]),
                amount = DbFieldReader.SafelyReadDbField<double>(reader["amount"]),
                xf_date = DbFieldReader.SafelyReadDbField<DateTime>(reader["xf_date"]),
                xf_time = DbFieldReader.SafelyReadDbField<string>(reader["xf_time"]),
                liushuino = DbFieldReader.SafelyReadDbField<string>(reader["liushuino"]),
                fzqty = DbFieldReader.SafelyReadDbField<string>(reader["fzqty"]),
                fzamount = DbFieldReader.SafelyReadDbField<double>(reader["fzamount"]),
                trx_status = (EpsTrxStatus)DbFieldReader.SafelyReadDbField<int>(reader["trx_status"]),
                mop = (TransactionMode)DbFieldReader.SafelyReadDbField<int>(reader["mop"]),
                car_number = DbFieldReader.SafelyReadDbField<string>(reader["car_number"]),
                card_no = DbFieldReader.SafelyReadDbField<string>(reader["card_no"]),
                ttc = DbFieldReader.SafelyReadDbField<string>(reader["ttc"]),
                token = DbFieldReader.SafelyReadDbField<string>(reader["token"]),
                tid = DbFieldReader.SafelyReadDbField<string>(reader["tid"]),
                mac = DbFieldReader.SafelyReadDbField<string>(reader["mac"]),
                balance_before_trx = DbFieldReader.SafelyReadDbField<double>(reader["balance_before_trx"]),
                real_pay_amount = DbFieldReader.SafelyReadDbField<double>(reader["real_pay_amount"]),
                auth_time = DbFieldReader.SafelyReadDbField<string>(reader["auth_time"]),
                bill_id = DbFieldReader.SafelyReadDbField<string>(reader["bill_id"]),
                created_time = DbFieldReader.SafelyReadDbField<DateTime>(reader["created_time"]),
                shift_id = DbFieldReader.SafelyReadDbField<string>(reader["shift_id"]),
                business_date = DbFieldReader.SafelyReadDbField<string>(reader["business_date"]),
                notify_pos = (NotifyPosFlag)DbFieldReader.SafelyReadDbField<int>(reader["notify_pos"]),
                cardNo_masked = DbFieldReader.SafelyReadDbField<string>(reader["cardNo_masked"]),
            };

            return epxTrxModel;
        }
    }
}