// Copyright 2020 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";
import "google/protobuf/wrappers.proto";

option go_package = "google.golang.org/genproto/googleapis/analytics/admin/v1alpha;admin";
option java_multiple_files = true;
option java_outer_classname = "ResourcesProto";
option java_package = "com.google.analytics.admin.v1alpha";

// A resource message representing a Google Analytics account.
message Account {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/Account"
    pattern: "accounts/{account}"
  };

  // Output only. Resource name of this account.
  // Format: accounts/{account}
  // Example: "accounts/100"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this account was originally created.
  google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when account payload fields were last updated.
  google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Human-readable display name for this account.
  string display_name = 4 [(google.api.field_behavior) = REQUIRED];

  // Country of business. Must be a non-deprecated code for a UN M.49 region.
  // https://unicode.org/cldr/charts/latest/supplemental/territory_containment_un_m_49.html
  string country_code = 5;

  // Output only. Indicates whether this Account is soft-deleted or not. Deleted
  // accounts are excluded from List results unless specifically requested.
  bool deleted = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

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

  // Output only. Resource name of this property.
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when the entity was originally created.
  google.protobuf.Timestamp create_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when entity payload fields were last updated.
  google.protobuf.Timestamp update_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Resource name of this property's logical parent.
  //
  // Note: The Property-Moving UI can be used to change the parent.
  // Format: accounts/{account}
  // Example: "accounts/100"
  string parent = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Required. Human-readable display name for this property.
  //
  // The max allowed display name length is 100 UTF-16 code units.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Industry associated with this property
  // Example: AUTOMOTIVE, FOOD_AND_DRINK
  IndustryCategory industry_category = 6;

  // Reporting Time Zone, used as the day boundary for reports, regardless of
  // where the data originates. If the time zone honors DST, Analytics will
  // automatically adjust for the changes.
  //
  // NOTE: Changing the time zone only affects data going forward, and is not
  // applied retroactively.
  //
  // Format: https://www.iana.org/time-zones
  // Example: "America/Los_Angeles"
  string time_zone = 7;

  // The currency type used in reports involving monetary values.
  //
  //
  // Format: https://en.wikipedia.org/wiki/ISO_4217
  // Examples: "USD", "EUR", "JPY"
  string currency_code = 8;

  // Output only. Indicates whether this Property is soft-deleted or not. Deleted properties
  // are excluded from List results unless specifically requested.
  bool deleted = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A resource message representing a Google Analytics Android app stream.
message AndroidAppDataStream {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AndroidAppDataStream"
    pattern: "properties/{property}/androidAppDataStreams/{android_app_data_stream}"
  };

  // Output only. Resource name of this Data Stream.
  // Format: properties/{property_id}/androidAppDataStreams/{stream_id}
  // Example: "properties/1000/androidAppDataStreams/2000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the corresponding Android app in Firebase, if any.
  // This ID can change if the Android app is deleted and recreated.
  string firebase_app_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this stream was originally created.
  google.protobuf.Timestamp create_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when stream payload fields were last updated.
  google.protobuf.Timestamp update_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The package name for the app being measured.
  // Example: "com.example.myandroidapp"
  string package_name = 5 [(google.api.field_behavior) = IMMUTABLE];

  // Human-readable display name for the Data Stream.
  //
  // The max allowed display name length is 255 UTF-16 code units.
  string display_name = 6;
}

// A resource message representing a Google Analytics IOS app stream.
message IosAppDataStream {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/IosAppDataStream"
    pattern: "properties/{property}/iosAppDataStreams/{ios_app_data_stream}"
  };

  // Output only. Resource name of this Data Stream.
  // Format: properties/{property_id}/iosAppDataStreams/{stream_id}
  // Example: "properties/1000/iosAppDataStreams/2000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the corresponding iOS app in Firebase, if any.
  // This ID can change if the iOS app is deleted and recreated.
  string firebase_app_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this stream was originally created.
  google.protobuf.Timestamp create_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when stream payload fields were last updated.
  google.protobuf.Timestamp update_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Immutable. The Apple App Store Bundle ID for the app
  // Example: "com.example.myiosapp"
  string bundle_id = 5 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.field_behavior) = REQUIRED
  ];

  // Human-readable display name for the Data Stream.
  //
  // The max allowed display name length is 255 UTF-16 code units.
  string display_name = 6;
}

