using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Ease.Core;
using System.Globalization;

namespace HRM.BO
{
    #region AttnRawData

    [Serializable]
    public class AttnRawData : AuditTrailBase
    {
        #region Constructor

        public AttnRawData()
        {
            CardID = 0;
            EmployeeID = 0;
            CardNo = string.Empty;
            PunchTime = DateTime.MinValue;
            EntryMode = EnumEntryMode.Unknown;
            EmployeeNo = string.Empty;
        }

        #endregion

        #region Properties

        public int CardID { get; set; }

        public int EmployeeID { get; set; }

        public string CardNo { get; set; }

        public string EmployeeNo { get; set; }

        public DateTime PunchTime { get; set; }
        //public DateTime PunchTimeDateString { get; set; }
        public string PunchTimeDateString { get; set; }

        public EnumEntryMode EntryMode { get; set; }

        public string DeviceIPAddress { get; set; }

        public string DeviceNo { get; set; }

        public string EmployeeName { get; set; }
        public bool IsMobileOfflineData { get; set; }
        #region AccessCard : AccessCard

        private AccessCard _accessCard;

        public AccessCard AccessCard
        {
            get
            {
                //if (CardID > 0 && _accessCard == null)
                //{
                //    _accessCard = new AccessCard();
                //    _accessCard = AccessCard.Get(ID.FromInteger(CardID));
                //}
                return this._accessCard;
            }
            set { _accessCard = value; }
        }

        #endregion

        //#region Service Factory IAttnRawDataService : IAttnRawDataService

        //internal static IAttnRawDataService Service
        //{
        //    get { return Services.Factory.CreateService<IAttnRawDataService>(typeof(IAttnRawDataService)); }
        //}

        //#endregion

        #endregion

        //#region Functions

        //public static ObjectsTemplate<AttnRawData> Get(DateTime fromDate, DateTime toDate, int payrollTypeID)
        //{
        //    ObjectsTemplate<AttnRawData> attnRawDatas = new ObjectsTemplate<AttnRawData>();
        //    try
        //    {
        //        attnRawDatas = Service.Get(fromDate, toDate, payrollTypeID);
        //    }
        //    catch (ServiceException e)
        //    {
        //        throw new Exception(e.Message, e);
        //    }

        //    return attnRawDatas;
        //}
        //public static ObjectsTemplate<AttnRawData> Get(DateTime fromDate, DateTime toDate)
        //{
        //    return Service.Get(fromDate, toDate);
        //}

        //public static ObjectsTemplate<AttnRawData> Get(DateTime fromDate, DateTime toDate, string empIDs)
        //{
        //    return Service.Get(fromDate, toDate, empIDs);
        //}

        //public static DataTable GetInOutData(DateTime startDate, DateTime endDate, int employeeID)
        //{
        //    try
        //    {
        //        return Service.GetInOutData(startDate, endDate, employeeID);
        //    }
        //    catch (ServiceException e)
        //    {
        //        throw new Exception(e.Message, e);
        //    }
        //}
        //public static EnumAttendanceDB GetAttendanceDBType()
        //{
        //    return Service.GetAttendanceDBType();
        //}

        //public static ObjectsTemplate<AttnRawData> GetDataFromClientDB(DateTime punchTime)
        //{
        //    return Service.GetDataFromClientDB(punchTime);
        //}

        //public static void SaveAuto(ObjectsTemplate<AttnRawData> attnRawdatas)
        //{
        //    AttnRawData.Service.SaveAuto(attnRawdatas);
        //}

        //public List<SalaryProcessStatus> Process(DataTable rowdata)
        //{
        //    List<SalaryProcessStatus> ErrorList = new List<SalaryProcessStatus>();


        //    AttnProcessRunSummary oRunSummary = new AttnProcessRunSummary();

