/// <summary> /// Returns a view model for the specific cultivar type. /// It builds the view model depending on the cultivar type, and chooses the /// loader delegate depending on the multiplicity (single/multiple). /// </summary> /// <param name="cultivarTypeCode">Identifies the cultivar type.</param> /// <param name="parent">The specific cultivar to be fed to the view model.</param> /// <returns>Returns the Cultivar View Model</returns> public static OpenCultivarTabBaseViewModel CreateViewModel(string cultivarTypeCode, OpenCultivarViewModel parent) { int[] cultivarIds = parent.Ids.ToArray(); bool multipleValues = cultivarIds.Length > 1; Func <ICollection <DataModelBase> > loader = null; OpenCultivarTabBaseViewModel vm = null; switch (cultivarTypeCode) { case CultivarTypes.BlendType: loader = () => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { var result = services .GetBlend(cultivarIds) .Select(x => new CultivarVarietyBlendDataModel(x)); return(result.ToArray()); } }; if (multipleValues) { vm = new Multiple.BlendCultivarTypeViewModel(parent, loader); } else { vm = new Single.BlendCultivarTypeViewModel(parent, loader, (common, type) => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { if (type == null) { services.UpdateGeneralInfoAndHeader(common.Dto); } else { services.UpdateVarietyBlend(common.Dto, (type as CultivarVarietyBlendDataModel).Dto); } } return(true); }); } break; case CultivarTypes.CompetitorHybridType: loader = () => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { var result = services .GetCompetitorHybrid(cultivarIds) .Select(x => new CultivarCompetitorHybridDataModel(x)); return(result.ToArray()); } }; if (multipleValues) { vm = new Multiple.CompetitorHybridCultivarTypeViewModel(parent, loader); } else { vm = new Single.CompetitorHybridCultivarTypeViewModel(parent, loader, (common, type) => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { if (type == null) { services.UpdateGeneralInfoAndHeader(common.Dto); } else { services.UpdateCompetitorHybrid(common.Dto, (type as CultivarCompetitorHybridDataModel).Dto); } } return(true); }); } break; case CultivarTypes.EarlyCodedHybridType: loader = () => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { var result = services .GetEarlyCodeHybrid(cultivarIds) .Select(x => new CultivarEarlyCodedHybridDataModel(x)); return(result.ToArray()); } }; if (multipleValues) { vm = new Multiple.EarlyCodedHybridCultivarTypeViewModel(parent, loader); } else { vm = new Single.EarlyCodedHybridCultivarTypeViewModel(parent, loader, (common, type) => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { if (type == null) { services.UpdateGeneralInfoAndHeader(common.Dto); } else { services.UpdateEarlyCodedHybrid(common.Dto, (type as CultivarEarlyCodedHybridDataModel).Dto); } } return(true); }); } break; case CultivarTypes.HybridType: loader = () => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { var result = services .GetHybrid(cultivarIds) .Select(x => new CultivarHybridDataModel(x)); return(result.ToArray()); } }; if (multipleValues) { vm = new Multiple.HybridCultivarTypeViewModel(parent, loader); } else { vm = new Single.HybridCultivarTypeViewModel(parent, loader, (common, type) => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { if (type == null) { services.UpdateGeneralInfoAndHeader(common.Dto); } else { services.UpdateHybrid(common.Dto, (type as CultivarHybridDataModel).Dto); } } return(true); }); } break; case CultivarTypes.InbredLineType: // Inbred and non inbred are in the same viewmodel. case CultivarTypes.NonInbredAccessionType: loader = () => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { var result = services .GetInbredOrAccession(cultivarIds) .Select(x => new CultivarInbredOrAccessionDataModel(x)); return(result.ToArray()); } }; if (multipleValues) { vm = new Multiple.InbredOrAccessionCultivarTypeViewModel(parent, loader); } else { vm = new Single.InbredOrAccessionCultivarTypeViewModel(parent, loader, (common, type) => { using (var services = ServicesFactory.GetService <BOSServicesClient, IBOSServices>()) { if (type == null) { services.UpdateGeneralInfoAndHeader(common.Dto); } else { services.UpdateInbredOrAccession(common.Dto, (type as CultivarInbredOrAccessionDataModel).Dto); } } return(true); }); } break; default: throw new InvalidOperationException("Unknown cultivar type received. Cannot create a viewmodel for that code."); } return(vm); }