// Copyright 2024 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.marketingplatform.admin.v1alpha;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/marketingplatform/admin/v1alpha/resources.proto";
import "google/protobuf/empty.proto";

option csharp_namespace = "Google.Marketingplatform.Admin.V1Alpha";
option go_package = "google.golang.org/genproto/googleapis/marketingplatform/admin/v1alpha;admin";
option java_multiple_files = true;
option java_outer_classname = "MarketingplatformAdminProto";
option java_package = "com.google.marketingplatform.admin.v1alpha";
option php_namespace = "Google\\Marketingplatform\\Admin\\V1alpha";
option ruby_package = "Google::Marketingplatform::AdminService::V1alpha";
option (google.api.resource_definition) = {
  type: "analyticsadmin.googleapis.com/Property"
  pattern: "properties/{property}"
};

// Service Interface for the Google Marketing Platform Admin API.
service MarketingplatformAdminService {
  option (google.api.default_host) = "marketingplatformadmin.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/marketingplatformadmin.analytics.read,"
      "https://www.googleapis.com/auth/marketingplatformadmin.analytics.update";

  // Lookup for a single organization.
  rpc GetOrganization(GetOrganizationRequest) returns (Organization) {
    option (google.api.http) = {
      get: "/v1alpha/{name=organizations/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists the Google Analytics accounts link to the specified Google Marketing
  // Platform organization.
  rpc ListAnalyticsAccountLinks(ListAnalyticsAccountLinksRequest)
      returns (ListAnalyticsAccountLinksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=organizations/*}/analyticsAccountLinks"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates the link between the Analytics account and the Google Marketing
  // Platform organization.
  //
  // User needs to be an org user, and admin on the Analytics account to create
  // the link. If the account is already linked to an organization, user needs
  // to unlink the account from the current organization, then try link again.
  rpc CreateAnalyticsAccountLink(CreateAnalyticsAccountLinkRequest)
      returns (AnalyticsAccountLink) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=organizations/*}/analyticsAccountLinks"
      body: "analytics_account_link"
    };
    option (google.api.method_signature) = "parent,analytics_account_link";
  }

  // Deletes the AnalyticsAccountLink, which detaches the Analytics account from
  // the Google Marketing Platform organization.
  //
  // User needs to be an org user, and admin on the Analytics account in order
  // to delete the link.
  rpc DeleteAnalyticsAccountLink(DeleteAnalyticsAccountLinkRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=organizations/*/analyticsAccountLinks/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates the service level for an Analytics property.
  rpc SetPropertyServiceLevel(SetPropertyServiceLevelRequest)
      returns (SetPropertyServiceLevelResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{analytics_account_link=organizations/*/analyticsAccountLinks/*}:setPropertyServiceLevel"
      body: "*"
    };
    option (google.api.method_signature) = "analytics_account_link";
  }
}

// Various levels of service for Google Analytics.
enum AnalyticsServiceLevel {
  // Service level unspecified.
  ANALYTICS_SERVICE_LEVEL_UNSPECIFIED = 0;

  // The standard version of Google Analytics.
  ANALYTICS_SERVICE_LEVEL_STANDARD = 1;

  // The premium version of Google Analytics.
  ANALYTICS_SERVICE_LEVEL_360 = 2;
}

// Request message for GetOrganization RPC.
message GetOrganizationRequest {
  // Required. The name of the Organization to retrieve.
  // Format: organizations/{org_id}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "marketingplatformadmin.googleapis.com/Organization"
    }
  ];
}

// Request message for ListAnalyticsAccountLinks RPC.
message ListAnalyticsAccountLinksRequest {
  // Required. The parent organization, which owns this collection of Analytics
  // account links. Format: organizations/{org_id}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "marketingplatformadmin.googleapis.com/AnalyticsAccountLink"
    }
  ];

  // Optional. The maximum number of Analytics account links to return in one
  // call. The service may return fewer than this value.
  //
  // If unspecified, at most 50 Analytics account links will be returned. The
  // maximum value is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous ListAnalyticsAccountLinks
  // call. Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to
  // `ListAnalyticsAccountLinks` must match the call that provided the page
  // token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for ListAnalyticsAccountLinks RPC.
message ListAnalyticsAccountLinksResponse {
  // Analytics account links in this organization.
  repeated AnalyticsAccountLink analytics_account_links = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for CreateAnalyticsAccountLink RPC.
message CreateAnalyticsAccountLinkRequest {
  // Required. The parent resource where this Analytics account link will be
  // created. Format: organizations/{org_id}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "marketingplatformadmin.googleapis.com/AnalyticsAccountLink"
    }
  ];

  // Required. The Analytics account link to create.
  AnalyticsAccountLink analytics_account_link = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteAnalyticsAccountLink RPC.
message DeleteAnalyticsAccountLinkRequest {
  // Required. The name of the Analytics account link to delete.
  // Format:
  // organizations/{org_id}/analyticsAccountLinks/{analytics_account_link_id}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "marketingplatformadmin.googleapis.com/AnalyticsAccountLink"
    }
  ];
}

// Request message for SetPropertyServiceLevel RPC.
message SetPropertyServiceLevelRequest {
  // Required. The parent AnalyticsAccountLink scope where this property is in.
  // Format:
  // organizations/{org_id}/analyticsAccountLinks/{analytics_account_link_id}
  string analytics_account_link = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The Analytics property to change the ServiceLevel setting. This
  // field is the name of the Google Analytics Admin API property resource.
  //
  // Format: analyticsadmin.googleapis.com/properties/{property_id}
  string analytics_property = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Property"
    }
  ];

  // Required. The service level to set for this property.
  AnalyticsServiceLevel service_level = 3
      [(google.api.field_behavior) = REQUIRED];
}

// Response message for SetPropertyServiceLevel RPC.
message SetPropertyServiceLevelResponse {}
