public List <EdFiEducationOrganizationAddress> Resolve(School source, EdFiSchool destination, List <EdFiEducationOrganizationAddress> destMember, ResolutionContext context)
        {
            var addressList = EducationOrganizationAddressResolver.ReplaceFirstAddressInList(source, destMember);

            destMember?.Clear(); // by default, automapper combines the source list with the destination list. we want to replace the destination list instead
            return(addressList);
        }
        public AdminManagementMappingProfile()
        {
            CreateMap <EdFiSchool, School>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.NameOfInstitution))
            .ForMember(dst => dst.EducationOrganizationId, opt => opt.MapFrom(src => src.SchoolId))
            .ForMember(dst => dst.LocalEducationAgencyId, opt => opt.MapFrom(src => src.LocalEducationAgencyReference == null ? null : src.LocalEducationAgencyReference.LocalEducationAgencyId))
            .ForMember(dst => dst.StreetNumberName, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any()? src.Addresses.First().StreetNumberName : null))
            .ForMember(dst => dst.ApartmentRoomSuiteNumber, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().ApartmentRoomSuiteNumber : null))
            .ForMember(dst => dst.State, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StateAbbreviationDescriptor : null))
            .ForMember(dst => dst.City, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().City : null))
            .ForMember(dst => dst.ZipCode, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().PostalCode : null))
            .ForMember(dst => dst.GradeLevels, opt => opt.MapFrom(src => src.GradeLevels != null  ? src.GradeLevels.Select(g => g.GradeLevelDescriptor) : new List <string>()))
            .ForMember(dst => dst.EducationOrganizationCategory, opt => opt.Ignore());     //this value is currently stored in web.config

            CreateMap <EdFiSchool, PsiSchool>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.NameOfInstitution))
            .ForMember(dst => dst.EducationOrganizationId, opt => opt.MapFrom(src => src.SchoolId))
            .ForMember(dst => dst.LocalEducationAgencyId, opt => opt.Ignore())
            .ForMember(dst => dst.PostSecondaryInstitutionId, opt => opt.MapFrom(src => src._ext == null
                    ? null
                    : src._ext != null && src._ext.TPDM == null
                        ? null
                        : src._ext != null && src._ext.TPDM != null && src._ext.TPDM.PostSecondaryInstitutionReference == null
                            ? null
                            : src._ext.TPDM.PostSecondaryInstitutionReference.PostSecondaryInstitutionId))
            .ForMember(dst => dst.StreetNumberName, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StreetNumberName : null))
            .ForMember(dst => dst.ApartmentRoomSuiteNumber, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().ApartmentRoomSuiteNumber : null))
            .ForMember(dst => dst.State, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StateAbbreviationDescriptor : null))
            .ForMember(dst => dst.City, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().City : null))
            .ForMember(dst => dst.ZipCode, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().PostalCode : null))
            .ForMember(dst => dst.GradeLevels, opt => opt.MapFrom(src => src.GradeLevels != null ? src.GradeLevels.Select(g => g.GradeLevelDescriptor) : new List <string>()))
            .ForMember(dst => dst.AccreditationStatus, opt => opt.MapFrom(src => src._ext == null
                    ? null
                    : src._ext != null && src._ext.TPDM == null
                        ? null
                        : src._ext.TPDM.AccreditationStatusDescriptor))
            .ForMember(dst => dst.FederalLocaleCode, opt => opt.MapFrom(src => src._ext == null
                    ? null
                    : src._ext != null && src._ext.TPDM == null
                        ? null
                        : src._ext.TPDM.FederalLocaleCodeDescriptor))
            .ForMember(dst => dst.ImprovingSchool, opt => opt.Ignore())
            .ForMember(dst => dst.EducationOrganizationCategory, opt => opt.Ignore());     //this value is currently stored in web.config

            CreateMap <EdFiLocalEducationAgency, LocalEducationAgency>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.LocalEducationAgencyId, opt => opt.MapFrom(src => src.LocalEducationAgencyId))
            .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.NameOfInstitution))
            .ForMember(dst => dst.EducationOrganizationId, opt => opt.MapFrom(src => src.LocalEducationAgencyId ?? 0))
            .ForMember(dst => dst.StreetNumberName, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StreetNumberName : null))
            .ForMember(dst => dst.ApartmentRoomSuiteNumber, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().ApartmentRoomSuiteNumber : null))
            .ForMember(dst => dst.State, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StateAbbreviationDescriptor : null))
            .ForMember(dst => dst.City, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().City : null))
            .ForMember(dst => dst.ZipCode, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().PostalCode : null))
            .ForMember(dst => dst.LocalEducationAgencyCategoryType, opt => opt.MapFrom(src => src.LocalEducationAgencyCategoryDescriptor))
            .ForMember(dst => dst.EducationOrganizationCategory, opt => opt.Ignore())     //this value is currently stored in web.config
            .ForMember(dst => dst.StateOrganizationId, opt => opt.MapFrom(src => src.StateEducationAgencyReference != null ? src.StateEducationAgencyReference.StateEducationAgencyId : 0));

            CreateMap <EdFiPostSecondaryInstitution, PostSecondaryInstitution>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.PostSecondaryInstitutionId, opt => opt.MapFrom(src => src.PostSecondaryInstitutionId))
            .ForMember(dst => dst.LocalEducationAgencyId, opt => opt.Ignore())
            .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.NameOfInstitution))
            .ForMember(dst => dst.EducationOrganizationId, opt => opt.MapFrom(src => src.PostSecondaryInstitutionId ?? 0))
            .ForMember(dst => dst.StreetNumberName, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StreetNumberName : null))
            .ForMember(dst => dst.ApartmentRoomSuiteNumber, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().ApartmentRoomSuiteNumber : null))
            .ForMember(dst => dst.State, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().StateAbbreviationDescriptor : null))
            .ForMember(dst => dst.City, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().City : null))
            .ForMember(dst => dst.ZipCode, opt => opt.MapFrom(src => src.Addresses != null && src.Addresses.Any() ? src.Addresses.First().PostalCode : null))
            .ForMember(dst => dst.PostSecondaryInstitutionLevel, opt => opt.MapFrom(src => src.PostSecondaryInstitutionLevelDescriptor))
            .ForMember(dst => dst.AdministrativeFundingControl, opt => opt.MapFrom(src => src.AdministrativeFundingControlDescriptor))
            .ForMember(dst => dst.EducationOrganizationCategory, opt => opt.Ignore());     //this value is currently stored in web.config

            CreateMap <School, EdFiSchool>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.SchoolId, opt => opt.MapFrom(src => src.EducationOrganizationId))
            .ForMember(dst => dst.NameOfInstitution, opt => opt.MapFrom(src => src.Name))
            .ForMember(dst => dst.Addresses, opt => opt.MapFrom <SchoolAddressResolver>())
            .ForMember(dst => dst.EducationOrganizationCategories,
                       opt => opt.MapFrom <SchoolCategoryResolver>())
            .ForMember(dst => dst.GradeLevels, opt => opt.MapFrom <SchoolGradeLevelResolver>())
            .ForMember(dst => dst.LocalEducationAgencyReference,
                       opt => opt.MapFrom <LocalEducationAgencyReferenceResolver>())
            .ForMember(dst => dst._ext, opt => opt.Ignore())
            .ForCtorParam("id", opt => opt.MapFrom(src => src.Id))
            .ForCtorParam("schoolId", opt => opt.MapFrom(src => src.EducationOrganizationId))
            .ForCtorParam("nameOfInstitution", opt => opt.MapFrom(src => src.Name))
            .ForCtorParam("addresses", opt => opt.MapFrom(AddressResolver))
            .ForCtorParam("educationOrganizationCategories", opt => opt.MapFrom(EducationOrganizationCategoryResolver.Resolve))
            .ForCtorParam("gradeLevels", opt => opt.MapFrom(SchoolGradeLevelResolver.Resolve));

            CreateMap <PsiSchool, EdFiSchool>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.SchoolId, opt => opt.MapFrom(src => src.EducationOrganizationId))
            .ForMember(dst => dst.NameOfInstitution, opt => opt.MapFrom(src => src.Name))
            .ForMember(dst => dst.Addresses, opt => opt.MapFrom <SchoolAddressResolver>())
            .ForMember(dst => dst.EducationOrganizationCategories,
                       opt => opt.MapFrom <SchoolCategoryResolver>())
            .ForMember(dst => dst.GradeLevels, opt => opt.MapFrom <SchoolGradeLevelResolver>())
            .ForMember(dst => dst.LocalEducationAgencyReference,
                       opt => opt.MapFrom <LocalEducationAgencyReferenceResolver>())
            .ForMember(dst => dst._ext,
                       opt => opt.MapFrom <SchoolExtensionsResolver>())
            .ForCtorParam("id", opt => opt.MapFrom(src => src.Id))
            .ForCtorParam("schoolId", opt => opt.MapFrom(src => src.EducationOrganizationId))
            .ForCtorParam("nameOfInstitution", opt => opt.MapFrom(src => src.Name))
            .ForCtorParam("addresses", opt => opt.MapFrom(AddressResolver))
            .ForCtorParam("educationOrganizationCategories", opt => opt.MapFrom(EducationOrganizationCategoryResolver.Resolve))
            .ForCtorParam("gradeLevels", opt => opt.MapFrom(SchoolGradeLevelResolver.Resolve));


            CreateMap <LocalEducationAgency, EdFiLocalEducationAgency>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.LocalEducationAgencyId, opt => opt.MapFrom(src => src.LocalEducationAgencyId))
            .ForMember(dst => dst.NameOfInstitution, opt => opt.MapFrom(src => src.Name))
            .ForMember(dst => dst.LocalEducationAgencyCategoryDescriptor, opt => opt.MapFrom(src => src.LocalEducationAgencyCategoryType))
            .ForMember(dst => dst.Addresses, opt => opt.MapFrom <LocalEducationAgencyAddressResolver>())
            .ForMember(dst => dst.StateEducationAgencyReference, opt => opt.MapFrom <StateEducationAgencyReferenceResolver>())
            .ForMember(dst => dst.Categories, opt => opt.MapFrom <LocalEducationAgencyCategoryResolver>())
            .ForCtorParam("id", opt => opt.MapFrom(src => src.Id))
            .ForCtorParam("addresses", opt => opt.MapFrom(AddressResolver))
            .ForCtorParam("categories", opt => opt.MapFrom(EducationOrganizationCategoryResolver.Resolve))
            .ForCtorParam("localEducationAgencyId", opt => opt.MapFrom(src => src.LocalEducationAgencyId))
            .ForCtorParam("localEducationAgencyCategoryDescriptor", opt => opt.MapFrom(src => src.LocalEducationAgencyCategoryType))
            .ForCtorParam("nameOfInstitution", opt => opt.MapFrom(src => src.Name));

            CreateMap <PostSecondaryInstitution, EdFiPostSecondaryInstitution>()
            .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dst => dst.PostSecondaryInstitutionId, opt => opt.MapFrom(src => src.PostSecondaryInstitutionId))
            .ForMember(dst => dst.NameOfInstitution, opt => opt.MapFrom(src => src.Name))
            .ForMember(dst => dst.PostSecondaryInstitutionLevelDescriptor, opt => opt.MapFrom(src => src.PostSecondaryInstitutionLevel))
            .ForMember(dst => dst.AdministrativeFundingControlDescriptor, opt => opt.MapFrom(src => src.AdministrativeFundingControl))
            .ForMember(dst => dst.Addresses, opt => opt.MapFrom <PostSecondaryInstitutionAddressResolver>())
            .ForMember(dst => dst.Categories, opt => opt.MapFrom <PostSecondaryInstitutionCategoryResolver>())
            .ForCtorParam("id", opt => opt.MapFrom(src => src.Id))
            .ForCtorParam("addresses", opt => opt.MapFrom(AddressResolver))
            .ForCtorParam("categories", opt => opt.MapFrom(EducationOrganizationCategoryResolver.Resolve))
            .ForCtorParam("postSecondaryInstitutionId", opt => opt.MapFrom(src => src.PostSecondaryInstitutionId))
            .ForCtorParam("postSecondaryInstitutionLevelDescriptor", opt => opt.MapFrom(src => src.PostSecondaryInstitutionLevel))
            .ForCtorParam("administrativeFundingControlDescriptor", opt => opt.MapFrom(src => src.AdministrativeFundingControl))
            .ForCtorParam("nameOfInstitution", opt => opt.MapFrom(src => src.Name));

            List <EdFiEducationOrganizationAddress> AddressResolver(EducationOrganization source,
                                                                    ResolutionContext context)
            => EducationOrganizationAddressResolver.Resolve(source);
        }