// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// If you change or add any fields in this file, update proto_visitors.h and
// potentially proto_enum_conversions.{h, cc}.

syntax = "proto2";

option java_multiple_files = true;
option java_package = "org.chromium.components.sync.protocol";

option optimize_for = LITE_RUNTIME;

package sync_pb;

// Represents the context of a URL shared within a group, including its various
// representations and metadata.
message SharedUrlContext {
  enum Source {
    // The source is not specified.
    SOURCE_UNSPECIFIED = 0;
    // The current URL shown in the Omnibox.
    OMNIBOX = 1;
    // The URL we received or sent through Chrome Sync.
    FROM_SYNC = 2;
    // The Canonical URL the client identified.
    CANONICAL_URL = 3;
  }

  // A specific representation of a URL from a particular source.
  message UrlRepresentation {
    // Where this URL representation was received from.
    optional Source source = 1;
    // The URL, hash, or other unique identifier for this representation.
    optional string value = 2;
    // An optional version string to differentiate representations over time.
    optional string version = 3;
  }

  // A list of all known representations for this URL. This allows different
  // clients to find a common representation for identifying the page.
  repeated UrlRepresentation representations = 1;

  // The title of the web page this SharedUrlContext refers to.
  optional string title = 2;
}

// Contains all the data for a user-authored comment, including its
// content, sorting key, and attribution.
message CommentData {
  // The user-authored comment string, which may contain rich text.
  optional string text = 1;

  // Describes what a comment is about, such as a reply to another comment or a
  // new comment on a specific target.
  message Attribution {
    // Identifies the target of a top-level comment.
    message CommentTarget {
      // The UUID of the `SharedUrlContext` specifics this comment is attached
      // to.
      optional string shared_url_context_uuid = 1;

      // A link to a specific text fragment within the page (i.e., a "deep
      // link").
      message FragmentLink {
        // The fragment part of the link, i.e. the #:~:text=... part of the
        // link.
        optional string fragment = 1;
        // A string representation of the selected text to be used in previews.
        optional string text_preview = 2;
      }
      // An optional link to a text fragment within the page.
      optional FragmentLink link_fragment = 2;
    }

    // Identifies the parent comment this comment is a reply to.
    message InReplyTo {
      // The UUID of the parent comment.
      optional string parent_id = 1;
    }

    // Defines whether the comment is a new thread or a reply.
    oneof kind {
      // The target if this is a new top-level comment.
      CommentTarget top_level = 1;
      // Metadata about the parent comment if this is a reply.
      InReplyTo parent = 2;
    }
  }

  // The attribution data for this comment, indicating what it refers to.
  optional Attribution attribution = 2;

  // Defines a key used for deterministically sorting comments in a distributed
  // system. This ensures that all clients render comments in the same stable
  // order, regardless of network timing or processing order. This is intended
  // to be used together with the creation time of an entity to provide a
  // strictly monotonically increasing ordering.
  message OrderKey {
    // A unique identifier for the device or client that authored the comment
    // (e.g., a GUID). This serves as the main tie-breaker for comments with
    // identical timestamps.
    optional string device_guid = 1;

    // A strictly monotonically increasing sequence number generated by the
    // source device. Any sequence number is guaranteed to not be reused for the
    // same source device.  This provides a final, definitive ordering for
    // comments created by the same source, even if they arrive out of order.
    optional int64 local_sequence = 2;
  }
  // A key for deterministically sorting entities.
  optional OrderKey order_key = 3;
}

// Represents a single entity in the commenting system, which can be either a
// user comment or a URL context object. This is the top-level message for a
// single comment-related sync entity.
message SharedCommentSpecifics {
  // A unique identifier (UUID) for this entity.
  optional string uuid = 1;

  // A stable, permanent identifier for the collaboration context this entity
  // belongs to. It serves as a permanent foreign key to group related data
  // types (e.g., comments, tab groups) that belong to the same logical
  // collaboration. This ID never changes, even if the underlying entity is
  // shared or unshared, thus preventing data from being orphaned.
  optional string context_id = 2;

  // The highest SharedCommentSpecifics version supported by the client that
  // wrote this entity.
  optional int64 proto_version = 3;

  // The main payload of this entity.
  oneof entity {
    // The content of a user-authored comment.
    CommentData comment = 4;
    // The context for a URL being commented on.
    SharedUrlContext shared_url_context = 5;
  }
}