// A resource message representing a Google Analytics web stream.
message WebDataStream {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/WebDataStream"
    pattern: "properties/{property}/webDataStreams/{web_data_stream}"
  };

  // Output only. Resource name of this Data Stream.
  // Format: properties/{property_id}/webDataStreams/{stream_id}
  // Example: "properties/1000/webDataStreams/2000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Analytics "Measurement ID", without the "G-" prefix.
  // Example: "G-1A2BCD345E" would just be "1A2BCD345E"
  string measurement_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the corresponding web app in Firebase, if any.
  // This ID can change if the web app is deleted and recreated.
  string firebase_app_id = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this stream was originally created.
  google.protobuf.Timestamp create_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when stream payload fields were last updated.
  google.protobuf.Timestamp update_time = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Domain name of the web app being measured, or empty.
  // Example: "http://www.google.com", "https://www.google.com"
  string default_uri = 6 [(google.api.field_behavior) = IMMUTABLE];

  // Required. Human-readable display name for the Data Stream.
  //
  // The max allowed display name length is 100 UTF-16 code units.
  string display_name = 7 [(google.api.field_behavior) = REQUIRED];
}

// A resource message representing a user's permissions on an Account or
// Property resource.
message UserLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/UserLink"
    pattern: "accounts/{account}/userLinks/{user_link}"
    pattern: "properties/{property}/userLinks/{user_link}"
  };

  // Example format: properties/1234/userLinks/5678
  string name = 1;

  // Email address of the user to link
  string email_address = 2;

  // Roles directly assigned to this user for this account or property.
  //
  // Valid values:
  // predefinedRoles/read
  // predefinedRoles/collaborate
  // predefinedRoles/edit
  // predefinedRoles/manage-users
  //
  // Excludes roles that are inherited from a higher-level entity, group,
  // or organization admin role.
  //
  // A UserLink that is updated to have an empty list of direct_roles will be
  // deleted.
  repeated string direct_roles = 3;
}

// Read-only resource used to summarize a principal's effective roles.
message AuditUserLink {
  // Example format: properties/1234/userLinks/5678
  string name = 1;

  // Email address of the linked user
  string email_address = 2;

  // Roles directly assigned to this user for this entity.
  //
  // Format: predefinedRoles/read
  //
  // Excludes roles that are inherited from an account (if this is for a
  // property), group, or organization admin role.
  repeated string direct_roles = 3;

  // Union of all permissions a user has at this account or property (includes
  // direct permissions, group-inherited permissions, etc.).
  //
  // Format: predefinedRoles/read
  repeated string effective_roles = 4;
}

