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

// Meridiem field.
namespace libtextclassifier3.grammar.datetime;
enum Meridiem : int {
  UNKNOWN = 0,

  // Ante meridiem: Before noon
  AM = 1,

  // Post meridiem: After noon
  PM = 2,
}

// Enum represents a unit of date and time in the expression.
// Next field: 10
namespace libtextclassifier3.grammar.datetime;
enum ComponentType : int {
  UNSPECIFIED = 0,

  // Year of the date seen in the text match.
  YEAR = 1,

  // Month of the year starting with January = 1.
  MONTH = 2,

  // Week (7 days).
  WEEK = 3,

  // Day of week, start of the week is Sunday &  its value is 1.
  DAY_OF_WEEK = 4,

  // Day of the month starting with 1.
  DAY_OF_MONTH = 5,

  // Hour of the day.
  HOUR = 6,

  // Minute of the hour with a range of 0-59.
  MINUTE = 7,

  // Seconds of the minute with a range of 0-59.
  SECOND = 8,

  // Meridiem field i.e. AM/PM.
  MERIDIEM = 9,
}

namespace libtextclassifier3.grammar.datetime;
table TimeZone {
  // Offset from UTC/GTM in minutes.
  utc_offset_mins:int;
}

namespace libtextclassifier3.grammar.datetime.RelativeDatetimeComponent_;
enum Modifier : int {
  UNSPECIFIED = 0,
  NEXT = 1,
  THIS = 2,
  LAST = 3,
  NOW = 4,
  TOMORROW = 5,
  YESTERDAY = 6,
  PAST = 7,
  FUTURE = 8,
}

// Message for representing the relative date-time component in date-time
// expressions.
// Next field: 4
namespace libtextclassifier3.grammar.datetime;
table RelativeDatetimeComponent {
  component_type:ComponentType = UNSPECIFIED;
  modifier:RelativeDatetimeComponent_.Modifier = UNSPECIFIED;
  value:int;
}

// AbsoluteDateTime represents date-time expressions that is not ambiguous.
// Next field: 11
namespace libtextclassifier3.grammar.datetime;
table AbsoluteDateTime {
  // Year value of the date seen in the text match.
  year:int = -1;

  // Month value of the year starting with January = 1.
  month:int = -1;

  // Day value of the month starting with 1.
  day:int = -1;

  // Day of week, start of the week is Sunday and its value is 1.
  week_day:int = -1;

  // Hour value of the day.
  hour:int = -1;

  // Minute value of the hour with a range of 0-59.
  minute:int = -1;

  // Seconds value of the minute with a range of 0-59.
  second:int = -1;

  partial_second:double = -1;

  // Meridiem field i.e. AM/PM.
  meridiem:Meridiem;

  time_zone:TimeZone;
}

// Message to represent relative datetime expressions.
// It encode expressions
// - Where modifier such as before/after shift the date e.g.[three days ago],
// [2 days after March 1st].
// - When prefix make the expression relative e.g. [next weekend],
// [last Monday].
// Next field: 3
namespace libtextclassifier3.grammar.datetime;
table RelativeDateTime {
  relative_datetime_component:[RelativeDatetimeComponent];

  // The base could be an absolute datetime point for example: "March 1", a
  // relative datetime point, for example: "2 days before March 1"
  base:AbsoluteDateTime;
}

// Datetime result.
namespace libtextclassifier3.grammar.datetime;
table UngroundedDatetime {
  absolute_datetime:AbsoluteDateTime;
  relative_datetime:RelativeDateTime;

  // The annotation usecases.
  // There are two modes.
  // 1- SMART - Datetime results which are optimized for Smart select
  // 2- RAW - Results are optimized for where annotates as much as possible.
  annotation_usecases:uint = 4294967295;
}

