# Copyright 2017 Google LLC
#
# 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.

module Google
  module Firestore
    module V1beta1
      # A Firestore document.
      #
      # Must not exceed 1 MiB - 4 bytes.
      # @!attribute [rw] name
      #   @return [String]
      #     The resource name of the document, for example
      #     +projects/{project_id}/databases/{database_id}/documents/{document_path}+.
      # @!attribute [rw] fields
      #   @return [Hash{String => Google::Firestore::V1beta1::Value}]
      #     The document's fields.
      #
      #     The map keys represent field names.
      #
      #     A simple field name contains only characters +a+ to +z+, +A+ to +Z+,
      #     +0+ to +9+, or +_+, and must not start with +0+ to +9+ or +_+. For example,
      #     +foo_bar_17+.
      #
      #     Field names matching the regular expression +__.*__+ are reserved. Reserved
      #     field names are forbidden except in certain documented contexts. The map
      #     keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be
      #     empty.
      #
      #     Field paths may be used in other contexts to refer to structured fields
      #     defined here. For +map_value+, the field path is represented by the simple
      #     or quoted field names of the containing fields, delimited by +.+. For
      #     example, the structured field
      #     +"foo" : { map_value: { "x&y" : { string_value: "hello" }}}+ would be
      #     represented by the field path +foo.x&y+.
      #
      #     Within a field path, a quoted field name starts and ends with + + + and
      #     may contain any character. Some characters, including + + +, must be
      #     escaped using a +\+. For example, + +x&y+ + represents +x&y+ and
      #     + +bak\+tik+ + represents + bak+tik +.
      # @!attribute [rw] create_time
      #   @return [Google::Protobuf::Timestamp]
      #     Output only. The time at which the document was created.
      #
      #     This value increases monotonically when a document is deleted then
      #     recreated. It can also be compared to values from other documents and
      #     the +read_time+ of a query.
      # @!attribute [rw] update_time
      #   @return [Google::Protobuf::Timestamp]
      #     Output only. The time at which the document was last changed.
      #
      #     This value is initally set to the +create_time+ then increases
      #     monotonically with each change to the document. It can also be
      #     compared to values from other documents and the +read_time+ of a query.
      class Document; end

      # A message that can hold any of the supported value types.
      # @!attribute [rw] null_value
      #   @return [Google::Protobuf::NullValue]
      #     A null value.
      # @!attribute [rw] boolean_value
      #   @return [true, false]
      #     A boolean value.
      # @!attribute [rw] integer_value
      #   @return [Integer]
      #     An integer value.
      # @!attribute [rw] double_value
      #   @return [Float]
      #     A double value.
      # @!attribute [rw] timestamp_value
      #   @return [Google::Protobuf::Timestamp]
      #     A timestamp value.
      #
      #     Precise only to microseconds. When stored, any additional precision is
      #     rounded down.
      # @!attribute [rw] string_value
      #   @return [String]
      #     A string value.
      #
      #     The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes.
      #     Only the first 1,500 bytes of the UTF-8 representation are considered by
      #     queries.
      # @!attribute [rw] bytes_value
      #   @return [String]
      #     A bytes value.
      #
      #     Must not exceed 1 MiB - 89 bytes.
      #     Only the first 1,500 bytes are considered by queries.
      # @!attribute [rw] reference_value
      #   @return [String]
      #     A reference to a document. For example:
      #     +projects/{project_id}/databases/{database_id}/documents/{document_path}+.
      # @!attribute [rw] geo_point_value
      #   @return [Google::Type::LatLng]
      #     A geo point value representing a point on the surface of Earth.
      # @!attribute [rw] array_value
      #   @return [Google::Firestore::V1beta1::ArrayValue]
      #     An array value.
      #
      #     Cannot contain another array value.
      # @!attribute [rw] map_value
      #   @return [Google::Firestore::V1beta1::MapValue]
      #     A map value.
      class Value; end

      # An array value.
      # @!attribute [rw] values
      #   @return [Array<Google::Firestore::V1beta1::Value>]
      #     Values in the array.
      class ArrayValue; end

      # A map value.
      # @!attribute [rw] fields
      #   @return [Hash{String => Google::Firestore::V1beta1::Value}]
      #     The map's fields.
      #
      #     The map keys represent field names. Field names matching the regular
      #     expression +__.*__+ are reserved. Reserved field names are forbidden except
      #     in certain documented contexts. The map keys, represented as UTF-8, must
      #     not exceed 1,500 bytes and cannot be empty.
      class MapValue; end
    end
  end
end