/// <summary>
        /// Creates and hydrates the 'RelatedInformation' section.
        /// </summary>
        /// <param name="mandatorySectionsOnly">Includes on the mandatory items</param>
        /// <returns>A hydrated 'RelatedInformation' object.</returns>
        public static IDocumentDetails CreateRelatedDocument(Boolean mandatorySectionsOnly)
        {
            var relatedDocument = AdvanceCareInformation.CreateRelatedDocument();

            // Examination Result Representation (Document Target)
            relatedDocument.ExternalData = BaseCDAModel.CreateExternalData();
            relatedDocument.ExternalData.ExternalDataMediaType = MediaType.PDF;
            relatedDocument.ExternalData.Path    = AttachmentFileNameAndPath;
            relatedDocument.ExternalData.Caption = "Attachment";

            // Document Provenance
            relatedDocument.DocumentProvenance = CreateDocumentProvenance(mandatorySectionsOnly);

            return(relatedDocument);
        }
        /// <summary>
        /// Creates and hydrates the 'DocumentProvenances' section.
        /// </summary>
        /// <param name="mandatorySectionsOnly">Includes on the mandatory sections</param>
        /// <returns>A hydrated 'DocumentProvenance' object.</returns>
        public static DocumentProvenance CreateDocumentProvenance(bool mandatorySectionsOnly)
        {
            var documentProvenance = AdvanceCareInformation.CreateDocumentProvenance();

            // Document Type
            documentProvenance.DocumentType = DocumentType.AdvanceCarePlanDirectiveAndSubstituteDecisionMaker;

            // Author of the CDA document
            documentProvenance.Author = CreateDocumentAuthor(mandatorySectionsOnly);

            if (!mandatorySectionsOnly)
            {
                // Document Identifier
                documentProvenance.DocumentIdentifier = BaseCDAModel.CreateIdentifier("Test Authority", null, null, "2.999.1234567890", null);
            }

            return(documentProvenance);
        }
        /// <summary>
        /// This sample populates both the mandatory and optional Sections / Entries depending on the
        /// mandatorySectionsOnly Boolean
        /// </summary>
        internal static AdvanceCareInformation PopulatedAdvanceCareInformation(Boolean mandatorySectionsOnly, AuthorType authorType)
        {
            var advanceCareInformation = AdvanceCareInformation.CreateAdvanceCareInformation();

            // Include Logo
            advanceCareInformation.IncludeLogo = true;
            advanceCareInformation.LogoPath    = OutputFolderPath;

            // Set Creation Time
            advanceCareInformation.DocumentCreationTime = new ISO8601DateTime(DateTime.Now);

            #region Setup and populate the CDA context model

            // Setup and populate the CDA context model
            var cdaContext = AdvanceCareInformation.CreateCDAContext();

            // Document Id
            cdaContext.DocumentId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateOid());

            // Set Id
            cdaContext.SetId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateGuid());

            // CDA Context Version
            cdaContext.Version = "1";

            // Custodian
            cdaContext.Custodian = BaseCDAModel.CreateCustodian();
            GenericObjectReuseSample.HydrateCustodian(cdaContext.Custodian, "Organisation Name", mandatorySectionsOnly);

            // Legal Authenticator
            cdaContext.LegalAuthenticator = BaseCDAModel.CreateLegalAuthenticator();
            GenericObjectReuseSample.HydrateAuthenticator(cdaContext.LegalAuthenticator, mandatorySectionsOnly);

            advanceCareInformation.CDAContext = cdaContext;

            #endregion

            #region Setup and Populate the SCS Context model
            // Setup and Populate the SCS Context model

            advanceCareInformation.SCSContext = AdvanceCareInformation.CreateSCSContext();

            // Switch on the author enumerator.
            switch (authorType)
            {
            case AuthorType.AuthorHealthcareProvider:
                // Create Author Healthcare Provider
                var authorHealthcareProvider = BaseCDAModel.CreateAuthorHealthcareProvider();
                GenericObjectReuseSample.HydrateAuthorHealthcareProvider(authorHealthcareProvider, "Organisation Name", mandatorySectionsOnly);
                advanceCareInformation.SCSContext.Author = authorHealthcareProvider;
                break;

            case AuthorType.AuthorNonHealthcareProvider:
                // Create Author Non Healthcare Provider
                var authorNonHealthcareProvider = BaseCDAModel.CreateAuthorPerson();
                GenericObjectReuseSample.HydrateAuthorNonHealthcareProvider(authorNonHealthcareProvider, mandatorySectionsOnly);
                advanceCareInformation.SCSContext.Author = authorNonHealthcareProvider;
                break;
            }

            advanceCareInformation.SCSContext.SubjectOfCare = BaseCDAModel.CreateSubjectOfCare();
            GenericObjectReuseSample.HydrateSubjectofCare(advanceCareInformation.SCSContext.SubjectOfCare, mandatorySectionsOnly);

            // REMOVE THESE FIELDS AS NOT ALLOWED IN ACI
            advanceCareInformation.SCSContext.SubjectOfCare.Participant.Person.DateOfDeath = null;
            advanceCareInformation.SCSContext.SubjectOfCare.Participant.Person.DateOfDeathAccuracyIndicator = null;
            advanceCareInformation.SCSContext.SubjectOfCare.Participant.Person.SourceOfDeathNotification    = null;

            #endregion

            #region Setup and populate the SCS Content model
            // Setup and populate the SCS Content model
            advanceCareInformation.SCSContent = AdvanceCareInformation.CreateSCSContent();

            // Related Information
            advanceCareInformation.SCSContent.DocumentDetails = CreateRelatedDocument(mandatorySectionsOnly);

            #endregion

            return(advanceCareInformation);
        }