# Copyright 2015 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
#
#      http://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.

require 'date'
require 'google/apis/core/base_service'
require 'google/apis/core/json_representation'
require 'google/apis/core/hashable'
require 'google/apis/errors'

module Google
  module Apis
    module YoutubeAnalyticsV2
      
      # Empty response.
      class EmptyResponse
        include Google::Apis::Core::Hashable
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @errors = args[:errors] if args.key?(:errors)
        end
      end
      
      # Describes one specific error.
      class ErrorProto
        include Google::Apis::Core::Hashable
      
        # Error arguments, to be used when building user-friendly error messages given
        # the error domain and code. Different error codes require different arguments.
        # Corresponds to the JSON property `argument`
        # @return [Array<String>]
        attr_accessor :argument
      
        # Error code in the error domain. This should correspond to a value of the enum
        # type whose name is in domain. See the core error domain in error_domain.proto.
        # Corresponds to the JSON property `code`
        # @return [String]
        attr_accessor :code
      
        # Debugging information, which should not be shared externally.
        # Corresponds to the JSON property `debugInfo`
        # @return [String]
        attr_accessor :debug_info
      
        # Error domain. RoSy services can define their own domain and error codes. This
        # should normally be the name of an enum type, such as: gdata.CoreErrorDomain
        # Corresponds to the JSON property `domain`
        # @return [String]
        attr_accessor :domain
      
        # A short explanation for the error, which can be shared outside Google. Please
        # set domain, code and arguments whenever possible instead of this error message
        # so that external APIs can build safe error messages themselves. External
        # messages built in a RoSy interface will most likely refer to information and
        # concepts that are not available externally and should not be exposed. It is
        # safer if external APIs can understand the errors and decide what the error
        # message should look like.
        # Corresponds to the JSON property `externalErrorMessage`
        # @return [String]
        attr_accessor :external_error_message
      
        # Location of the error, as specified by the location type. If location_type is
        # PATH, this should be a path to a field that's relative to the request, using
        # FieldPath notation (net/proto2/util/public/field_path.h). Examples:
        # authenticated_user.gaia_id resource.address[2].country
        # Corresponds to the JSON property `location`
        # @return [String]
        attr_accessor :location
      
        # 
        # Corresponds to the JSON property `locationType`
        # @return [String]
        attr_accessor :location_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @argument = args[:argument] if args.key?(:argument)
          @code = args[:code] if args.key?(:code)
          @debug_info = args[:debug_info] if args.key?(:debug_info)
          @domain = args[:domain] if args.key?(:domain)
          @external_error_message = args[:external_error_message] if args.key?(:external_error_message)
          @location = args[:location] if args.key?(:location)
          @location_type = args[:location_type] if args.key?(:location_type)
        end
      end
      
      # Request Error information. The presence of an error field signals that the
      # operation has failed.
      class Errors
        include Google::Apis::Core::Hashable
      
        # Global error code. Deprecated and ignored. Set custom error codes in
        # ErrorProto.domain and ErrorProto.code instead.
        # Corresponds to the JSON property `code`
        # @return [String]
        attr_accessor :code
      
        # Specific error description and codes
        # Corresponds to the JSON property `error`
        # @return [Array<Google::Apis::YoutubeAnalyticsV2::ErrorProto>]
        attr_accessor :error
      
        # Request identifier generated by the service, which can be used to identify the
        # error in the logs
        # Corresponds to the JSON property `requestId`
        # @return [String]
        attr_accessor :request_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @code = args[:code] if args.key?(:code)
          @error = args[:error] if args.key?(:error)
          @request_id = args[:request_id] if args.key?(:request_id)
        end
      end
      
      # A group.
      class Group
        include Google::Apis::Core::Hashable
      
        # A group's content details.
        # Corresponds to the JSON property `contentDetails`
        # @return [Google::Apis::YoutubeAnalyticsV2::GroupContentDetails]
        attr_accessor :content_details
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        # The Etag of this resource.
        # Corresponds to the JSON property `etag`
        # @return [String]
        attr_accessor :etag
      
        # The ID that YouTube uses to uniquely identify the group.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Identifies the API resource's type. The value will be `youtube#group`.
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        # A group snippet.
        # Corresponds to the JSON property `snippet`
        # @return [Google::Apis::YoutubeAnalyticsV2::GroupSnippet]
        attr_accessor :snippet
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @content_details = args[:content_details] if args.key?(:content_details)
          @errors = args[:errors] if args.key?(:errors)
          @etag = args[:etag] if args.key?(:etag)
          @id = args[:id] if args.key?(:id)
          @kind = args[:kind] if args.key?(:kind)
          @snippet = args[:snippet] if args.key?(:snippet)
        end
      end
      
      # A group's content details.
      class GroupContentDetails
        include Google::Apis::Core::Hashable
      
        # The number of items in the group.
        # Corresponds to the JSON property `itemCount`
        # @return [Fixnum]
        attr_accessor :item_count
      
        # The type of resources that the group contains. Valid values for this property
        # are: * `youtube#channel` * `youtube#playlist` * `youtube#video` * `
        # youtubePartner#asset`
        # Corresponds to the JSON property `itemType`
        # @return [String]
        attr_accessor :item_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @item_count = args[:item_count] if args.key?(:item_count)
          @item_type = args[:item_type] if args.key?(:item_type)
        end
      end
      
      # A group item.
      class GroupItem
        include Google::Apis::Core::Hashable
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        # The Etag of this resource.
        # Corresponds to the JSON property `etag`
        # @return [String]
        attr_accessor :etag
      
        # The ID that YouTube uses to uniquely identify the group that contains the item.
        # Corresponds to the JSON property `groupId`
        # @return [String]
        attr_accessor :group_id
      
        # The ID that YouTube uses to uniquely identify the `channel`, `video`, `
        # playlist`, or `asset` resource that is included in the group. Note that this
        # ID refers specifically to the inclusion of that resource in a particular group
        # and is different than the channel ID, video ID, playlist ID, or asset ID that
        # uniquely identifies the resource itself. The `resource.id` property's value
        # specifies the unique channel, video, playlist, or asset ID.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Identifies the API resource's type. The value will be `youtube#groupItem`.
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        # The `resource` object contains information that identifies the item being
        # added to the group.
        # Corresponds to the JSON property `resource`
        # @return [Google::Apis::YoutubeAnalyticsV2::GroupItemResource]
        attr_accessor :resource
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @errors = args[:errors] if args.key?(:errors)
          @etag = args[:etag] if args.key?(:etag)
          @group_id = args[:group_id] if args.key?(:group_id)
          @id = args[:id] if args.key?(:id)
          @kind = args[:kind] if args.key?(:kind)
          @resource = args[:resource] if args.key?(:resource)
        end
      end
      
      # 
      class GroupItemResource
        include Google::Apis::Core::Hashable
      
        # The channel, video, playlist, or asset ID that YouTube uses to uniquely
        # identify the item that is being added to the group.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Identifies the type of resource being added to the group. Valid values for
        # this property are: * `youtube#channel` * `youtube#playlist` * `youtube#video` *
        # `youtubePartner#asset`
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @kind = args[:kind] if args.key?(:kind)
        end
      end
      
      # A group snippet.
      class GroupSnippet
        include Google::Apis::Core::Hashable
      
        # The date and time that the group was created. The value is specified in ISO
        # 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
        # Corresponds to the JSON property `publishedAt`
        # @return [String]
        attr_accessor :published_at
      
        # The group name. The value must be a non-empty string.
        # Corresponds to the JSON property `title`
        # @return [String]
        attr_accessor :title
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @published_at = args[:published_at] if args.key?(:published_at)
          @title = args[:title] if args.key?(:title)
        end
      end
      
      # Response message for GroupsService.ListGroupItems.
      class ListGroupItemsResponse
        include Google::Apis::Core::Hashable
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        # The Etag of this resource.
        # Corresponds to the JSON property `etag`
        # @return [String]
        attr_accessor :etag
      
        # A list of groups that match the API request parameters. Each item in the list
        # represents a `groupItem` resource.
        # Corresponds to the JSON property `items`
        # @return [Array<Google::Apis::YoutubeAnalyticsV2::GroupItem>]
        attr_accessor :items
      
        # Identifies the API resource's type. The value will be `youtube#
        # groupItemListResponse`.
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @errors = args[:errors] if args.key?(:errors)
          @etag = args[:etag] if args.key?(:etag)
          @items = args[:items] if args.key?(:items)
          @kind = args[:kind] if args.key?(:kind)
        end
      end
      
      # Response message for GroupsService.ListGroups.
      class ListGroupsResponse
        include Google::Apis::Core::Hashable
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        # The Etag of this resource.
        # Corresponds to the JSON property `etag`
        # @return [String]
        attr_accessor :etag
      
        # A list of groups that match the API request parameters. Each item in the list
        # represents a `group` resource.
        # Corresponds to the JSON property `items`
        # @return [Array<Google::Apis::YoutubeAnalyticsV2::Group>]
        attr_accessor :items
      
        # Identifies the API resource's type. The value will be `youtube#
        # groupListResponse`.
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        # The token that can be used as the value of the `pageToken` parameter to
        # retrieve the next page in the result set.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @errors = args[:errors] if args.key?(:errors)
          @etag = args[:etag] if args.key?(:etag)
          @items = args[:items] if args.key?(:items)
          @kind = args[:kind] if args.key?(:kind)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # Response message for TargetedQueriesService.Query.
      class QueryResponse
        include Google::Apis::Core::Hashable
      
        # This value specifies information about the data returned in the `rows` fields.
        # Each item in the `columnHeaders` list identifies a field returned in the `rows`
        # value, which contains a list of comma-delimited data. The `columnHeaders`
        # list will begin with the dimensions specified in the API request, which will
        # be followed by the metrics specified in the API request. The order of both
        # dimensions and metrics will match the ordering in the API request. For example,
        # if the API request contains the parameters `dimensions=ageGroup,gender&
        # metrics=viewerPercentage`, the API response will return columns in this order:
        # `ageGroup`, `gender`, `viewerPercentage`.
        # Corresponds to the JSON property `columnHeaders`
        # @return [Array<Google::Apis::YoutubeAnalyticsV2::ResultTableColumnHeader>]
        attr_accessor :column_headers
      
        # Request Error information. The presence of an error field signals that the
        # operation has failed.
        # Corresponds to the JSON property `errors`
        # @return [Google::Apis::YoutubeAnalyticsV2::Errors]
        attr_accessor :errors
      
        # This value specifies the type of data included in the API response. For the
        # query method, the kind property value will be `youtubeAnalytics#resultTable`.
        # Corresponds to the JSON property `kind`
        # @return [String]
        attr_accessor :kind
      
        # The list contains all rows of the result table. Each item in the list is an
        # array that contains comma-delimited data corresponding to a single row of data.
        # The order of the comma-delimited data fields will match the order of the
        # columns listed in the `columnHeaders` field. If no data is available for the
        # given query, the `rows` element will be omitted from the response. The
        # response for a query with the `day` dimension will not contain rows for the
        # most recent days.
        # Corresponds to the JSON property `rows`
        # @return [Array<Array<Object>>]
        attr_accessor :rows
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @column_headers = args[:column_headers] if args.key?(:column_headers)
          @errors = args[:errors] if args.key?(:errors)
          @kind = args[:kind] if args.key?(:kind)
          @rows = args[:rows] if args.key?(:rows)
        end
      end
      
      # The description of a column of the result table.
      class ResultTableColumnHeader
        include Google::Apis::Core::Hashable
      
        # The type of the column (`DIMENSION` or `METRIC`).
        # Corresponds to the JSON property `columnType`
        # @return [String]
        attr_accessor :column_type
      
        # The type of the data in the column (`STRING`, `INTEGER`, `FLOAT`, etc.).
        # Corresponds to the JSON property `dataType`
        # @return [String]
        attr_accessor :data_type
      
        # The name of the dimension or metric.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @column_type = args[:column_type] if args.key?(:column_type)
          @data_type = args[:data_type] if args.key?(:data_type)
          @name = args[:name] if args.key?(:name)
        end
      end
    end
  end
end