// Singleton resource under a WebDataStream, configuring measurement of
// additional site interactions and content.
message EnhancedMeasurementSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/EnhancedMeasurementSettings"
    pattern: "properties/{property}/webDataStreams/{web_data_stream}/enhancedMeasurementSettings"
  };

  // Output only. Resource name of this Data Stream.
  // Format:
  // properties/{property_id}/webDataStreams/{stream_id}/enhancedMeasurementSettings
  // Example: "properties/1000/webDataStreams/2000/enhancedMeasurementSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Indicates whether Enhanced Measurement Settings will be used to
  // automatically measure interactions and content on this web stream.
  //
  // Changing this value does not affect the settings themselves, but determines
  // whether they are respected.
  bool stream_enabled = 2;

  // Output only. If enabled, capture a page view event each time a page loads or the
  // website changes the browser history state.
  bool page_views_enabled = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // If enabled, capture scroll events each time a visitor gets to the bottom of
  // a page.
  bool scrolls_enabled = 4;

  // If enabled, capture an outbound click event each time a visitor clicks a
  // link that leads them away from your domain.
  bool outbound_clicks_enabled = 5;

  // Capture events when your visitors view content on your site that has
  // structured data (eg, articles, blog posts, product details screens, etc.).
  bool content_views_enabled = 6;

  // If enabled, capture a view search results event each time a visitor
  // performs a search on your site (based on a query parameter).
  bool site_search_enabled = 7;

  // If enabled, capture a view search results event each time a visitor
  // interacts with a form on your site.
  bool form_interactions_enabled = 8;

  // If enabled, capture video play, progress, and complete events as visitors
  // view embedded videos on your site.
  bool video_engagement_enabled = 9;

  // If enabled, capture a file download event each time a link is clicked with
  // a common document, compressed file, application, video, or audio extension.
  bool file_downloads_enabled = 10;

  // If enabled, capture a click event each time a visitor clicks a link or
  // element that has data attributes beginning with "data-ga".
  bool data_tagged_element_clicks_enabled = 11;

  // If enabled, capture a page view event each time a page loads.
  bool page_loads_enabled = 12;

  // If enabled, capture a page view event each time the website changes the
  // browser history state.
  bool page_changes_enabled = 13;

  // Capture events when your visitors view content on your site that has
  // articles or blog posts.
  bool articles_and_blogs_enabled = 14;

  // Capture events when your visitors view content on your site that has
  // product details screens, etc.
  bool products_and_ecommerce_enabled = 15;

  // Required. URL query parameters to interpret as site search parameters.
  // Max length is 1024 characters. Must not be empty.
  string search_query_parameter = 16 [(google.api.field_behavior) = REQUIRED];

  // Additional URL query parameters.
  // Max length is 1024 characters.
  string url_query_parameter = 17;

  // Domains to exclude from measurement. Max length is 1024 characters.
  string excluded_domains = 18;
}

// A link between an GA4 property and a Firebase project.
message FirebaseLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/FirebaseLink"
    pattern: "properties/{property}/firebaseLinks/{firebase_link}"
  };

  // Output only. Example format: properties/1234/firebaseLinks/5678
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Firebase project resource name. When creating a FirebaseLink, you may
  // provide this resource name using either a project number or project ID.
  // Once this resource has been created, returned FirebaseLinks will always
  // have a project_name that contains a project number.
  //
  // Format: 'projects/{project number}'
  // Example: 'projects/1234'
  string project = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when this FirebaseLink was originally created.
  google.protobuf.Timestamp create_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Maximum user access to the GA4 property allowed to admins of
  // the linked Firebase project.
  MaximumUserAccess maximum_user_access = 4;
}

// Read-only resource with the tag for sending data from a website to a
// WebDataStream.
message GlobalSiteTag {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/GlobalSiteTag"
    pattern: "properties/{property}/globalSiteTag"
  };

  // Immutable. JavaScript code snippet to be pasted as the first item into the head tag of
  // every webpage to measure.
  string snippet = 1 [(google.api.field_behavior) = IMMUTABLE];
}

// A link between an GA4 property and a Google Ads account.
message GoogleAdsLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/GoogleAdsLink"
    pattern: "properties/{property}/googleAdsLinks/{google_ads_link}"
  };

  // Output only. Format: properties/{propertyId}/googleAdsLinks/{googleAdsLinkId}
  //
  // Note: googleAdsLinkId is not the Google Ads customer ID.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Format: properties/{propertyId}
  string parent = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Google Ads customer ID.
  string customer_id = 3 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. If true, this link is for a Google Ads manager account.
  bool can_manage_clients = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Enable personalized advertising features with this integration.
  // Automatically publish my Google Analytics audience lists and Google
  // Analytics remarketing events/parameters to the linked Google Ads account.
  // If this field is not set on create/update it will be defaulted to true.
  google.protobuf.BoolValue ads_personalization_enabled = 5;

  // Output only. Email address of the user that created the link.
  // An empty string will be returned if the email address can't be retrieved.
  string email_address = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this link was originally created.
  google.protobuf.Timestamp create_time = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this link was last updated.
  google.protobuf.Timestamp update_time = 8 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A resource message representing data sharing settings of a Google Analytics
