// Copyright 2023 Greptime Team
//
// 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 greptime.v1;

option java_package = "io.greptime.v1";
option java_outer_classname = "Common";
option go_package = "github.com/GreptimeTeam/greptime-proto/go/greptime/v1";

message QueryContext {
  string current_catalog = 1;
  string current_schema = 2;
  string timezone = 4;
  map<string, string> extensions = 5;
  uint32 channel = 6;
  SnapshotSequences snapshot_seqs = 7;
  // Explain options for the query.
  ExplainOptions explain = 8;
}

message SnapshotSequences {
  // Mappings of the RegionId to the minimal sequence of SST file to scan.
  map<uint64, uint64> sst_min_sequences = 1;
  // mapping of RegionId to SequenceNumber, for snapshot read, meaning that the
  // read should only container data that was committed before (and include) the
  // given sequence number
  map<uint64, uint64> snapshot_seqs = 7;
}

message ExplainOptions {
  // Whether to enable verbose explain output.
  bool verbose = 1;
}

message RequestHeader {
  // The `catalog` that is selected to be used in this request.
  string catalog = 1;
  // The `schema` that is selected to be used in this request.
  string schema = 2;
  // The `authorization` header, much like http's authorization header.
  AuthHeader authorization = 3;
  // The `dbname` for the request
  string dbname = 4;
  // Encoded trace_id & span_id, follow the w3c Trace Context
  // https://www.w3.org/TR/trace-context/#header-name
  map<string, string> tracing_context = 5;
  // The `timezone` for the request
  string timezone = 6;
}

message ResponseHeader { Status status = 1; }

message Status {
  // Corresponding to the `StatusCode` definition of GreptimeDB
  uint32 status_code = 1;
  string err_msg = 2;
}

message AuthHeader {
  oneof auth_scheme {
    Basic basic = 1;
    Token token = 2;
  }
}

message Basic {
  string username = 1;
  string password = 2;
}

message Token { string token = 1; }

message TableName {
  string catalog_name = 1;
  string schema_name = 2;
  string table_name = 3;
}

message AffectedRows { uint32 value = 1; }

message Metrics { bytes metrics = 1; }

message ExpireAfter { int64 value = 1; }

message FlightMetadata {
  AffectedRows affected_rows = 1;
  Metrics metrics = 2;
}

enum SemanticType {
  TAG = 0;
  FIELD = 1;
  TIMESTAMP = 2;
}

enum ColumnDataType {
  BOOLEAN = 0;
  INT8 = 1;
  INT16 = 2;
  INT32 = 3;
  INT64 = 4;
  UINT8 = 5;
  UINT16 = 6;
  UINT32 = 7;
  UINT64 = 8;
  FLOAT32 = 9;
  FLOAT64 = 10;
  BINARY = 11;
  STRING = 12;
  DATE = 13;
  DATETIME = 14;
  TIMESTAMP_SECOND = 15;
  TIMESTAMP_MILLISECOND = 16;
  TIMESTAMP_MICROSECOND = 17;
  TIMESTAMP_NANOSECOND = 18;
  TIME_SECOND = 19;
  TIME_MILLISECOND = 20;
  TIME_MICROSECOND = 21;
  TIME_NANOSECOND = 22;
  INTERVAL_YEAR_MONTH = 23;
  INTERVAL_DAY_TIME = 24;
  INTERVAL_MONTH_DAY_NANO = 25;
  DECIMAL128 = 30;
  JSON = 31;
  VECTOR = 32;
}

message IntervalMonthDayNano {
  int32 months = 1;
  int32 days = 2;
  int64 nanoseconds = 3;
}

// (hi: high 64 bits, lo: low 64 bits) are used to keep the decimal128 value.
message Decimal128 {
  int64 hi = 1;
  int64 lo = 2;
}

// Type extension for some complex types
message ColumnDataTypeExtension {
  oneof type_ext {
    DecimalTypeExtension decimal_type = 1;
    // Marks the binary column in proto is actually a JSON column.
    JsonTypeExtension json_type = 2;
    VectorTypeExtension vector_type = 3;
  }
}

message DecimalTypeExtension {
  int32 precision = 1;
  int32 scale = 2;
}

enum JsonTypeExtension {
  JSON_BINARY = 0;
}

message VectorTypeExtension {
  uint32 dim = 1;
}

// Additional options for the column.
message ColumnOptions {
  // Supported keys:
  //   "fulltext":
  //      A JSON encoded string containing full-text search options for the column.
  //
  //      The fulltext options JSON structure:
  //      {
  //        "enable": bool,          // Indicates whether full-text search is
  //                                 // enabled for the column.
  //
  //        "analyzer": string,      // The language-specific text analyzer to
  //                                 // use for indexing and searching text.
  //                                 // Supported values: ["English" (Default), "Chinese"].
  //
  //        "case-sensitive": bool   // Indicates whether the text should be treated
  //                                 // as case-sensitive during full-text search.
  //      }
  //
  //      Example:
  //      "fulltext": "{\"enable\": true, \"analyzer\": \"English\", \"case-sensitive\": false}"
  map<string, string> options = 1;
}
