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

syntax = "proto3";

package google.cloud.support.common;

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

option go_package = "google.golang.org/genproto/googleapis/cloud/support/common;common";
option java_outer_classname = "CloudSupportProto";
option java_package = "com.google.cloud.support.common";

// A Google Cloud Platform account that identifies support eligibility for a
// Cloud resource. Currently the Cloud resource can only be an Organization
// but this might change in future.
message SupportAccount {
  // The current state of this SupportAccount.
  enum State {
    // Account is in an unknown state.
    STATE_UNSPECIFIED = 0;

    // Account is in an active state.
    ACTIVE = 1;

    // Account has been created but is being provisioned in support systems.
    PENDING = 2;

    // Account deletion has been requested by the user.
    PENDING_DELETION = 3;
  }

  // Pricing model applicable to this support account.
  enum PricingModel {
    // This account is subscribed to an unknown pricing model.
    PRICING_MODEL_UNKNOWN = 0;

    // Package based pricing (Platinum, Gold, Silver, Bronze).
    PACKAGES = 1;

    // Support charges are calculated based on user seats a.k.a,
    // "Pick Your Team" model.
    USER_ROLES = 2;
  }

  // The resource name for a support account in format
  // `supportAccounts/{account_id}`.
  // Output only.
  string name = 1;

  // Identifier for this entity that gets persisted in storage system. The
  // resource name is populated using this field in format
  // `supportAccounts/{account_id}`.
  string account_id = 2;

  // The Cloud resource with which this support account is associated.
  string cloud_resource = 3;

  // A user friendly display name assigned to this support account.
  string display_name = 4;

  // Indicates the current state of an account.
  State state = 5;

  // Time when this account was created.
  // Output only.
  google.protobuf.Timestamp create_time = 6;

  // The resource name of a billing account associated with this support
  // account. For example, `billingAccounts/ABCDEF-012345-567890`.
  string billing_account_name = 7;

  string unify_account_id = 8;

  // The PricingModel applicable to this support account.
  PricingModel pricing_model = 9;
}

// A support case created by the user.
message Case {
  // The case priority with P0 being the most urgent and P4 the least.
  enum Priority {
    // Priority is undefined or has not been set yet.
    PRIORITY_UNSPECIFIED = 0;

    // Extreme impact on a production service - Service is hard down.
    P0 = 1;

    // Critical impact on a production service - Service is currently unusable.
    P1 = 2;

    // Severe impact on a production service - Service is usable but greatly
    // impaired.
    P2 = 3;

    // Medium impact on a production service - Service is available, but
    // moderately impaired.
    P3 = 4;

    // General questions or minor issues - Production service is fully
    // available.
    P4 = 5;
  }

  // The state of a case.
  enum State {
    // Case is in an unknown state.
    STATE_UNSPECIFIED = 0;

    // Case has been created but no one is assigned to work on it yet.
    NEW = 1;

    // Case has been assigned to a support agent.
    ASSIGNED = 2;

    // A support agent is currently investigating the case.
    IN_PROGRESS_GOOGLE_SUPPORT = 3;

    // Case has been forwarded to product team for further investigation.
    IN_PROGRESS_GOOGLE_ENG = 4;

    // Case is under investigation and relates to a known issue.
    IN_PROGRESS_KNOWN_ISSUE = 5;

    // Case is waiting for a response from the customer.
    WAITING_FOR_CUSTOMER_RESPONSE = 6;

    // A solution has been offered for the case but it isn't closed yet.
    SOLUTION_OFFERED = 7;

    // Cases has been fully resolved and is in a closed state.
    CLOSED = 8;
  }

  // The resource name for the Case in format
  // `supportAccounts/{account_id}/cases/{case_id}`
  string name = 1;

  // The short summary of the issue reported in this case.
  string display_name = 2;

  // The board description of issue provided with initial summary.
  string description = 3;

  // The product component for which this Case is reported.
  string component = 4;

  // The product subcomponent for which this Case is reported.
  string subcomponent = 5;

  // Timezone the client sending this request is in.
  // It should be in a format IANA recognizes: https://www.iana.org/time-zone
  // There is no additional validation done by the API.
  string client_timezone = 6;

  // The email addresses that can be copied to receive updates on this case.
  // Users can specify a maximum of 10 email addresses.
  repeated string cc_addresses = 7;

  // The Google Cloud Platform project ID for which this case is created.
  string project_id = 8;

  // List of customer issues associated with this case.
  repeated CustomerIssue issues = 10;

  // The current priority of this case.
  Priority priority = 11;

  // The current state of this case.
  State state = 12;

  // Time when this case was created.
  // Output only.
  google.protobuf.Timestamp create_time = 13;

  // Time when this case was last updated.
  // Output only.
  google.protobuf.Timestamp update_time = 14;

  // Email address of user who created this case.
  // Output only. It is inferred from credentials supplied during case creation.
  string creator_email = 15;

  // The issue category applicable to this case.
  string category = 16;
}

