text: from typing import Union, List, Optional
  
  from pyspark.sql.types import (
      StructType,
      StructField,
      StringType,
      ArrayType,
      BooleanType,
      DataType,
  )
  
  
  # This file is auto-generated by generate_schema so do not edit it manually
  # noinspection PyPep8Naming
  class Claim_InsuranceSchema:
      """
      A provider issued list of professional services and products which have been
      provided, or are to be provided, to a patient which is sent to an insurer for
      reimbursement.
      """
  
      # noinspection PyDefaultArgument
      @staticmethod
      def get_schema(
          max_nesting_depth: Optional[int] = 6,
          nesting_depth: int = 0,
          nesting_list: List[str] = [],
          max_recursion_limit: Optional[int] = 2,
          include_extension: Optional[bool] = False,
          extension_fields: Optional[List[str]] = [
              "valueBoolean",
              "valueCode",
              "valueDate",
              "valueDateTime",
              "valueDecimal",
              "valueId",
              "valueInteger",
              "valuePositiveInt",
              "valueString",
              "valueTime",
              "valueUnsignedInt",
              "valueUri",
              "valueUrl",
          ],
          extension_depth: int = 0,
          max_extension_depth: Optional[int] = 2,
          include_modifierExtension: Optional[bool] = False,
      ) -> Union[StructType, DataType]:
          """
          A provider issued list of professional services and products which have been
          provided, or are to be provided, to a patient which is sent to an insurer for
          reimbursement.
  
  
          id: Unique id for the element within a resource (for internal references). This
              may be any string value that does not contain spaces.
  
          extension: May be used to represent additional information that is not part of the basic
              definition of the element. To make the use of extensions safe and manageable,
              there is a strict set of governance  applied to the definition and use of
              extensions. Though any implementer can define an extension, there is a set of
              requirements that SHALL be met as part of the definition of the extension.
  
          modifierExtension: May be used to represent additional information that is not part of the basic
              definition of the element and that modifies the understanding of the element
              in which it is contained and/or the understanding of the containing element's
              descendants. Usually modifier elements provide negation or qualification. To
              make the use of extensions safe and manageable, there is a strict set of
              governance applied to the definition and use of extensions. Though any
              implementer can define an extension, there is a set of requirements that SHALL
              be met as part of the definition of the extension. Applications processing a
              resource are required to check for modifier extensions.
  
              Modifier extensions SHALL NOT change the meaning of any elements on Resource
              or DomainResource (including cannot change the meaning of modifierExtension
              itself).
  
          sequence: A number to uniquely identify insurance entries and provide a sequence of
              coverages to convey coordination of benefit order.
  
          focal: A flag to indicate that this Coverage is to be used for adjudication of this
              claim when set to true.
  
          identifier: The business identifier to be used when the claim is sent for adjudication
              against this insurance policy.
  
          coverage: Reference to the insurance card level information contained in the Coverage
              resource. The coverage issuing insurer will use these details to locate the
              patient's actual coverage within the insurer's information system.
  
          businessArrangement: A business agreement number established between the provider and the insurer
              for special business processing purposes.
  
          preAuthRef: Reference numbers previously provided by the insurer to the provider to be
              quoted on subsequent claims containing services or products related to the
              prior authorization.
  
          claimResponse: The result of the adjudication of the line items for the Coverage specified in
              this insurance.
  
          """
          from spark_fhir_schemas.r4.complex_types.extension import ExtensionSchema
          from spark_fhir_schemas.r4.simple_types.positiveint import positiveIntSchema
          from spark_fhir_schemas.r4.complex_types.identifier import IdentifierSchema
          from spark_fhir_schemas.r4.complex_types.reference import ReferenceSchema
  
          if (
              max_recursion_limit
              and nesting_list.count("Claim_Insurance") >= max_recursion_limit
          ) or (max_nesting_depth and nesting_depth >= max_nesting_depth):
              return StructType([StructField("id", StringType(), True)])
          # add my name to recursion list for later
          my_nesting_list: List[str] = nesting_list + ["Claim_Insurance"]
          schema = StructType(
              [
                  # Unique id for the element within a resource (for internal references). This
                  # may be any string value that does not contain spaces.
                  StructField("id", StringType(), True),
                  # May be used to represent additional information that is not part of the basic
                  # definition of the element. To make the use of extensions safe and manageable,
                  # there is a strict set of governance  applied to the definition and use of
                  # extensions. Though any implementer can define an extension, there is a set of
                  # requirements that SHALL be met as part of the definition of the extension.
                  StructField(
                      "extension",
                      ArrayType(
                          ExtensionSchema.get_schema(
                              max_nesting_depth=max_nesting_depth,
                              nesting_depth=nesting_depth + 1,
                              nesting_list=my_nesting_list,
                              max_recursion_limit=max_recursion_limit,
                              include_extension=include_extension,
                              extension_fields=extension_fields,
                              extension_depth=extension_depth,
                              max_extension_depth=max_extension_depth,
                              include_modifierExtension=include_modifierExtension,
                          )
                      ),
                      True,
                  ),
                  # May be used to represent additional information that is not part of the basic
                  # definition of the element and that modifies the understanding of the element
                  # in which it is contained and/or the understanding of the containing element's
                  # descendants. Usually modifier elements provide negation or qualification. To
                  # make the use of extensions safe and manageable, there is a strict set of
                  # governance applied to the definition and use of extensions. Though any
                  # implementer can define an extension, there is a set of requirements that SHALL
                  # be met as part of the definition of the extension. Applications processing a
                  # resource are required to check for modifier extensions.
                  #
                  # Modifier extensions SHALL NOT change the meaning of any elements on Resource
                  # or DomainResource (including cannot change the meaning of modifierExtension
                  # itself).
                  StructField(
                      "modifierExtension",
                      ArrayType(
                          ExtensionSchema.get_schema(
                              max_nesting_depth=max_nesting_depth,
                              nesting_depth=nesting_depth + 1,
                              nesting_list=my_nesting_list,
                              max_recursion_limit=max_recursion_limit,
                              include_extension=include_extension,
                              extension_fields=extension_fields,
                              extension_depth=extension_depth,
                              max_extension_depth=max_extension_depth,
                              include_modifierExtension=include_modifierExtension,
                          )
                      ),
                      True,
                  ),
                  # A number to uniquely identify insurance entries and provide a sequence of
                  # coverages to convey coordination of benefit order.
                  StructField(
                      "sequence",
                      positiveIntSchema.get_schema(
                          max_nesting_depth=max_nesting_depth,
                          nesting_depth=nesting_depth + 1,
                          nesting_list=my_nesting_list,
                          max_recursion_limit=max_recursion_limit,
                          include_extension=include_extension,
                          extension_fields=extension_fields,
                          extension_depth=extension_depth + 1,
                          max_extension_depth=max_extension_depth,
                          include_modifierExtension=include_modifierExtension,
                      ),
                      True,
                  ),
                  # A flag to indicate that this Coverage is to be used for adjudication of this
                  # claim when set to true.
                  StructField("focal", BooleanType(), True),
                  # The business identifier to be used when the claim is sent for adjudication
                  # against this insurance policy.
                  StructField(
                      "identifier",
                      IdentifierSchema.get_schema(
                          max_nesting_depth=max_nesting_depth,
                          nesting_depth=nesting_depth + 1,
                          nesting_list=my_nesting_list,
                          max_recursion_limit=max_recursion_limit,
                          include_extension=include_extension,
                          extension_fields=extension_fields,
                          extension_depth=extension_depth + 1,
                          max_extension_depth=max_extension_depth,
                          include_modifierExtension=include_modifierExtension,
                      ),
                      True,
                  ),
                  # Reference to the insurance card level information contained in the Coverage
                  # resource. The coverage issuing insurer will use these details to locate the
                  # patient's actual coverage within the insurer's information system.
                  StructField(
                      "coverage",
                      ReferenceSchema.get_schema(
                          max_nesting_depth=max_nesting_depth,
                          nesting_depth=nesting_depth + 1,
                          nesting_list=my_nesting_list,
                          max_recursion_limit=max_recursion_limit,
                          include_extension=include_extension,
                          extension_fields=extension_fields,
                          extension_depth=extension_depth + 1,
                          max_extension_depth=max_extension_depth,
                          include_modifierExtension=include_modifierExtension,
                      ),
                      True,
                  ),
                  # A business agreement number established between the provider and the insurer
                  # for special business processing purposes.
                  StructField("businessArrangement", StringType(), True),
                  # Reference numbers previously provided by the insurer to the provider to be
                  # quoted on subsequent claims containing services or products related to the
                  # prior authorization.
                  StructField("preAuthRef", ArrayType(StringType()), True),
                  # The result of the adjudication of the line items for the Coverage specified in
                  # this insurance.
                  StructField(
                      "claimResponse",
                      ReferenceSchema.get_schema(
                          max_nesting_depth=max_nesting_depth,
                          nesting_depth=nesting_depth + 1,
                          nesting_list=my_nesting_list,
                          max_recursion_limit=max_recursion_limit,
                          include_extension=include_extension,
                          extension_fields=extension_fields,
                          extension_depth=extension_depth + 1,
                          max_extension_depth=max_extension_depth,
                          include_modifierExtension=include_modifierExtension,
                      ),
                      True,
                  ),
              ]
          )
          if not include_extension:
              schema.fields = [
                  c
                  if c.name != "extension"
                  else StructField("extension", StringType(), True)
                  for c in schema.fields
              ]
  
          if not include_modifierExtension:
              schema.fields = [
                  c
                  if c.name != "modifierExtension"
                  else StructField("modifierExtension", StringType(), True)
                  for c in schema.fields
              ]
  
          return schema
  