// 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.cloud.documentai.v1beta3;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/documentai/v1beta3/document.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

option csharp_namespace = "Google.Cloud.DocumentAI.v1beta3";
option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta3;documentai";
option java_multiple_files = true;
option java_outer_classname = "DocumentAiProcessorService";
option java_package = "com.google.cloud.documentai.v1beta3";
option php_namespace = "Google\\Cloud\\DocumentAi\\v1beta3";
option ruby_package = "Google::Cloud::DocumentAI::master";

// (-- aip.dev/not-precedent: This is needed because we have references to
//     these resources in our public API, but the resource management is not
//     part of the public API (UI access only). So we have to define
//     these resource here to avoid any "unable to find resources" error. --)
option (google.api.resource_definition) = {
  type: "documentai.googleapis.com/Location"
  pattern: "projects/{project}/locations/{location}"
};
option (google.api.resource_definition) = {
  type: "documentai.googleapis.com/Processor"
  pattern: "projects/{project}/locations/{location}/processors/{processor}"
};
option (google.api.resource_definition) = {
  type: "documentai.googleapis.com/HumanReviewConfig"
  pattern: "projects/{project}/locations/{location}/processors/{processor}/humanReviewConfig"
};

// Service to call Cloud DocumentAI to process documents according to the
// processor's definition. Processors are built using state-of-the-art Google
// AI such as natural language, computer vision, and translation to extract
// structured information from unstructured or semi-structured documents.
service DocumentProcessorService {
  option (google.api.default_host) = "us-documentai.googleapis.com";
  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";

  // Processes a single document.
  rpc ProcessDocument(ProcessRequest) returns (ProcessResponse) {
    option (google.api.http) = {
      post: "/v1beta3/{name=projects/*/locations/*/processors/*}:process"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // LRO endpoint to batch process many documents. The output is written
  // to Cloud Storage as JSON in the [Document] format.
  rpc BatchProcessDocuments(BatchProcessRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta3/{name=projects/*/locations/*/processors/*}:batchProcess"
      body: "*"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "BatchProcessResponse"
      metadata_type: "BatchProcessMetadata"
    };
  }

  // Send a document for Human Review. The input document should be processed by
  // the specified processor.
  rpc ReviewDocument(ReviewDocumentRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta3/{human_review_config=projects/*/locations/*/processors/*/humanReviewConfig}:reviewDocument"
      body: "*"
    };
    option (google.api.method_signature) = "human_review_config";
    option (google.longrunning.operation_info) = {
      response_type: "ReviewDocumentResponse"
      metadata_type: "ReviewDocumentOperationMetadata"
    };
  }
}

// Request message for the process document method.
message ProcessRequest {
  // Required. The processor resource name.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "documentai.googleapis.com/Processor"
    }
  ];

  // The document payload, the [content] and [mime_type] fields must be set.
  Document document = 2;

  // Whether Human Review feature should be skipped for this request. Default to
  // false.
  bool skip_human_review = 3;
}

// Response message for the process document method.
message ProcessResponse {
  // The document payload, will populate fields based on the processor's
  // behavior.
  Document document = 1;

  // The name of the operation triggered by the processed document. If the human
  // review process is not triggered, this field will be empty. It has the same
  // response type and metadata as the long running operation returned by
  // ReviewDocument method.
  string human_review_operation = 2;
}

// Request message for batch process document method.
message BatchProcessRequest {
  // The message for input config in batch process.
  message BatchInputConfig {
    // The Cloud Storage location as the source of the document.
    string gcs_source = 1;

    // Mimetype of the input. If the input is a raw document, the supported
    // mimetypes are application/pdf, image/tiff, and image/gif.
    // If the input is a [Document] proto, the type should be application/json.
    string mime_type = 2;
  }

  // The message for output config in batch process.
  message BatchOutputConfig {
    // The output Cloud Storage directory to put the processed documents.
    string gcs_destination = 1;
  }

  // Required. The processor resource name.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "documentai.googleapis.com/Processor"
    }
  ];

  // The input config for each single document in the batch process.
  repeated BatchInputConfig input_configs = 2;

  // The overall output config for batch process.
  BatchOutputConfig output_config = 3;
}

// Response message for batch process document method.
message BatchProcessResponse {

}

// The long running operation metadata for batch process method.
message BatchProcessMetadata {
  // The status of a each individual document in the batch process.
  message IndividualProcessStatus {
    // The source of the document, same as the [input_gcs_source] field in the
    // request when the batch process started. The batch process is started by
    // take snapshot of that document, since a user can move or change that
    // document during the process.
    string input_gcs_source = 1;

    // The status of the processing of the document.
    google.rpc.Status status = 2;

    // The output_gcs_destination (in the request as 'output_gcs_destination')
    // of the processed document if it was successful, otherwise empty.
    string output_gcs_destination = 3;

    // The name of the operation triggered by the processed document. If the
    // human review process is not triggered, this field will be empty. It has
    // the same response type and metadata as the long running operation
    // returned by ReviewDocument method.
    string human_review_operation = 4;
  }

  // Possible states of the batch processing operation.
  enum State {
    // The default value. This value is used if the state is omitted.
    STATE_UNSPECIFIED = 0;

    // Request operation is waiting for scheduling.
    WAITING = 1;

    // Request is being processed.
    RUNNING = 2;

    // The batch processing completed successfully.
    SUCCEEDED = 3;

    // The batch processing was being cancelled.
    CANCELLING = 4;

    // The batch processing was cancelled.
    CANCELLED = 5;

    // The batch processing has failed.
    FAILED = 6;
  }

  // The state of the current batch processing.
  State state = 1;

  // A message providing more details about the current state of processing.
  // For example, the error message if the operation is failed.
  string state_message = 2;

  // The creation time of the operation.
  google.protobuf.Timestamp create_time = 3;

  // The last update time of the operation.
  google.protobuf.Timestamp update_time = 4;

  // The list of response details of each document.
  repeated IndividualProcessStatus individual_process_statuses = 5;
}

// Request message for review document method.
message ReviewDocumentRequest {
  // Required. The resource name of the HumanReviewConfig that the document will be
  // reviewed with.
  string human_review_config = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "documentai.googleapis.com/HumanReviewConfig"
    }
  ];

  // The document that needs human review.
  Document document = 2;
}

// Response message for review document method.
message ReviewDocumentResponse {
  // The Cloud Storage uri for the human reviewed document.
  string gcs_destination = 1;
}

// The long running operation metadata for review document method.
message ReviewDocumentOperationMetadata {
  // State of the longrunning operation.
  enum State {
    // Unspecified state.
    STATE_UNSPECIFIED = 0;

    // Operation is still running.
    RUNNING = 1;

    // Operation is being cancelled.
    CANCELLING = 2;

    // Operation succeeded.
    SUCCEEDED = 3;

    // Operation failed.
    FAILED = 4;

    // Operation is cancelled.
    CANCELLED = 5;
  }

  // Used only when Operation.done is false.
  State state = 1;

  // A message providing more details about the current state of processing.
  // For example, the error message if the operation is failed.
  string state_message = 2;

  // The creation time of the operation.
  google.protobuf.Timestamp create_time = 3;

  // The last update time of the operation.
  google.protobuf.Timestamp update_time = 4;
}
