//
// Copyright (C) 2018 The Android Open Source Project
//
// 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.
//

include "utils/zlib/buffer.fbs";

// The type of variable to fetch.
namespace libtextclassifier3;
enum AndroidSimpleIntentGeneratorVariableType : int {
  INVALID_VARIABLE = 0,

  // The raw text that was classified.
  RAW_TEXT = 1,

  // Text as a URL with explicit protocol. If no protocol was specified, http
  // is prepended.
  URL_TEXT = 2,

  // The raw text, but URL encoded.
  URL_ENCODED_TEXT = 3,

  // For dates/times: the instant of the event in UTC millis.
  EVENT_TIME_MS_UTC = 4,

  // For dates/times: the start of the event in UTC millis.
  EVENT_START_MS_UTC = 5,

  // For dates/times: the end of the event in UTC millis.
  EVENT_END_MS_UTC = 6,

  // Name of the package that's running the classifier.
  PACKAGE_NAME = 7,
}

// Enumerates the possible extra types for the simple intent generator.
namespace libtextclassifier3;
enum AndroidSimpleIntentGeneratorExtraType : int {
  INVALID_EXTRA_TYPE = 0,
  STRING = 1,
  BOOL = 2,
  VARIABLE_AS_LONG = 3,
}

// Enumerates the possible condition types for the simple intent generator.
namespace libtextclassifier3;
enum AndroidSimpleIntentGeneratorConditionType : int {
  INVALID_CONDITION_TYPE = 0,

  // Queries the UserManager for the given boolean restriction. The condition
  // passes if the result is of getBoolean is false. The name of the
  // restriction to check is in the string_ field.
  USER_RESTRICTION_NOT_SET = 1,

  // Checks that the parsed event start time is at least a give number of
  // milliseconds in the future. (Only valid if there is a parsed event
  // time) The offset is stored in the int64_ field.
  EVENT_START_IN_FUTURE_MS = 2,
}

// Describes how intents for the various entity types should be generated on
// Android. This is distributed through the model, but not used by
// libtextclassifier yet - rather, it's passed to the calling Java code, which
// implements the Intent generation logic.
namespace libtextclassifier3;
table AndroidIntentFactoryOptions {
  entity:[AndroidIntentFactoryEntityOptions];
}

// Describes how intents should be generated for a particular entity type.
namespace libtextclassifier3;
table AndroidIntentFactoryEntityOptions {
  // The entity type as defined by one of the TextClassifier ENTITY_TYPE
  // constants. (e.g. "address", "phone", etc.)
  entity_type:string;

  // List of generators for all the different types of intents that should
  // be made available for the entity type.
  generator:[AndroidIntentGeneratorOptions];
}

// Configures a single Android Intent generator.
namespace libtextclassifier3;
table AndroidIntentGeneratorOptions {
  // Strings for UI elements.
  strings:[AndroidIntentGeneratorStrings];

  // Generator specific configuration.
  simple:AndroidSimpleIntentGeneratorOptions;
}

// Language dependent configuration for an Android Intent generator.
namespace libtextclassifier3;
table AndroidIntentGeneratorStrings {
  // BCP 47 tag for the supported locale. Note that because of API level
  // restrictions, this must /not/ use wildcards. To e.g. match all English
  // locales, use only "en" and not "en_*". Reference the java.util.Locale
  // constructor for details.
  language_tag:string;

  // Title shown for the action (see RemoteAction.getTitle).
  title:string;

  // Description shown for the action (see
  // RemoteAction.getContentDescription).
  description:string;
}

// An extra to set on a simple intent generator Intent.
namespace libtextclassifier3;
table AndroidSimpleIntentGeneratorExtra {
  // The name of the extra to set.
  name:string;

  // The type of the extra to set.
  type:AndroidSimpleIntentGeneratorExtraType;

  string_:string;

  bool_:bool;
  int32_:int;
}

// A condition that needs to be fulfilled for an Intent to get generated.
namespace libtextclassifier3;
table AndroidSimpleIntentGeneratorCondition {
  type:AndroidSimpleIntentGeneratorConditionType;

  string_:string;

  int32_:int;
  int64_:long;
}

// Configures an intent generator where the logic is simple to be expressed with
// basic rules - which covers the vast majority of use cases and is analogous
// to Android Actions.
// Most strings (action, data, type, ...) may contain variable references. To
// use them, the generator must first declare all the variables it wishes to use
// in the variables field. The values then become available as numbered
// arguments (using the normal java.util.Formatter syntax) in the order they
// were specified.
namespace libtextclassifier3;
table AndroidSimpleIntentGeneratorOptions {
  // The action to set on the Intent (see Intent.setAction). Supports variables.
  action:string;

  // The data to set on the Intent (see Intent.setData). Supports variables.
  data:string;

  // The type to set on the Intent (see Intent.setType). Supports variables.
  type:string;

  // The list of all the extras to add to the Intent.
  extra:[AndroidSimpleIntentGeneratorExtra];

  // The list of all the variables that become available for substitution in
  // the action, data, type and extra strings. To e.g. set a field to the value
  // of the first variable, use "%0$s".
  variable:[AndroidSimpleIntentGeneratorVariableType];

  // The list of all conditions that need to be fulfilled for Intent generation.
  condition:[AndroidSimpleIntentGeneratorCondition];
}

// Describes how intents should be generated for a particular entity type.
namespace libtextclassifier3.IntentFactoryModel_;
table IntentGenerator {
  // The type of the intent generator, e.g. the entity type as defined by
  // on the TextClassifier ENTITY_TYPE constants e.g. "address", "phone", etc.
  type:string;

  // The template generator lua code, either as text source or precompiled
  // bytecode.
  lua_template_generator:[ubyte];

  compressed_lua_template_generator:CompressedBuffer;
}

// Describes how intents for the various entity types should be generated.
namespace libtextclassifier3;
table IntentFactoryModel {
  generator:[IntentFactoryModel_.IntentGenerator];

  // Whether to precompile the generators when loading.
  precompile_generators:bool = false;
}