// account.
message DataSharingSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DataSharingSettings"
    pattern: "accounts/{account}/dataSharingSettings"
  };

  // Output only. Resource name.
  // Format: accounts/{account}/dataSharingSettings
  // Example: "accounts/1000/dataSharingSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Allows Google support to access the data in order to help troubleshoot
  // issues.
  bool sharing_with_google_support_enabled = 2;

  // Allows Google sales teams that are assigned to the customer to access the
  // data in order to suggest configuration changes to improve results.
  // Sales team restrictions still apply when enabled.
  bool sharing_with_google_assigned_sales_enabled = 3;

  // Allows any of Google sales to access the data in order to suggest
  // configuration changes to improve results.
  bool sharing_with_google_any_sales_enabled = 4;

  // Allows Google to use the data to improve other Google products or services.
  bool sharing_with_google_products_enabled = 5;

  // Allows Google to share the data anonymously in aggregate form with others.
  bool sharing_with_others_enabled = 6;
}

// The category selected for this property, used for industry benchmarking.
enum IndustryCategory {
  // Industry category unspecified
  INDUSTRY_CATEGORY_UNSPECIFIED = 0;

  // Automotive
  AUTOMOTIVE = 1;

  // Business and industrial markets
  BUSINESS_AND_INDUSTRIAL_MARKETS = 2;

  // Finance
  FINANCE = 3;

  // Healthcare
  HEALTHCARE = 4;

  // Technology
  TECHNOLOGY = 5;

  // Travel
  TRAVEL = 6;

  // Other
  OTHER = 7;

  // Arts and entertainment
  ARTS_AND_ENTERTAINMENT = 8;

  // Beauty and fitness
  BEAUTY_AND_FITNESS = 9;

  // Books and literature
  BOOKS_AND_LITERATURE = 10;

  // Food and drink
  FOOD_AND_DRINK = 11;

  // Games
  GAMES = 12;

  // Hobbies and leisure
  HOBBIES_AND_LEISURE = 13;

  // Home and garden
  HOME_AND_GARDEN = 14;

  // Internet and telecom
  INTERNET_AND_TELECOM = 15;

  // Law and government
  LAW_AND_GOVERNMENT = 16;

  // News
  NEWS = 17;

  // Online communities
  ONLINE_COMMUNITIES = 18;

  // People and society
  PEOPLE_AND_SOCIETY = 19;

  // Pets and animals
  PETS_AND_ANIMALS = 20;

  // Real estate
  REAL_ESTATE = 21;

  // Reference
  REFERENCE = 22;

  // Science
  SCIENCE = 23;

  // Sports
  SPORTS = 24;

  // Jobs and education
  JOBS_AND_EDUCATION = 25;

  // Shopping
  SHOPPING = 26;
}

// Maximum access settings that Firebase user receive on the linked Analytics
// property.
enum MaximumUserAccess {
  // Unspecified maximum user access.
  MAXIMUM_USER_ACCESS_UNSPECIFIED = 0;

  // Firebase users have no access to the Analytics property.
  NO_ACCESS = 1;

  // Firebase users have Read & Analyze access to the Analytics property.
  READ_AND_ANALYZE = 2;

  // Firebase users have edit access to the Analytics property, but may not
  // manage the Firebase link.
  EDITOR_WITHOUT_LINK_MANAGEMENT = 3;

  // Firebase users have edit access to the Analytics property and may manage
  // the Firebase link.
  EDITOR_INCLUDING_LINK_MANAGEMENT = 4;
}

// A virtual resource representing an overview of an account and
// all its child GA4 properties.
message AccountSummary {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AccountSummary"
    pattern: "accountSummaries/{account_summary}"
  };

  // Resource name for this account summary.
  // Format: accountSummaries/{account_id}
  // Example: "accountSummaries/1000"
  string name = 1;

  // Resource name of account referred to by this account summary
  // Format: accounts/{account_id}
  // Example: "accounts/1000"
  string account = 2 [(google.api.resource_reference) = {
                        type: "analyticsadmin.googleapis.com/Account"
                      }];

  // Display name for the account referred to in this account summary.
  string display_name = 3;

  // List of summaries for child accounts of this account.
  repeated PropertySummary property_summaries = 4;
}

// A virtual resource representing metadata for an GA4 property.
message PropertySummary {
  // Resource name of property referred to by this property summary
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string property = 1 [(google.api.resource_reference) = {
                         type: "analyticsadmin.googleapis.com/Property"
                       }];

  // Display name for the property referred to in this account summary.
  string display_name = 2;
}
