// Copyright 2019 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.vision.v1p3beta1;

import "google/api/annotations.proto";
import "google/api/resource.proto";
import "google/cloud/vision/v1p3beta1/geometry.proto";
import "google/cloud/vision/v1p3beta1/product_search_service.proto";
import "google/protobuf/timestamp.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1;vision";
option java_multiple_files = true;
option java_outer_classname = "ProductSearchProto";
option java_package = "com.google.cloud.vision.v1p3beta1";

// Parameters for a product search request.
message ProductSearchParams {
  // The resource name of the catalog to search.
  //
  // Format is: `productSearch/catalogs/CATALOG_NAME`.
  string catalog_name = 1;

  // The category to search in.
  // Optional. It is inferred by the system if it is not specified.
  // [Deprecated] Use `product_category`.
  ProductSearchCategory category = 2;

  // The product category to search in.
  // Optional. It is inferred by the system if it is not specified.
  // Supported values are `bag`, `shoe`, `sunglasses`, `dress`, `outerwear`,
  // `skirt`, `top`, `shorts`, and `pants`.
  string product_category = 5;

  // The bounding polygon around the area of interest in the image.
  // Optional. If it is not specified, system discretion will be applied.
  // [Deprecated] Use `bounding_poly`.
  NormalizedBoundingPoly normalized_bounding_poly = 3;

  // The bounding polygon around the area of interest in the image.
  // Optional. If it is not specified, system discretion will be applied.
  BoundingPoly bounding_poly = 9;

  // Specifies the verbosity of the  product search results.
  // Optional. Defaults to `BASIC`.
  ProductSearchResultsView view = 4;

  // The resource name of a
  // [ProductSet][google.cloud.vision.v1p3beta1.ProductSet] to be searched for
  // similar images.
  //
  // Format is:
  // `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID`.
  string product_set = 6 [(google.api.resource_reference) = {
                            type: "vision.googleapis.com/ProductSet"
                          }];

  // The list of product categories to search in. Currently, we only consider
  // the first category, and either "homegoods" or "apparel" should be
  // specified.
  repeated string product_categories = 7;

  // The filtering expression. This can be used to restrict search results based
  // on Product labels. We currently support an AND of OR of key-value
  // expressions, where each expression within an OR must have the same key.
  //
  // For example, "(color = red OR color = blue) AND brand = Google" is
  // acceptable, but not "(color = red OR brand = Google)" or "color: red".
  string filter = 8;
}

// Results for a product search request.
message ProductSearchResults {
  // Information about a product.
  message ProductInfo {
    // Product ID.
    string product_id = 1;

    // The URI of the image which matched the query image.
    //
    // This field is returned only if `view` is set to `FULL` in
    // the request.
    string image_uri = 2;

    // A confidence level on the match, ranging from 0 (no confidence) to
    // 1 (full confidence).
    //
    // This field is returned only if `view` is set to `FULL` in
    // the request.
    float score = 3;
  }

  // Information about a product.
  message Result {
    // The Product.
    Product product = 1;

    // A confidence level on the match, ranging from 0 (no confidence) to
    // 1 (full confidence).
    //
    // This field is returned only if `view` is set to `FULL` in
    // the request.
    float score = 2;

    // The resource name of the image from the product that is the closest match
    // to the query.
    string image = 3;
  }

  // Product category.
  // [Deprecated] Use `product_category`.
  ProductSearchCategory category = 1;

  // Product category.
  // Supported values are `bag` and `shoe`.
  // [Deprecated] `product_category` is provided in each Product.
  string product_category = 4;

  // Timestamp of the index which provided these results. Changes made after
  // this time are not reflected in the current results.
  google.protobuf.Timestamp index_time = 2;

  // List of detected products.
  repeated ProductInfo products = 3;

  // List of results, one for each product match.
  repeated Result results = 5;
}

// Supported product search categories.
enum ProductSearchCategory {
  // Default value used when a category is not specified.
  PRODUCT_SEARCH_CATEGORY_UNSPECIFIED = 0;

  // Shoes category.
  SHOES = 1;

  // Bags category.
  BAGS = 2;
}

// Specifies the fields to include in product search results.
enum ProductSearchResultsView {
  // Product search results contain only `product_category` and `product_id`.
  // Default value.
  BASIC = 0;

  // Product search results contain `product_category`, `product_id`,
  // `image_uri`, and `score`.
  FULL = 1;
}
