using BeWo.Data.Access;
using BeWo.Data.Entities;

using BS.Shared.DataContracts;

namespace BeWo.Service.DCEntityMapper
{
    public class WohnheimbuchungDC_Wohnheimbuchung : AbstractIDCEntityMapper<Wohnheimbuchung, WohnheimbuchungDC>
    {
        public override WohnheimbuchungDC MergeWithDC(Wohnheimbuchung pEntity, WohnheimbuchungDC pDataContract)
        {
            pDataContract.WohnheimbuchungOid     = pEntity.Oid;
            pDataContract.WohnheimbuchungVersion = pEntity.Version;
            pDataContract.Buchungsdatum          = pEntity.Buchungsdatum;

            if (pEntity.Wohnheim != null)
            {
                pDataContract.Wohnheim = MapperFactory.CompactWohnheimDC_Wohnheim.MapToNewDC(pEntity.Wohnheim);
            }

            pDataContract.Costbearer2SupportConceptList = MapperFactory.Wohnheimbuchung2Costbearer2SupportConceptRelDC_Wohnheimbuchung2Costbearer2SupportConcept.MapToNewDCs(pEntity.Costbearer2SupportConcept2WohnheimbuchungList);
            pDataContract.EmployeeList                  = MapperFactory.EmployeeWohnheimbuchungRelationDC_Employee2Wohnheimbuchung.MapToNewDCs(pEntity.Employee2WohnheimbuchungList);

            var serviceDescription = DAOFactory.SearchDAO.FindServiceDescriptionForWohnheimbuchungsServiceRecord(pEntity.Oid.Value);
            if (serviceDescription != null)
            {
                pDataContract.ServiceDescription = MapperFactory.ServiceDescriptionDC_ServiceDescription.MapToNewDC(serviceDescription);
                pDataContract.Category           = pDataContract.ServiceDescription.Category;
            }

            return pDataContract;
        }

        public override Wohnheimbuchung MergeWithEntity(WohnheimbuchungDC pDataContract, Wohnheimbuchung pEntity)
        {
            ConcurrencyCheck(pDataContract.WohnheimbuchungVersion, pEntity);

            pEntity.Oid           = pDataContract.WohnheimbuchungOid;
            pEntity.Version       = pDataContract.WohnheimbuchungVersion;
            pEntity.Buchungsdatum = pDataContract.Buchungsdatum;

            if ((pEntity.Wohnheim == null || pEntity.Wohnheim.Oid != pDataContract.Wohnheim.WohnheimOid) && pDataContract.Wohnheim.WohnheimOid != null)
            {
                pEntity.Wohnheim = DAOFactory.GenericDAO.LoadByID<Wohnheim>(pDataContract.Wohnheim.WohnheimOid);
            }

            MapperFactory.Wohnheimbuchung2Costbearer2SupportConceptRelDC_Wohnheimbuchung2Costbearer2SupportConcept.MergeWithEntitys(pDataContract.Costbearer2SupportConceptList, pEntity.Costbearer2SupportConcept2WohnheimbuchungList);
            MapperFactory.EmployeeWohnheimbuchungRelationDC_Employee2Wohnheimbuchung.MergeWithEntitys(pDataContract.EmployeeList, pEntity.Employee2WohnheimbuchungList);

            return pEntity;
        }

        protected override bool AreDCAndEntityEqual(WohnheimbuchungDC pDC, Wohnheimbuchung pEntity)
        {
            if (pDC.WohnheimbuchungOid == null)
            {
                return false;
            }

            return pDC.WohnheimbuchungOid == pEntity.Oid;
        }
    }
}