syntax = "proto3";

package integration.v1;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

option go_package = "github.com/tidbcloud/metrics-integration/global/api/integration/v1";

// Third-party integration service
// Please refer to style guide: https://developers.google.com/protocol-buffers/docs/style#enums
enum IntegrationType {
  INTEGRATION_TYPE_UNSPECIFIED = 0;
  INTEGRATION_TYPE_DATADOG = 1;
  INTEGRATION_TYPE_PROMETHEUS = 2;
  INTEGRATION_TYPE_NEWRELIC = 3;
}

enum IntegrationPayload {
  INTEGRATION_PAYLOAD_UNSPECIFIED = 0;
  INTEGRATION_PAYLOAD_METRICS = 1;
  INTEGRATION_PAYLOAD_LOGS = 2;
  INTEGRATION_PAYLOAD_TRACES = 3;
}

enum DatadogSite {
  DATADOG_SITE_UNSPECIFIED = 0;
  DATADOG_SITE_US1 = 1;
  DATADOG_SITE_US3 = 2;
  DATADOG_SITE_US5 = 3;
  DATADOG_SITE_EU1 = 4;
  DATADOG_SITE_US1_FED = 5;
  DATADOG_SITE_AP1 = 6;
  DATADOG_SITE_AP2 = 7;
}

enum NewrelicSite {
  NEWRELIC_SITE_UNSPECIFIED = 0;
  NEWRELIC_SITE_US_OTLP = 1;
  NEWRELIC_SITE_EU_OTLP = 2;
}

enum IntegrationStatus {
  INTEGRATION_STATUS_UNSPECIFIED = 0;
  INTEGRATION_STATUS_NONE = 1;
  INTEGRATION_STATUS_ACTIVE = 2;
  INTEGRATION_STATUS_ERROR = 3;
}

enum CloudProvider {
  CLOUD_PROVIDER_UNSPECIFIED = 0;
  CLOUD_PROVIDER_AWS = 1; // Amazon Web Services
  CLOUD_PROVIDER_GCP = 2; // Google Cloud Platform
  CLOUD_PROVIDER_AZURE = 3; // Microsoft Azure
  CLOUD_PROVIDER_ALIBABA = 4; // Alibaba Cloud
  CLOUD_PROVIDER_LOCAL = 5; // Local or on-premises
}

message CreateIntegrationRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  string region = 4;
  CloudProvider cloudprovider = 5; // Cloud provider (required)
  IntegrationType type = 6;
  repeated IntegrationPayload payloads = 7;
  string datadog_api_key = 8;
  DatadogSite datadog_site = 9;
  string newrelic_api_key = 10;
  NewrelicSite newrelic_site = 11;
}

message UpdateIntegrationRequest {
  uint64 id = 1; // Integration ID
  uint64 org_id = 2;
  uint64 project_id = 3;
  uint64 cluster_id = 4;
  string region = 5;
  CloudProvider cloudprovider = 6; // Cloud provider (required)
  IntegrationType type = 7;
  repeated IntegrationPayload payloads = 8;
  string datadog_api_key = 9;
  DatadogSite datadog_site = 10;
  string newrelic_api_key = 11;
  NewrelicSite newrelic_site = 12;
}

message DeleteIntegrationRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  // The type field goes to query parameters
  IntegrationType type = 4;
}

message IntegrationStatusResp {
  uint64 id = 1;
  uint64 org_id = 2;
  uint64 project_id = 3;
  uint64 cluster_id = 4;
  IntegrationType type = 5;
  IntegrationStatus status = 6;
  // status_reason contains error message of the underlying data integration.
  string status_reason = 7;
  repeated IntegrationPayload payloads = 8;
  DatadogSite datadog_site = 9;
  string datadog_site_url = 10;
  string datadog_dashboard_url = 11;
  string datadog_masked_api_key = 12;
  NewrelicSite newrelic_site = 13;
  string newrelic_site_url = 14;
  string newrelic_dashboard_url = 15;
  string newrelic_masked_api_key = 16;
}

message ValidateDatadogAPIKeyRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  string datadog_api_key = 4;
  DatadogSite datadog_site = 5;
}

message ValidateDatadogAPIKeyResp {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  bool valid = 4;
}

message ValidateNewrelicAPIKeyRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  string newrelic_api_key = 4;
  NewrelicSite newrelic_site = 5;
}

message ValidateNewrelicAPIKeyResp {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  bool valid = 4;
}

message ListIntegrationsRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  // The type field goes to query parameters
  IntegrationType type = 4;
}

message ListIntegrationsResp {
  repeated IntegrationStatusResp items = 1;
  int32 total = 2;
}

message MetricsKey {
  uint64 key_id = 1;
  string key = 2;
  google.protobuf.Timestamp created_at = 3;
}

message CreateMetricsKeyRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
}

message CreateMetricsKeyResp {
  MetricsKey key = 1;
  string query_endpoint = 2;
}

message GetAllMetricsKeyRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
}

message GetAllMetricsKeyResp {
  repeated MetricsKey metrics_keys = 1;
  string query_endpoint = 2;
}

message DeleteMetricsKeyRequest {
  uint64 org_id = 1;
  uint64 project_id = 2;
  uint64 cluster_id = 3;
  uint64 key_id = 4;
}

// IntegrationService defines CRUD interfaces for Integration
service IntegrationService {
  rpc CreateIntegration(CreateIntegrationRequest) returns (IntegrationStatusResp) {
    option (google.api.http) = {
      post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations"
      body: "*"
      additional_bindings: {
        post: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations"
        body: "*"
      }
    };
  }

  rpc UpdateIntegration(UpdateIntegrationRequest) returns (IntegrationStatusResp) {
    option (google.api.http) = {
      put: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations/{id}"
      body: "*"
      additional_bindings: {
        put: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations/{id}"
        body: "*"
      }
    };
  }

  rpc DeleteIntegration(DeleteIntegrationRequest) returns (IntegrationStatusResp) {
    option (google.api.http) = {
      delete: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations"
      additional_bindings: {delete: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations"}
    };
  }

  rpc ValidateDatadogAPIKey(ValidateDatadogAPIKeyRequest) returns (ValidateDatadogAPIKeyResp) {
    option (google.api.http) = {
      post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations/datadog/api_key/validate"
      body: "*"
      additional_bindings: {
        post: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations/datadog/api_key/validate"
        body: "*"
      }
    };
  }

  rpc ValidateNewrelicAPIKey(ValidateNewrelicAPIKeyRequest) returns (ValidateNewrelicAPIKeyResp) {
    option (google.api.http) = {
      post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations/newrelic/api_key/validate"
      body: "*"
      additional_bindings: {
        post: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations/newrelic/api_key/validate"
        body: "*"
      }
    };
  }

  rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResp) {
    option (google.api.http) = {
      get: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/integrations"
      additional_bindings: {get: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/integrations"}
    };
  }

  rpc CreateMetricsKey(CreateMetricsKeyRequest) returns (CreateMetricsKeyResp) {
    option (google.api.http) = {
      post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/metrics_key"
      additional_bindings: {post: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/metrics_key"}
    };
  }

  rpc GetAllMetricsKey(GetAllMetricsKeyRequest) returns (GetAllMetricsKeyResp) {
    option (google.api.http) = {
      get: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/metrics_key"
      additional_bindings: {get: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/metrics_key"}
    };
  }

  rpc DeleteMetricsKey(DeleteMetricsKeyRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/metrics_key/{key_id}"
      additional_bindings: {delete: "/api/v1/orgs/{org_id}/clusters/{cluster_id}/metrics_key/{key_id}"}
    };
  }
}