// Reference to a Google internal ticket used for investigating a support case.
// Not every support case will have an internal ticket associated with it.
// A support case can have multiple tickets linked to it.
message CustomerIssue {
  // The status of a customer issue.
  enum IssueState {
    // Issue in an unknown state.
    ISSUE_STATE_UNSPECIFIED = 0;

    // Issue is currently open but the work on it has not been started.
    OPEN = 1;

    // Issue is currently being worked on.
    IN_PROGRESS = 2;

    // Issue is fixed.
    FIXED = 3;

    // Issue has been marked as invalid.
    WONT_FIX = 4;

    // Issue verified and in production.
    VERIFIED = 5;
  }

  // Unique identifier for the internal issue.
  // Output only.
  string issue_id = 1;

  // Represents current status of the internal ticket.
  // Output only.
  IssueState state = 2;

  // Time when the internal issue was created.
  // Output only.
  google.protobuf.Timestamp create_time = 3;

  // Time when the internal issue was marked as resolved.
  // Output only.
  google.protobuf.Timestamp resolve_time = 4;

  // Time when the internal issue was last updated.
  // Output only.
  google.protobuf.Timestamp update_time = 5;
}

// A message that contains mapping of a user and their role under a support
// account.
message SupportRole {
  // A role which determines the support resources and features a user might
  // get access to.
  enum Role {
    // An unknown role.
    ROLE_UNSPECIFIED = 0;

    // The basic support role.
    BASIC = 1;

    // The developer role.
    DEVELOPER = 2;

    // The operation role.
    OPERATION = 3;

    // The site reliability role.
    SITE_RELIABILITY = 4;
  }

  // Email address of user being added through this Role.
  string email = 1;

  // The type of role assigned to user.
  Role role = 2;
}

// The comment text associated with a `Case`.
message Comment {
  // Text containing a maximum of 3000 characters.
  string text = 1;

  // Time when this update was created.
  // Output only.
  google.protobuf.Timestamp create_time = 2;

  // The email address/name of user who created this comment.
  // Output only.
  string author = 3;

  // The resource name for this comment in format
  // `supportAccounts/{account_id}/cases/{case_id}/{comment_id}`.
  // Output only.
  string name = 4;
}

// Represents the product component taxonomy that is to be used while creating
// or updating a `Case`. A client should obtain the list of issue categories,
// component/subcomponent from this object and specify it in `Case.category`,
// `Case.component` and `Case.subcomponent` fields respectively.
message IssueTaxonomy {
  // The representation of a product component. It is composed of a canonical
  // name for the product (e.g., Google App Engine), languages in which a
  // support ticket can be created under this component, a template that
  // provides hints on important details to be filled out before submitting a
  // case. It also contains an embedded list of product subcomponents that have
  // similar attributes as top-level components.
  // (e.g., Google App Engine > Memcache).
  message Component {
    // User friendly name of this component.
    string display_name = 1;

    // List of languages in which a support case can be created under this
    // component. Represented by language codes in ISO_639-1 standard.
    repeated string languages = 2;

    // Template to be used while filling the description of a support case.
    string template = 3;

    // List of subcomponents under this component.
    repeated Component subcomponents = 4;
  }

  // Represents the category of issue (Technical or Non-Technical)
  // reported through a support case.
  message Category {
    // User friendly name of this category.
    string display_name = 1;

    // Map of product components under this category.
    map<string, Component> components = 2;
  }

  // Map of available categories.
  map<string, Category> categories = 1;
}
