// Copyright 2026 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.bigquery.migration.v2;

import "google/api/field_behavior.proto";

option csharp_namespace = "Google.Cloud.BigQuery.Migration.V2";
option go_package = "cloud.google.com/go/bigquery/migration/apiv2/migrationpb;migrationpb";
option java_multiple_files = true;
option java_outer_classname = "TranslationDetailsProto";
option java_package = "com.google.cloud.bigquery.migration.v2";
option php_namespace = "Google\\Cloud\\BigQuery\\Migration\\V2";

// The translation details to capture the necessary settings for a translation
// job.
message TranslationDetails {
  // The mapping from source to target SQL.
  repeated SourceTargetMapping source_target_mapping = 1;

  // The base URI for all writes to persistent storage.
  string target_base_uri = 2;

  // The default source environment values for the translation.
  SourceEnvironment source_environment = 3;

  // The list of literal targets that will be directly returned to the response.
  // Each entry consists of the constructed path, EXCLUDING the base path. Not
  // providing a target_base_uri will prevent writing to persistent storage.
  repeated string target_return_literals = 4;

  // The types of output to generate, e.g. sql, metadata,
  // lineage_from_sql_scripts, etc. If not specified, a default set of
  // targets will be generated. Some additional target types may be slower to
  // generate. See the documentation for the set of available target types.
  repeated string target_types = 5;

  // The configuration for the suggestion if requested as a target type.
  SuggestionConfig suggestion_config = 6;
}

// The configuration for the suggestion if requested as a target type.
message SuggestionConfig {
  // The list of suggestion steps to skip.
  repeated SuggestionStep skip_suggestion_steps = 1;
}

// Suggestion step to skip.
message SuggestionStep {
  // Suggestion type.
  enum SuggestionType {
    // Suggestion type unspecified.
    SUGGESTION_TYPE_UNSPECIFIED = 0;

    // Query customization.
    QUERY_CUSTOMIZATION = 1;

    // Translation explanation.
    TRANSLATION_EXPLANATION = 2;
  }

  // The target to apply the suggestion to.
  enum RewriteTarget {
    // Rewrite target unspecified.
    REWRITE_TARGET_UNSPECIFIED = 0;

    // Source SQL.
    SOURCE_SQL = 1;

    // Target SQL.
    TARGET_SQL = 2;
  }

  // The type of suggestion.
  SuggestionType suggestion_type = 1;

  // The rewrite target.
  RewriteTarget rewrite_target = 2;
}

// Represents one mapping from a source SQL to a target SQL.
message SourceTargetMapping {
  // The source SQL or the path to it.
  SourceSpec source_spec = 1;

  // The target SQL or the path for it.
  TargetSpec target_spec = 2;
}

// Represents one path to the location that holds source data.
message SourceSpec {
  // The specific source SQL.
  oneof source {
    // The base URI for all files to be read in as sources for translation.
    string base_uri = 1;

    // Source literal.
    Literal literal = 2;

    // The path to a single source file in Cloud Storage.
    string gcs_file_path = 4;
  }

  // Optional. The optional field to specify the encoding of the sql bytes.
  string encoding = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Represents one path to the location that holds target data.
message TargetSpec {
  // The relative path for the target data. Given source file
  // `base_uri/input/sql`, the output would be
  // `target_base_uri/sql/relative_path/input.sql`.
  string relative_path = 1;
}

// Literal data.
message Literal {
  // The literal SQL contents.
  oneof literal_data {
    // Literal string data.
    string literal_string = 2;

    // Literal byte data.
    bytes literal_bytes = 3;
  }

  // Required. The identifier of the literal entry.
  string relative_path = 1 [(google.api.field_behavior) = REQUIRED];
}

// Represents the default source environment values for the translation.
message SourceEnvironment {
  // The default database name to fully qualify SQL objects when their database
  // name is missing.
  string default_database = 1;

  // The schema search path. When SQL objects are missing schema name,
  // translation engine will search through this list to find the value.
  repeated string schema_search_path = 2;

  // Optional. Expects a validQ BigQuery dataset ID that exists, e.g.,
  // project-123.metadata_store_123.  If specified, translation will search and
  // read the required schema information from a metadata store in this dataset.
  // If metadata store doesn't exist, translation will parse the metadata file
  // and upload the schema info to a temp table in the dataset to speed up
  // future translation jobs.
  string metadata_store_dataset = 3 [(google.api.field_behavior) = OPTIONAL];
}
