// Copyright 2023 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
//
//     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.

syntax = "proto3";

package google.analytics.admin.v1alpha;

import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/timestamp.proto";

option go_package = "cloud.google.com/go/analytics/admin/apiv1alpha/adminpb;adminpb";
option java_multiple_files = true;
option java_outer_classname = "ExpandedDataSetProto";
option java_package = "com.google.analytics.admin.v1alpha";

// A specific filter for a single dimension
message ExpandedDataSetFilter {
  // A filter for a string-type dimension that matches a particular pattern.
  message StringFilter {
    // The match type for the string filter.
    enum MatchType {
      // Unspecified
      MATCH_TYPE_UNSPECIFIED = 0;

      // Exact match of the string value.
      EXACT = 1;

      // Contains the string value.
      CONTAINS = 2;
    }

    // Required. The match type for the string filter.
    MatchType match_type = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The string value to be matched against.
    string value = 2 [(google.api.field_behavior) = REQUIRED];

    // Optional. If true, the match is case-sensitive. If false, the match is
    // case-insensitive.
    // Must be true when match_type is EXACT.
    // Must be false when match_type is CONTAINS.
    bool case_sensitive = 3 [(google.api.field_behavior) = OPTIONAL];
  }

  // A filter for a string dimension that matches a particular list of options.
  message InListFilter {
    // Required. The list of possible string values to match against. Must be
    // non-empty.
    repeated string values = 1 [(google.api.field_behavior) = REQUIRED];

    // Optional. If true, the match is case-sensitive. If false, the match is
    // case-insensitive.
    // Must be true.
    bool case_sensitive = 2 [(google.api.field_behavior) = OPTIONAL];
  }

  // One of the above filters.
  oneof one_filter {
    // A filter for a string-type dimension that matches a particular pattern.
    StringFilter string_filter = 2;

    // A filter for a string dimension that matches a particular list of
    // options.
    InListFilter in_list_filter = 3;
  }

  // Required. The dimension name to filter.
  string field_name = 1 [(google.api.field_behavior) = REQUIRED];
}

// A logical expression of EnhancedDataSet dimension filters.
message ExpandedDataSetFilterExpression {
  // The expression applied to a filter.
  oneof expr {
    // A list of expressions to be AND’ed together. It must contain a
    // ExpandedDataSetFilterExpression with either not_expression or
    // dimension_filter. This must be set for the top level
    // ExpandedDataSetFilterExpression.
    ExpandedDataSetFilterExpressionList and_group = 1;

    // A filter expression to be NOT'ed (that is, inverted, complemented). It
    // must include a dimension_filter. This cannot be set on the
    // top level ExpandedDataSetFilterExpression.
    ExpandedDataSetFilterExpression not_expression = 2;

    // A filter on a single dimension. This cannot be set on the top
    // level ExpandedDataSetFilterExpression.
    ExpandedDataSetFilter filter = 3;
  }
}

// A list of ExpandedDataSet filter expressions.
message ExpandedDataSetFilterExpressionList {
  // A list of ExpandedDataSet filter expressions.
  repeated ExpandedDataSetFilterExpression filter_expressions = 1;
}

// A resource message representing a GA4 ExpandedDataSet.
message ExpandedDataSet {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/ExpandedDataSet"
    pattern: "properties/{property}/expandedDataSets/{expanded_data_set}"
  };

  // Output only. The resource name for this ExpandedDataSet resource.
  // Format: properties/{property_id}/expandedDataSets/{expanded_data_set}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The display name of the ExpandedDataSet.
  // Max 200 chars.
  string display_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. The description of the ExpandedDataSet.
  // Max 50 chars.
  string description = 3 [(google.api.field_behavior) = OPTIONAL];

  // Immutable. The list of dimensions included in the ExpandedDataSet.
  // See the [API
  // Dimensions](https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema#dimensions)
  // for the list of dimension names.
  repeated string dimension_names = 4 [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. The list of metrics included in the ExpandedDataSet.
  // See the [API
  // Metrics](https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema#metrics)
  // for the list of dimension names.
  repeated string metric_names = 5 [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. A logical expression of ExpandedDataSet filters applied to
  // dimension included in the ExpandedDataSet. This filter is used to reduce
  // the number of rows and thus the chance of encountering `other` row.
  ExpandedDataSetFilterExpression dimension_filter_expression = 6
      [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when expanded data set began (or will begin) collecing
  // data.
  google.protobuf.Timestamp data_collection_start_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];
}
