# WARNING: This file is autogenerated by FHIR Schema Codegen.
# https://github.com/fhir-schema/fhir-schema-codegen
# Any manual changes made to this file may be overwritten.

from __future__ import annotations
from pydantic import ConfigDict, Field
from typing import List as PyList, Literal

from fhirschemapy.R4B.base import (
    BackboneElement,
    CodeableConcept,
    ContactDetail,
    Reference,
    UsageContext,
)
from fhirschemapy.R4B.domain_resource import DomainResource


class ImplementationGuideDefinition(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    grouping: PyList[ImplementationGuideDefinitionGrouping] | None = Field(
        None, alias="grouping", serialization_alias="grouping"
    )
    page: ImplementationGuideDefinitionPage | None = Field(
        None, alias="page", serialization_alias="page"
    )
    parameter: PyList[ImplementationGuideDefinitionParameter] | None = Field(
        None, alias="parameter", serialization_alias="parameter"
    )
    resource: PyList[ImplementationGuideDefinitionResource] = Field(
        alias="resource", serialization_alias="resource"
    )
    template: PyList[ImplementationGuideDefinitionTemplate] | None = Field(
        None, alias="template", serialization_alias="template"
    )


class ImplementationGuideDefinitionGrouping(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    description: str | None = Field(
        None, alias="description", serialization_alias="description"
    )
    name: str = Field(alias="name", serialization_alias="name")


class ImplementationGuideDefinitionPage(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    generation: Literal["html", "markdown", "xml", "generated"] = Field(
        alias="generation", serialization_alias="generation"
    )
    name_reference: Reference | None = Field(
        None, alias="nameReference", serialization_alias="nameReference"
    )
    name_url: str | None = Field(None, alias="nameUrl", serialization_alias="nameUrl")
    page: PyList[ImplementationGuideDefinitionPage] | None = Field(
        None, alias="page", serialization_alias="page"
    )
    title: str = Field(alias="title", serialization_alias="title")


class ImplementationGuideDefinitionParameter(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    code: Literal[
        "apply",
        "path-resource",
        "path-pages",
        "path-tx-cache",
        "expansion-parameter",
        "rule-broken-links",
        "generate-xml",
        "generate-json",
        "generate-turtle",
        "html-template",
    ] = Field(alias="code", serialization_alias="code")
    value: str = Field(alias="value", serialization_alias="value")


class ImplementationGuideDefinitionResource(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    description: str | None = Field(
        None, alias="description", serialization_alias="description"
    )
    example_boolean: bool | None = Field(
        None, alias="exampleBoolean", serialization_alias="exampleBoolean"
    )
    example_canonical: str | None = Field(
        None, alias="exampleCanonical", serialization_alias="exampleCanonical"
    )
    fhir_version: (
        PyList[
            Literal[
                "0.01",
                "0.05",
                "0.06",
                "0.11",
                "0.0.80",
                "0.0.81",
                "0.0.82",
                "0.4.0",
                "0.5.0",
                "1.0.0",
                "1.0.1",
                "1.0.2",
                "1.1.0",
                "1.4.0",
                "1.6.0",
                "1.8.0",
                "3.0.0",
                "3.0.1",
                "3.3.0",
                "3.5.0",
                "4.0.0",
                "4.0.1",
            ]
        ]
        | None
    ) = Field(None, alias="fhirVersion", serialization_alias="fhirVersion")
    grouping_id: str | None = Field(
        None, alias="groupingId", serialization_alias="groupingId"
    )
    name: str | None = Field(None, alias="name", serialization_alias="name")
    reference: Reference = Field(alias="reference", serialization_alias="reference")


class ImplementationGuideDefinitionTemplate(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    code: str = Field(alias="code", serialization_alias="code")
    scope: str | None = Field(None, alias="scope", serialization_alias="scope")
    source: str = Field(alias="source", serialization_alias="source")


class ImplementationGuideDependsOn(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    package_id: str | None = Field(
        None, alias="packageId", serialization_alias="packageId"
    )
    uri: str = Field(alias="uri", serialization_alias="uri")
    version: str | None = Field(None, alias="version", serialization_alias="version")


class ImplementationGuideGlobal(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    profile: str = Field(alias="profile", serialization_alias="profile")
    type: Literal[
        "Account",
        "ActivityDefinition",
        "AdverseEvent",
        "AllergyIntolerance",
        "Appointment",
        "AppointmentResponse",
        "AuditEvent",
        "Basic",
        "Binary",
        "BiologicallyDerivedProduct",
        "BodyStructure",
        "Bundle",
        "CapabilityStatement",
        "CarePlan",
        "CareTeam",
        "CatalogEntry",
        "ChargeItem",
        "ChargeItemDefinition",
        "Claim",
        "ClaimResponse",
        "ClinicalImpression",
        "CodeSystem",
        "Communication",
        "CommunicationRequest",
        "CompartmentDefinition",
        "Composition",
        "ConceptMap",
        "Condition",
        "Consent",
        "Contract",
        "Coverage",
        "CoverageEligibilityRequest",
        "CoverageEligibilityResponse",
        "DetectedIssue",
        "Device",
        "DeviceDefinition",
        "DeviceMetric",
        "DeviceRequest",
        "DeviceUseStatement",
        "DiagnosticReport",
        "DocumentManifest",
        "DocumentReference",
        "DomainResource",
        "EffectEvidenceSynthesis",
        "Encounter",
        "Endpoint",
        "EnrollmentRequest",
        "EnrollmentResponse",
        "EpisodeOfCare",
        "EventDefinition",
        "Evidence",
        "EvidenceVariable",
        "ExampleScenario",
        "ExplanationOfBenefit",
        "FamilyMemberHistory",
        "Flag",
        "Goal",
        "GraphDefinition",
        "Group",
        "GuidanceResponse",
        "HealthcareService",
        "ImagingStudy",
        "Immunization",
        "ImmunizationEvaluation",
        "ImmunizationRecommendation",
        "ImplementationGuide",
        "InsurancePlan",
        "Invoice",
        "Library",
        "Linkage",
        "List",
        "Location",
        "Measure",
        "MeasureReport",
        "Media",
        "Medication",
        "MedicationAdministration",
        "MedicationDispense",
        "MedicationKnowledge",
        "MedicationRequest",
        "MedicationStatement",
        "MedicinalProduct",
        "MedicinalProductAuthorization",
        "MedicinalProductContraindication",
        "MedicinalProductIndication",
        "MedicinalProductIngredient",
        "MedicinalProductInteraction",
        "MedicinalProductManufactured",
        "MedicinalProductPackaged",
        "MedicinalProductPharmaceutical",
        "MedicinalProductUndesirableEffect",
        "MessageDefinition",
        "MessageHeader",
        "MolecularSequence",
        "NamingSystem",
        "NutritionOrder",
        "Observation",
        "ObservationDefinition",
        "OperationDefinition",
        "OperationOutcome",
        "Organization",
        "OrganizationAffiliation",
        "Parameters",
        "Patient",
        "PaymentNotice",
        "PaymentReconciliation",
        "Person",
        "PlanDefinition",
        "Practitioner",
        "PractitionerRole",
        "Procedure",
        "Provenance",
        "Questionnaire",
        "QuestionnaireResponse",
        "RelatedPerson",
        "RequestGroup",
        "ResearchDefinition",
        "ResearchElementDefinition",
        "ResearchStudy",
        "ResearchSubject",
        "Resource",
        "RiskAssessment",
        "RiskEvidenceSynthesis",
        "Schedule",
        "SearchParameter",
        "ServiceRequest",
        "Slot",
        "Specimen",
        "SpecimenDefinition",
        "StructureDefinition",
        "StructureMap",
        "Subscription",
        "Substance",
        "SubstanceNucleicAcid",
        "SubstancePolymer",
        "SubstanceProtein",
        "SubstanceReferenceInformation",
        "SubstanceSourceMaterial",
        "SubstanceSpecification",
        "SupplyDelivery",
        "SupplyRequest",
        "Task",
        "TerminologyCapabilities",
        "TestReport",
        "TestScript",
        "ValueSet",
        "VerificationResult",
        "VisionPrescription",
    ] = Field(alias="type", serialization_alias="type")


class ImplementationGuideManifest(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    image: PyList[str] | None = Field(None, alias="image", serialization_alias="image")
    other: PyList[str] | None = Field(None, alias="other", serialization_alias="other")
    page: PyList[ImplementationGuideManifestPage] | None = Field(
        None, alias="page", serialization_alias="page"
    )
    rendering: str | None = Field(
        None, alias="rendering", serialization_alias="rendering"
    )
    resource: PyList[ImplementationGuideManifestResource] = Field(
        alias="resource", serialization_alias="resource"
    )


class ImplementationGuideManifestPage(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    anchor: PyList[str] | None = Field(
        None, alias="anchor", serialization_alias="anchor"
    )
    name: str = Field(alias="name", serialization_alias="name")
    title: str | None = Field(None, alias="title", serialization_alias="title")


class ImplementationGuideManifestResource(BackboneElement):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    example_boolean: bool | None = Field(
        None, alias="exampleBoolean", serialization_alias="exampleBoolean"
    )
    example_canonical: str | None = Field(
        None, alias="exampleCanonical", serialization_alias="exampleCanonical"
    )
    reference: Reference = Field(alias="reference", serialization_alias="reference")
    relative_path: str | None = Field(
        None, alias="relativePath", serialization_alias="relativePath"
    )


class ImplementationGuide(DomainResource):
    model_config = ConfigDict(serialize_by_alias=True, extra="forbid")

    resource_type: str = Field(
        default="ImplementationGuide",
        alias="resourceType",
        serialization_alias="resourceType",
        frozen=True,
        pattern="ImplementationGuide",
    )

    contact: PyList[ContactDetail] | None = Field(
        None, alias="contact", serialization_alias="contact"
    )
    copyright: str | None = Field(
        None, alias="copyright", serialization_alias="copyright"
    )
    date: str | None = Field(None, alias="date", serialization_alias="date")
    definition: ImplementationGuideDefinition | None = Field(
        None, alias="definition", serialization_alias="definition"
    )
    depends_on: PyList[ImplementationGuideDependsOn] | None = Field(
        None, alias="dependsOn", serialization_alias="dependsOn"
    )
    description: str | None = Field(
        None, alias="description", serialization_alias="description"
    )
    experimental: bool | None = Field(
        None, alias="experimental", serialization_alias="experimental"
    )
    fhir_version: PyList[
        Literal[
            "0.01",
            "0.05",
            "0.06",
            "0.11",
            "0.0.80",
            "0.0.81",
            "0.0.82",
            "0.4.0",
            "0.5.0",
            "1.0.0",
            "1.0.1",
            "1.0.2",
            "1.1.0",
            "1.4.0",
            "1.6.0",
            "1.8.0",
            "3.0.0",
            "3.0.1",
            "3.3.0",
            "3.5.0",
            "4.0.0",
            "4.0.1",
        ]
    ] = Field(alias="fhirVersion", serialization_alias="fhirVersion")
    global_: PyList[ImplementationGuideGlobal] | None = Field(
        None, alias="global", serialization_alias="global"
    )
    jurisdiction: PyList[CodeableConcept] | None = Field(
        None, alias="jurisdiction", serialization_alias="jurisdiction"
    )
    license: (
        Literal[
            "not-open-source",
            "0BSD",
            "AAL",
            "Abstyles",
            "Adobe-2006",
            "Adobe-Glyph",
            "ADSL",
            "AFL-1.1",
            "AFL-1.2",
            "AFL-2.0",
            "AFL-2.1",
            "AFL-3.0",
            "Afmparse",
            "AGPL-1.0-only",
            "AGPL-1.0-or-later",
            "AGPL-3.0-only",
            "AGPL-3.0-or-later",
            "Aladdin",
            "AMDPLPA",
            "AML",
            "AMPAS",
            "ANTLR-PD",
            "Apache-1.0",
            "Apache-1.1",
            "Apache-2.0",
            "APAFML",
            "APL-1.0",
            "APSL-1.0",
            "APSL-1.1",
            "APSL-1.2",
            "APSL-2.0",
            "Artistic-1.0-cl8",
            "Artistic-1.0-Perl",
            "Artistic-1.0",
            "Artistic-2.0",
            "Bahyph",
            "Barr",
            "Beerware",
            "BitTorrent-1.0",
            "BitTorrent-1.1",
            "Borceux",
            "BSD-1-Clause",
            "BSD-2-Clause-FreeBSD",
            "BSD-2-Clause-NetBSD",
            "BSD-2-Clause-Patent",
            "BSD-2-Clause",
            "BSD-3-Clause-Attribution",
            "BSD-3-Clause-Clear",
            "BSD-3-Clause-LBNL",
            "BSD-3-Clause-No-Nuclear-License-2014",
            "BSD-3-Clause-No-Nuclear-License",
            "BSD-3-Clause-No-Nuclear-Warranty",
            "BSD-3-Clause",
            "BSD-4-Clause-UC",
            "BSD-4-Clause",
            "BSD-Protection",
            "BSD-Source-Code",
            "BSL-1.0",
            "bzip2-1.0.5",
            "bzip2-1.0.6",
            "Caldera",
            "CATOSL-1.1",
            "CC-BY-1.0",
            "CC-BY-2.0",
            "CC-BY-2.5",
            "CC-BY-3.0",
            "CC-BY-4.0",
            "CC-BY-NC-1.0",
            "CC-BY-NC-2.0",
            "CC-BY-NC-2.5",
            "CC-BY-NC-3.0",
            "CC-BY-NC-4.0",
            "CC-BY-NC-ND-1.0",
            "CC-BY-NC-ND-2.0",
            "CC-BY-NC-ND-2.5",
            "CC-BY-NC-ND-3.0",
            "CC-BY-NC-ND-4.0",
            "CC-BY-NC-SA-1.0",
            "CC-BY-NC-SA-2.0",
            "CC-BY-NC-SA-2.5",
            "CC-BY-NC-SA-3.0",
            "CC-BY-NC-SA-4.0",
            "CC-BY-ND-1.0",
            "CC-BY-ND-2.0",
            "CC-BY-ND-2.5",
            "CC-BY-ND-3.0",
            "CC-BY-ND-4.0",
            "CC-BY-SA-1.0",
            "CC-BY-SA-2.0",
            "CC-BY-SA-2.5",
            "CC-BY-SA-3.0",
            "CC-BY-SA-4.0",
            "CC0-1.0",
            "CDDL-1.0",
            "CDDL-1.1",
            "CDLA-Permissive-1.0",
            "CDLA-Sharing-1.0",
            "CECILL-1.0",
            "CECILL-1.1",
            "CECILL-2.0",
            "CECILL-2.1",
            "CECILL-B",
            "CECILL-C",
            "ClArtistic",
            "CNRI-Jython",
            "CNRI-Python-GPL-Compatible",
            "CNRI-Python",
            "Condor-1.1",
            "CPAL-1.0",
            "CPL-1.0",
            "CPOL-1.02",
            "Crossword",
            "CrystalStacker",
            "CUA-OPL-1.0",
            "Cube",
            "curl",
            "D-FSL-1.0",
            "diffmark",
            "DOC",
            "Dotseqn",
            "DSDP",
            "dvipdfm",
            "ECL-1.0",
            "ECL-2.0",
            "EFL-1.0",
            "EFL-2.0",
            "eGenix",
            "Entessa",
            "EPL-1.0",
            "EPL-2.0",
            "ErlPL-1.1",
            "EUDatagrid",
            "EUPL-1.0",
            "EUPL-1.1",
            "EUPL-1.2",
            "Eurosym",
            "Fair",
            "Frameworx-1.0",
            "FreeImage",
            "FSFAP",
            "FSFUL",
            "FSFULLR",
            "FTL",
            "GFDL-1.1-only",
            "GFDL-1.1-or-later",
            "GFDL-1.2-only",
            "GFDL-1.2-or-later",
            "GFDL-1.3-only",
            "GFDL-1.3-or-later",
            "Giftware",
            "GL2PS",
            "Glide",
            "Glulxe",
            "gnuplot",
            "GPL-1.0-only",
            "GPL-1.0-or-later",
            "GPL-2.0-only",
            "GPL-2.0-or-later",
            "GPL-3.0-only",
            "GPL-3.0-or-later",
            "gSOAP-1.3b",
            "HaskellReport",
            "HPND",
            "IBM-pibs",
            "ICU",
            "IJG",
            "ImageMagick",
            "iMatix",
            "Imlib2",
            "Info-ZIP",
            "Intel-ACPI",
            "Intel",
            "Interbase-1.0",
            "IPA",
            "IPL-1.0",
            "ISC",
            "JasPer-2.0",
            "JSON",
            "LAL-1.2",
            "LAL-1.3",
            "Latex2e",
            "Leptonica",
            "LGPL-2.0-only",
            "LGPL-2.0-or-later",
            "LGPL-2.1-only",
            "LGPL-2.1-or-later",
            "LGPL-3.0-only",
            "LGPL-3.0-or-later",
            "LGPLLR",
            "Libpng",
            "libtiff",
            "LiLiQ-P-1.1",
            "LiLiQ-R-1.1",
            "LiLiQ-Rplus-1.1",
            "Linux-OpenIB",
            "LPL-1.0",
            "LPL-1.02",
            "LPPL-1.0",
            "LPPL-1.1",
            "LPPL-1.2",
            "LPPL-1.3a",
            "LPPL-1.3c",
            "MakeIndex",
            "MirOS",
            "MIT-0",
            "MIT-advertising",
            "MIT-CMU",
            "MIT-enna",
            "MIT-feh",
            "MIT",
            "MITNFA",
            "Motosoto",
            "mpich2",
            "MPL-1.0",
            "MPL-1.1",
            "MPL-2.0-no-copyleft-exception",
            "MPL-2.0",
            "MS-PL",
            "MS-RL",
            "MTLL",
            "Multics",
            "Mup",
            "NASA-1.3",
            "Naumen",
            "NBPL-1.0",
            "NCSA",
            "Net-SNMP",
            "NetCDF",
            "Newsletr",
            "NGPL",
            "NLOD-1.0",
            "NLPL",
            "Nokia",
            "NOSL",
            "Noweb",
            "NPL-1.0",
            "NPL-1.1",
            "NPOSL-3.0",
            "NRL",
            "NTP",
            "OCCT-PL",
            "OCLC-2.0",
            "ODbL-1.0",
            "OFL-1.0",
            "OFL-1.1",
            "OGTSL",
            "OLDAP-1.1",
            "OLDAP-1.2",
            "OLDAP-1.3",
            "OLDAP-1.4",
            "OLDAP-2.0.1",
            "OLDAP-2.0",
            "OLDAP-2.1",
            "OLDAP-2.2.1",
            "OLDAP-2.2.2",
            "OLDAP-2.2",
            "OLDAP-2.3",
            "OLDAP-2.4",
            "OLDAP-2.5",
            "OLDAP-2.6",
            "OLDAP-2.7",
            "OLDAP-2.8",
            "OML",
            "OpenSSL",
            "OPL-1.0",
            "OSET-PL-2.1",
            "OSL-1.0",
            "OSL-1.1",
            "OSL-2.0",
            "OSL-2.1",
            "OSL-3.0",
            "PDDL-1.0",
            "PHP-3.0",
            "PHP-3.01",
            "Plexus",
            "PostgreSQL",
            "psfrag",
            "psutils",
            "Python-2.0",
            "Qhull",
            "QPL-1.0",
            "Rdisc",
            "RHeCos-1.1",
            "RPL-1.1",
            "RPL-1.5",
            "RPSL-1.0",
            "RSA-MD",
            "RSCPL",
            "Ruby",
            "SAX-PD",
            "Saxpath",
            "SCEA",
            "Sendmail",
            "SGI-B-1.0",
            "SGI-B-1.1",
            "SGI-B-2.0",
            "SimPL-2.0",
            "SISSL-1.2",
            "SISSL",
            "Sleepycat",
            "SMLNJ",
            "SMPPL",
            "SNIA",
            "Spencer-86",
            "Spencer-94",
            "Spencer-99",
            "SPL-1.0",
            "SugarCRM-1.1.3",
            "SWL",
            "TCL",
            "TCP-wrappers",
            "TMate",
            "TORQUE-1.1",
            "TOSL",
            "Unicode-DFS-2015",
            "Unicode-DFS-2016",
            "Unicode-TOU",
            "Unlicense",
            "UPL-1.0",
            "Vim",
            "VOSTROM",
            "VSL-1.0",
            "W3C-19980720",
            "W3C-20150513",
            "W3C",
            "Watcom-1.0",
            "Wsuipa",
            "WTFPL",
            "X11",
            "Xerox",
            "XFree86-1.1",
            "xinetd",
            "Xnet",
            "xpp",
            "XSkat",
            "YPL-1.0",
            "YPL-1.1",
            "Zed",
            "Zend-2.0",
            "Zimbra-1.3",
            "Zimbra-1.4",
            "zlib-acknowledgement",
            "Zlib",
            "ZPL-1.1",
            "ZPL-2.0",
            "ZPL-2.1",
        ]
        | None
    ) = Field(None, alias="license", serialization_alias="license")
    manifest: ImplementationGuideManifest | None = Field(
        None, alias="manifest", serialization_alias="manifest"
    )
    name: str = Field(alias="name", serialization_alias="name")
    package_id: str = Field(alias="packageId", serialization_alias="packageId")
    publisher: str | None = Field(
        None, alias="publisher", serialization_alias="publisher"
    )
    status: Literal["draft", "active", "retired", "unknown"] = Field(
        alias="status", serialization_alias="status"
    )
    title: str | None = Field(None, alias="title", serialization_alias="title")
    url: str = Field(alias="url", serialization_alias="url")
    use_context: PyList[UsageContext] | None = Field(
        None, alias="useContext", serialization_alias="useContext"
    )
    version: str | None = Field(None, alias="version", serialization_alias="version")

    def to_json(self, indent: int | None = None) -> str:
        return self.model_dump_json(
            exclude_unset=True, exclude_none=True, indent=indent
        )

    @classmethod
    def from_json(cls, json: str) -> ImplementationGuide:
        return cls.model_validate_json(json)
