// Copyright 2021 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/cloud/documentai/v1beta3/document_io.proto";
import "google/cloud/documentai/v1beta3/operation_metadata.proto";
import "google/cloud/documentai/v1beta3/processor.proto";
import "google/cloud/documentai/v1beta3/processor_type.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::V1beta3";

// (-- 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/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) = "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"
    };
  }

  // Fetches processor types.
  rpc FetchProcessorTypes(FetchProcessorTypesRequest) returns (FetchProcessorTypesResponse) {
    option (google.api.http) = {
      get: "/v1beta3/{parent=projects/*/locations/*}:fetchProcessorTypes"
    };
    option (google.api.method_signature) = "parent";
  }

  // Lists all processors which belong to this project.
  rpc ListProcessors(ListProcessorsRequest) returns (ListProcessorsResponse) {
    option (google.api.http) = {
      get: "/v1beta3/{parent=projects/*/locations/*}/processors"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a processor from the type processor that the user chose.
  // The processor will be at "ENABLED" state by default after its creation.
  rpc CreateProcessor(CreateProcessorRequest) returns (Processor) {
    option (google.api.http) = {
      post: "/v1beta3/{parent=projects/*/locations/*}/processors"
      body: "processor"
    };
    option (google.api.method_signature) = "parent,processor";
  }

  // Deletes the processor, unloads all deployed model artifacts if it was
  // enabled and then deletes all artifacts associated with this processor.
  rpc DeleteProcessor(DeleteProcessorRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1beta3/{name=projects/*/locations/*/processors/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "DeleteProcessorMetadata"
    };
  }

  // Enables a processor
  rpc EnableProcessor(EnableProcessorRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta3/{name=projects/*/locations/*/processors/*}:enable"
      body: "*"
    };
    option (google.longrunning.operation_info) = {
      response_type: "EnableProcessorResponse"
      metadata_type: "EnableProcessorMetadata"
    };
  }

  // Disables a processor
  rpc DisableProcessor(DisableProcessorRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta3/{name=projects/*/locations/*/processors/*}:disable"
      body: "*"
    };
    option (google.longrunning.operation_info) = {
      response_type: "DisableProcessorResponse"
      metadata_type: "DisableProcessorMetadata"
    };
  }

  // 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 {
  // The document payload.
  oneof source {
    // An inline document proto.
    Document inline_document = 4;

    // A raw document content (bytes).
    RawDocument raw_document = 5;
  }

  // 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 [deprecated = true];

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

// The status of human review on a processed document.
message HumanReviewStatus {
  // The final state of human review on a processed document.
  enum State {
    // Human review state is unspecified. Most likely due to an internal error.
    STATE_UNSPECIFIED = 0;

    // Human review is skipped for the document. This can happen because human
    // review is not enabled on the processor or the processing request has
    // been set to skip this document.
    SKIPPED = 1;

    // Human review validation is triggered and passed, so no review is needed.
    VALIDATION_PASSED = 2;

    // Human review validation is triggered and the document is under review.
    IN_PROGRESS = 3;

    // Some error happened during triggering human review, see the
    // [state_message] for details.
    ERROR = 4;
  }

  // The state of human review on the processing request.
  State state = 1;

  // A message providing more details about the human review state.
  string state_message = 2;

  // The name of the operation triggered by the processed document. This field
  // is populated only when the [state] is [HUMAN_REVIEW_IN_PROGRESS]. It has
  // the same response type and metadata as the long running operation returned
  // by [ReviewDocument] method.
  string human_review_operation = 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 [deprecated = true];

  // The status of human review on the processed document.
  HumanReviewStatus human_review_status = 3;
}

// Request message for batch process document method.
message BatchProcessRequest {
  // The message for input config in batch process.
  message BatchInputConfig {
    option deprecated = true;

    // 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 {
    option deprecated = true;

    // 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 [deprecated = true];

  // The overall output config for batch process.
  BatchOutputConfig output_config = 3 [deprecated = true];

  // The input documents for batch process.
  BatchDocumentsInputConfig input_documents = 5;

  // The overall output config for batch process.
  DocumentOutputConfig document_output_config = 6;

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

// 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 [deprecated = true];

    // The status of human review on the processed document.
    HumanReviewStatus human_review_status = 5;
  }

  // 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 fetch processor types.
message FetchProcessorTypesRequest {
  // Required. The project of processor type to list.
  // Format: projects/{project}/locations/{location}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "documentai.googleapis.com/ProcessorType"
    }
  ];
}

// Response message for fetch processor types.
message FetchProcessorTypesResponse {
  // The list of processor types.
  repeated ProcessorType processor_types = 1;
}

// Request message for list all processors belongs to a project.
message ListProcessorsRequest {
  // Required. The parent (project and location) which owns this collection of Processors.
  // Format: projects/{project}/locations/{location}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "documentai.googleapis.com/Processor"
    }
  ];

  // The maximum number of processors to return.
  // If unspecified, at most 50 processors will be returned.
  // The maximum value is 100; values above 100 will be coerced to 100.
  int32 page_size = 2;

  // We will return the processors sorted by creation time. The page token
  // will point to the next processor.
  string page_token = 3;
}

// Response message for list processors.
message ListProcessorsResponse {
  // The list of processors.
  repeated Processor processors = 1;

  // Points to the next processor, otherwise empty.
  string next_page_token = 2;
}

// Request message for create a processor. Notice this request is sent to
// a regionalized backend service, and if the processor type is not available
// on that region, the creation will fail.
message CreateProcessorRequest {
  // Required. The parent (project and location) under which to create the processor.
  // Format: projects/{project}/locations/{location}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "documentai.googleapis.com/Processor"
    }
  ];

  // Required. The processor to be created, requires [processor_type] and [display_name]
  // to be set. Also, the processor is under CMEK if CMEK fields are set.
  Processor processor = 2 [(google.api.field_behavior) = REQUIRED];
}

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

// The long running operation metadata for delete processor method.
message DeleteProcessorMetadata {
  // The basic metadata of the long running operation.
  CommonOperationMetadata common_metadata = 5;
}

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

// Response message for the enable processor method.
message EnableProcessorResponse {

}

// The long running operation metadata for enable processor method.
message EnableProcessorMetadata {
  // The basic metadata of the long running operation.
  CommonOperationMetadata common_metadata = 5;
}

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

// Response message for the disable processor method.
message DisableProcessorResponse {

}

// The long running operation metadata for disable processor method.
message DisableProcessorMetadata {
  // The basic metadata of the long running operation.
  CommonOperationMetadata common_metadata = 5;
}

// Request message for review document method.
// Next Id: 6.
message ReviewDocumentRequest {
  // The priority level of the human review task.
  enum Priority {
    // The default priority level.
    DEFAULT = 0;

    // The urgent priority level. The labeling manager should allocate labeler
    // resource to the urgent task queue to respect this priority level.
    URGENT = 1;
  }

  // The document payload.
  oneof source {
    // An inline document proto.
    Document inline_document = 4;
  }

  // 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 [deprecated = true];

  // Whether the validation should be performed on the ad-hoc review request.
  bool enable_schema_validation = 3;

  // The priority of the human review task.
  Priority priority = 5;
}

// 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;

  // The basic metadata of the long running operation.
  CommonOperationMetadata common_metadata = 5;
}
