//    Copyright 2019 Google Inc.
//
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
//
//        https://www.apache.org/licenses/LICENSE-2.0
//
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.

syntax = "proto3";

package google.fhir.r4.core;

import "google/protobuf/any.proto";
import "google/fhir/core/proto/annotations.proto";
import "google/fhir/r4/proto/core/codes.proto";
import "google/fhir/r4/proto/core/datatypes.proto";

option java_multiple_files = true;
option java_package = "com.google.fhir.r4.core";
option (.google.fhir.proto.fhir_version) = R4;
option go_package = "github.com/google/fhir/go/google/fhir/r4/proto/core/resources/message_definition_go_proto";

// Auto-generated from StructureDefinition for MessageDefinition.
// A resource that defines a type of message that can be exchanged between
// systems. See http://hl7.org/fhir/StructureDefinition/MessageDefinition
message MessageDefinition {
  option (.google.fhir.proto.structure_definition_kind) = KIND_RESOURCE;
  option (.google.fhir.proto.fhir_structure_definition_url) =
      "http://hl7.org/fhir/StructureDefinition/MessageDefinition";
  option (.google.fhir.proto.fhir_path_message_warning_constraint) =
      "name.matches('[A-Z]([A-Za-z0-9_]){0,254}')";

  // Logical id of this artifact
  Id id = 1;

  // Metadata about the resource
  Meta meta = 2;

  // A set of rules under which this content was created
  Uri implicit_rules = 3;

  // Language of the resource content
  Code language = 4;

  // Text summary of the resource, for human interpretation
  Narrative text = 5;

  // Contained, inline Resources
  repeated protobuf.Any contained = 6;

  // Field 7 reserved for strongly-typed ContainedResource for id:
  // MessageDefinition.contained
  reserved 7;

  // Additional content defined by implementations
  repeated Extension extension = 8;

  // Extensions that cannot be ignored
  repeated Extension modifier_extension = 9;

  // Business Identifier for a given MessageDefinition
  Uri url = 10;

  // Primary key for the message definition on a given server
  repeated Identifier identifier = 11;

  // Business version of the message definition
  String version = 12;

  // Name for this message definition (computer friendly)
  String name = 13;

  // Name for this message definition (human friendly)
  String title = 14;

  // Takes the place of
  repeated Canonical replaces = 15;

  // draft | active | retired | unknown
  message StatusCode {
    option (.google.fhir.proto.structure_definition_kind) = KIND_PRIMITIVE_TYPE;
    option (.google.fhir.proto.fhir_valueset_url) =
        "http://hl7.org/fhir/ValueSet/publication-status";
    option (.google.fhir.proto.fhir_profile_base) =
        "http://hl7.org/fhir/StructureDefinition/code";

    PublicationStatusCode.Value value = 1;

    String id = 2;

    repeated Extension extension = 3;
  }
  StatusCode status = 16
      [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

  // For testing purposes, not real usage
  Boolean experimental = 17;

  // Date last changed
  DateTime date = 18
      [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

  // Name of the publisher (organization or individual)
  String publisher = 19;

  // Contact details for the publisher
  repeated ContactDetail contact = 20;

  // Natural language description of the message definition
  Markdown description = 21;

  // The context that the content is intended to support
  repeated UsageContext use_context = 22;

  // Intended jurisdiction for message definition (if applicable)
  repeated CodeableConcept jurisdiction = 23;

  // Why this message definition is defined
  Markdown purpose = 24;

  // Use and/or publishing restrictions
  Markdown copyright = 25;

  // Definition this one is based on
  Canonical base = 26;

  // Protocol/workflow this is part of
  repeated Canonical parent = 27;

  // Event code  or link to the EventDefinition
  message EventX {
    option (.google.fhir.proto.is_choice_type) = true;

    oneof choice {
      Coding coding = 1;
      Uri uri = 2;
    }
  }
  EventX event = 28
      [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

  // consequence | currency | notification
  message CategoryCode {
    option (.google.fhir.proto.structure_definition_kind) = KIND_PRIMITIVE_TYPE;
    option (.google.fhir.proto.fhir_valueset_url) =
        "http://hl7.org/fhir/ValueSet/message-significance-category";
    option (.google.fhir.proto.fhir_profile_base) =
        "http://hl7.org/fhir/StructureDefinition/code";

    MessageSignificanceCategoryCode.Value value = 1;

    String id = 2;

    repeated Extension extension = 3;
  }
  CategoryCode category = 29;

  // Resource(s) that are the subject of the event
  message Focus {
    option (.google.fhir.proto.fhir_path_message_constraint) =
        "max='*' or (max.toInteger() > 0)";

    // Unique id for inter-element referencing
    String id = 1;

    // Additional content defined by implementations
    repeated Extension extension = 2;

    // Extensions that cannot be ignored even if unrecognized
    repeated Extension modifier_extension = 3;

    // Type of resource
    message CodeType {
      option (.google.fhir.proto.structure_definition_kind) =
          KIND_PRIMITIVE_TYPE;
      option (.google.fhir.proto.fhir_valueset_url) =
          "http://hl7.org/fhir/ValueSet/resource-types";
      option (.google.fhir.proto.fhir_profile_base) =
          "http://hl7.org/fhir/StructureDefinition/code";

      ResourceTypeCode.Value value = 1;

      String id = 2;

      repeated Extension extension = 3;
    }
    CodeType code = 4
        [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

    // Profile that must be adhered to by focus
    Canonical profile = 5;

    // Minimum number of focuses of this type
    UnsignedInt min = 6
        [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

    // Maximum number of focuses of this type
    String max = 7;
  }
  repeated Focus focus = 30;

  // always | on-error | never | on-success
  message ResponseRequiredCode {
    option (.google.fhir.proto.structure_definition_kind) = KIND_PRIMITIVE_TYPE;
    option (.google.fhir.proto.fhir_valueset_url) =
        "http://hl7.org/fhir/ValueSet/messageheader-response-request";
    option (.google.fhir.proto.fhir_profile_base) =
        "http://hl7.org/fhir/StructureDefinition/code";

    MessageheaderResponseRequestCode.Value value = 1;

    String id = 2;

    repeated Extension extension = 3;
  }
  ResponseRequiredCode response_required = 31;

  // Responses to this message
  message AllowedResponse {
    // Unique id for inter-element referencing
    String id = 1;

    // Additional content defined by implementations
    repeated Extension extension = 2;

    // Extensions that cannot be ignored even if unrecognized
    repeated Extension modifier_extension = 3;

    // Reference to allowed message definition response
    Canonical message = 4
        [(.google.fhir.proto.validation_requirement) = REQUIRED_BY_FHIR];

    // When should this response be used
    Markdown situation = 5;
  }
  repeated AllowedResponse allowed_response = 32;

  // Canonical reference to a GraphDefinition
  repeated Canonical graph = 33;
}
