// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Sync protocol datatype extension for push notifications..

// Update proto_value_conversions{.h,.cc,_unittest.cc} if you change
// any fields in this file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option retain_unknown_fields = true;

package sync_pb;

import "synced_notification_render.proto";

// This message allows clients to identify a notification they have created.
message SyncedNotificationIdentifier {
  // The application that the notification is a part of.
  optional string app_id = 1;

  // Notifications with the same coalescing key (isolated to the same app_id)
  // will be grouped together when fetched.
  optional string coalescing_key = 2;
}

message SyncedNotificationCreator {
  // The gaia id of the creator.  If a notification does not have a clear
  // creator, skip this and follow the directions below to use a system creator.
  optional int64 gaia_id = 1;

  // Indicates that the creator is a "system" creator.  Example of these are
  // notifications sent to the user where the addressee is "Google", such as the
  // "You have violated our TOS, and have 3 days to fix it or you'll lose your
  // account" notifications.  If is_system is set, gaia_id must not be set and
  // instead the app_id field must be set.
  optional bool is_system = 2;

  // Only set this in the system-creator case.
  optional string app_id = 3;
}

message SyncedNotificationRecipients {
  repeated int64 gaia_id = 1;

  // For now, only support gaia id recipients.  Add more recipient types via
  // 'repeated Type other_type = X' when necessary.
}

message SyncedNotification {
  // A secondary type that is isolated within the same app_id.
  //
  // NOTE: For ASBE support purposes this must be in the format [A-Za-z_]+.
  optional string type = 1;

  // Whatever string the client entered during creation.  If no external_id is
  // specified, the notification can no longer be identified individually for
  // fetching/deleting, etc...
  optional string external_id = 2;

  // The creator of the notification.
  optional SyncedNotificationCreator creator = 3;

  // Client specific data.
  optional MapData client_data = 4;
}

message CoalescedSyncedNotification {
  // An opaque string key used to identify individual coalesced notifications.
  optional string key = 1;

  optional string app_id = 2;

  // All the notifications that are grouped together.
  repeated SyncedNotification notification = 3;

  // Data that is used directly by endpoints to render notifications in the case
  // where no "native" app can handle the notification.
  optional SyncedNotificationRenderInfo render_info = 4;

  // Read state will be per coalesced notification.
  enum ReadState {
    UNREAD = 1;
    READ = 2;
    DISMISSED = 3;
  }
  optional ReadState read_state = 5;

  // The time when the LATEST notification of the coalesced notification is
  // created (in milliseconds since the linux epoch).
  optional uint64 creation_time_msec = 6;

  enum Priority {
    LOW = 1;
    STANDARD = 2;
    HIGH = 3;
    // We will most likely add at least one more priority in the near future.
  };
  optional Priority priority = 7;
}

message SyncedNotificationList {
  repeated CoalescedSyncedNotification coalesced_notification = 1;
}

// MapData, Data, and ListData are used to sending aribitrary payloads
// between instances of applications using Synced Notifications.  The
// schema atop MapData will be defined by the client application.
message MapData {
  message Entry {
    optional string key = 1;
    optional Data value = 2;
  };
  repeated Entry entry = 1;
};

message Data {
  optional bool boolean_value = 1;
  optional int32 int_value = 2;
  optional double float_value = 3;
  optional string string_value = 4;
  optional ListData list_value = 5;
  optional MapData map_value = 6;
};

message ListData {
  repeated Data value = 1;
};