        //    bool isInOutApplicable = ConfigurationManager.GetBoolValue("attendence", "inoutapplicable", EnumConfigurationType.Logic);
        //    ObjectsTemplate<AttnRawData> attnRawDatas = new ObjectsTemplate<AttnRawData>();
        //    ObjectsTemplate<AccessCard> oAccessCard = AccessCard.Get(EnumCardStatus.Attached, EnumCardStatus.Temporary, EnumCardStatus.Found);
        //    ObjectsTemplate<Employee> oEmployees = Employee.GetAllEmps();
        //    bool isEmpnoAndCardnoSame = ConfigurationManager.GetBoolValue("attendence", "isempnoandcardnosame", EnumConfigurationType.Logic);
        //    AccessCard accessCard = null;
        //    Employee employee = null;
        //    foreach (DataRow item in rowdata.Rows)
        //    {
        //        if (isEmpnoAndCardnoSame == false)
        //        {
        //            string cardNo = Convert.ToString(item["CardNo"]);

        //            AccessCard ocard = oAccessCard.Find(delegate (AccessCard citem) { return citem.CardNumber == cardNo; });
        //            if (ocard == null)
        //            {
        //                ErrorList.Add(new SalaryProcessStatus(cardNo, "", " Card information not found for the Card No:" + cardNo));
        //                continue;

        //            }
        //            employee = oEmployees.Find(delegate (Employee emp) { return emp.CardID.Integer == ocard.ID.Integer; });

        //            if (employee == null)
        //            {
        //                ErrorList.Add(new SalaryProcessStatus(cardNo, "", "This card is not yet assigned to any employee:" + cardNo));
        //                continue;
        //            }

        //        }
        //        else
        //        {
        //            string sEmployeeNo = item["CardNo"].ToString();
        //            employee = oEmployees.Where(o => o.EmployeeNo.ToUpper() == sEmployeeNo.ToUpper().Trim())
        //                                          .FirstOrDefault();
        //            if (employee == null)
        //            {
        //                ErrorList.Add(new SalaryProcessStatus(sEmployeeNo, "", " Raw Data Contains Employee's Information which is not found in system:" + sEmployeeNo));
        //                continue;
        //            }
        //        }

        //        AttnRawData oAttnRaw = new AttnRawData();

        //        oAttnRaw.EmployeeID = employee.ID.Integer;
        //        oAttnRaw.PunchTime = Convert.ToDateTime(item["Time"].ToString());
        //        if (isEmpnoAndCardnoSame)
        //        {
        //            oAttnRaw.CardNo = employee.EmployeeNo;
        //        }
        //        else
        //        {
        //            oAttnRaw.CardID = accessCard.ID.Integer;
        //            oAttnRaw.CardNo = accessCard.CardNumber;
        //        }
        //        oAttnRaw.DeviceIPAddress = item["DeviceIPAddress"].ToString();
        //        oAttnRaw.DeviceNo = item["DeviceNo"].ToString();
        //        //if (isInOutApplicable)
        //        //{
        //        //    oAttnRaw.EntryMode = (EnumEntryMode)Convert.ToInt32(item["InOut"].ToString());
        //        //}
        //        //else
        //        //{
        //        //    oAttnRaw.EntryMode = EnumEntryMode.Unknown;
        //        //}
        //        attnRawDatas.Add(oAttnRaw);
        //    }

        //    if (ErrorList.Count == 0)
        //    {
        //        if (attnRawDatas.Count > 0)
        //        {
        //            AttnRawData.Service.Save(attnRawDatas);
        //        }
        //        else ErrorList.Add(new SalaryProcessStatus("", "", "There is nothing to process or Save. please check your Attandance raw data"));
        //    }

        //    //AttnRawData.Service.Save(attnRawDatas);


        //    return ErrorList;
        //}

        //#endregion
    }

    #endregion

    #region IAttnRawData Service

    public interface IAttnRawDataService
    {

        List<AttnRawData> Get(DateTime fromDate, DateTime toDate, string empIDs, int payrollTypeID);
        void SaveAuto(List<AttnRawData> attnRawData);
    }

    #endregion
}