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

#include "components/send_tab_to_self/proto_conversions.h"

#include <optional>

#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/field_types.h"
#include "components/autofill/core/common/form_field_data.h"
#include "components/autofill/core/common/signatures.h"
#include "components/send_tab_to_self/page_context.h"
#include "components/sync/protocol/send_tab_to_self_specifics.pb.h"

namespace send_tab_to_self {

std::optional<sync_pb::FormField_AutofillFieldType> AutofillFieldTypeToProto(
    autofill::FieldType type) {
  if (!autofill::IsFillableFieldType(type)) {
    return std::nullopt;
  }
  switch (type) {
    case autofill::NAME_HONORIFIC_PREFIX:
      return sync_pb::FormField_AutofillFieldType_NAME_HONORIFIC_PREFIX;
    case autofill::NAME_FIRST:
      return sync_pb::FormField_AutofillFieldType_NAME_FIRST;
    case autofill::NAME_MIDDLE:
      return sync_pb::FormField_AutofillFieldType_NAME_MIDDLE;
    case autofill::NAME_LAST:
      return sync_pb::FormField_AutofillFieldType_NAME_LAST;
    case autofill::NAME_LAST_FIRST:
      return sync_pb::FormField_AutofillFieldType_NAME_LAST_FIRST;
    case autofill::NAME_LAST_CONJUNCTION:
      return sync_pb::FormField_AutofillFieldType_NAME_LAST_CONJUNCTION;
    case autofill::NAME_LAST_SECOND:
      return sync_pb::FormField_AutofillFieldType_NAME_LAST_SECOND;
    case autofill::NAME_MIDDLE_INITIAL:
      return sync_pb::FormField_AutofillFieldType_NAME_MIDDLE_INITIAL;
    case autofill::NAME_FULL:
      return sync_pb::FormField_AutofillFieldType_NAME_FULL;
    case autofill::NAME_SUFFIX:
      return sync_pb::FormField_AutofillFieldType_NAME_SUFFIX;
    case autofill::ALTERNATIVE_FULL_NAME:
      return sync_pb::FormField_AutofillFieldType_ALTERNATIVE_FULL_NAME;
    case autofill::ALTERNATIVE_FAMILY_NAME:
      return sync_pb::FormField_AutofillFieldType_ALTERNATIVE_FAMILY_NAME;
    case autofill::ALTERNATIVE_GIVEN_NAME:
      return sync_pb::FormField_AutofillFieldType_ALTERNATIVE_GIVEN_NAME;
    case autofill::EMAIL_ADDRESS:
      return sync_pb::FormField_AutofillFieldType_EMAIL_ADDRESS;
    case autofill::USERNAME_AND_EMAIL_ADDRESS:
      return sync_pb::FormField_AutofillFieldType_USERNAME_AND_EMAIL_ADDRESS;
    case autofill::PHONE_HOME_NUMBER:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_NUMBER;
    case autofill::PHONE_HOME_NUMBER_PREFIX:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_NUMBER_PREFIX;
    case autofill::PHONE_HOME_NUMBER_SUFFIX:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_NUMBER_SUFFIX;
    case autofill::PHONE_HOME_CITY_CODE:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_CITY_CODE;
    case autofill::PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX:
      return sync_pb::
          FormField_AutofillFieldType_PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX;
    case autofill::PHONE_HOME_COUNTRY_CODE:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_COUNTRY_CODE;
    case autofill::PHONE_HOME_CITY_AND_NUMBER:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_CITY_AND_NUMBER;
    case autofill::PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX:
      return sync_pb::
          FormField_AutofillFieldType_PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX;
    case autofill::PHONE_HOME_WHOLE_NUMBER:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_WHOLE_NUMBER;
    case autofill::PHONE_HOME_EXTENSION:
      return sync_pb::FormField_AutofillFieldType_PHONE_HOME_EXTENSION;
    case autofill::ADDRESS_HOME_LINE1:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_LINE1;
    case autofill::ADDRESS_HOME_LINE2:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_LINE2;
    case autofill::ADDRESS_HOME_LINE3:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_LINE3;
    case autofill::ADDRESS_HOME_APT:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_APT;
    case autofill::ADDRESS_HOME_APT_NUM:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_APT_NUM;
    case autofill::ADDRESS_HOME_APT_TYPE:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_APT_TYPE;
    case autofill::ADDRESS_HOME_HOUSE_NUMBER_AND_APT:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_HOUSE_NUMBER_AND_APT;
    case autofill::ADDRESS_HOME_CITY:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_CITY;
    case autofill::ADDRESS_HOME_STATE:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_STATE;
    case autofill::ADDRESS_HOME_ZIP:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ZIP;
    case autofill::ADDRESS_HOME_ZIP_PREFIX:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ZIP_PREFIX;
    case autofill::ADDRESS_HOME_ZIP_SUFFIX:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ZIP_SUFFIX;
    case autofill::ADDRESS_HOME_ZIP_AND_CITY:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ZIP_AND_CITY;
    case autofill::ADDRESS_HOME_COUNTRY:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_COUNTRY;
    case autofill::ADDRESS_HOME_STREET_ADDRESS:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_STREET_ADDRESS;
    case autofill::ADDRESS_HOME_SORTING_CODE:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_SORTING_CODE;
    case autofill::ADDRESS_HOME_DEPENDENT_LOCALITY:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_DEPENDENT_LOCALITY;
    case autofill::ADDRESS_HOME_STREET_NAME:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_STREET_NAME;
    case autofill::ADDRESS_HOME_HOUSE_NUMBER:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_HOUSE_NUMBER;
    case autofill::ADDRESS_HOME_STREET_LOCATION:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_STREET_LOCATION;
    case autofill::ADDRESS_HOME_SUBPREMISE:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_SUBPREMISE;
    case autofill::ADDRESS_HOME_OTHER_SUBUNIT:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_OTHER_SUBUNIT;
    case autofill::ADDRESS_HOME_ADDRESS:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ADDRESS;
    case autofill::ADDRESS_HOME_ADDRESS_WITH_NAME:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_ADDRESS_WITH_NAME;
    case autofill::ADDRESS_HOME_FLOOR:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_FLOOR;
    case autofill::ADDRESS_HOME_LANDMARK:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_LANDMARK;
    case autofill::ADDRESS_HOME_BETWEEN_STREETS:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_BETWEEN_STREETS;
    case autofill::ADDRESS_HOME_BETWEEN_STREETS_1:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_BETWEEN_STREETS_1;
    case autofill::ADDRESS_HOME_BETWEEN_STREETS_2:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_BETWEEN_STREETS_2;
    case autofill::ADDRESS_HOME_ADMIN_LEVEL2:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_ADMIN_LEVEL2;
    case autofill::ADDRESS_HOME_OVERFLOW:
      return sync_pb::FormField_AutofillFieldType_ADDRESS_HOME_OVERFLOW;
    case autofill::ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK;
    case autofill::ADDRESS_HOME_OVERFLOW_AND_LANDMARK:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_OVERFLOW_AND_LANDMARK;
    case autofill::ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY;
    case autofill::ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK;
    case autofill::ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK:
      return sync_pb::
          FormField_AutofillFieldType_ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK;
    case autofill::DELIVERY_INSTRUCTIONS:
      return sync_pb::FormField_AutofillFieldType_DELIVERY_INSTRUCTIONS;
    case autofill::LOYALTY_MEMBERSHIP_PROGRAM:
      return sync_pb::FormField_AutofillFieldType_LOYALTY_MEMBERSHIP_PROGRAM;
    case autofill::LOYALTY_MEMBERSHIP_PROVIDER:
      return sync_pb::FormField_AutofillFieldType_LOYALTY_MEMBERSHIP_PROVIDER;
    case autofill::LOYALTY_MEMBERSHIP_ID:
      return sync_pb::FormField_AutofillFieldType_LOYALTY_MEMBERSHIP_ID;
    case autofill::EMAIL_OR_LOYALTY_MEMBERSHIP_ID:
      return sync_pb::
          FormField_AutofillFieldType_EMAIL_OR_LOYALTY_MEMBERSHIP_ID;
    case autofill::CREDIT_CARD_NAME_FULL:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_NAME_FULL;
    case autofill::CREDIT_CARD_NAME_FIRST:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_NAME_FIRST;
    case autofill::CREDIT_CARD_NAME_LAST:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_NAME_LAST;
    case autofill::CREDIT_CARD_NUMBER:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_NUMBER;
    case autofill::CREDIT_CARD_EXP_MONTH:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_EXP_MONTH;
    case autofill::CREDIT_CARD_EXP_2_DIGIT_YEAR:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_EXP_2_DIGIT_YEAR;
    case autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_EXP_4_DIGIT_YEAR;
    case autofill::CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR:
      return sync_pb::
          FormField_AutofillFieldType_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
    case autofill::CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR:
      return sync_pb::
          FormField_AutofillFieldType_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
    case autofill::CREDIT_CARD_TYPE:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_TYPE;
    case autofill::CREDIT_CARD_VERIFICATION_CODE:
      return sync_pb::FormField_AutofillFieldType_CREDIT_CARD_VERIFICATION_CODE;
    case autofill::CREDIT_CARD_STANDALONE_VERIFICATION_CODE:
      return sync_pb::
          FormField_AutofillFieldType_CREDIT_CARD_STANDALONE_VERIFICATION_CODE;
    case autofill::IBAN_VALUE:
      return sync_pb::FormField_AutofillFieldType_IBAN_VALUE;
    case autofill::COMPANY_NAME:
      return sync_pb::FormField_AutofillFieldType_COMPANY_NAME;
    case autofill::MERCHANT_PROMO_CODE:
      return sync_pb::FormField_AutofillFieldType_MERCHANT_PROMO_CODE;
    case autofill::USERNAME:
      return sync_pb::FormField_AutofillFieldType_USERNAME;
    case autofill::PASSWORD:
      return sync_pb::FormField_AutofillFieldType_PASSWORD;
    case autofill::ACCOUNT_CREATION_PASSWORD:
      return sync_pb::FormField_AutofillFieldType_ACCOUNT_CREATION_PASSWORD;
    case autofill::CONFIRMATION_PASSWORD:
      return sync_pb::FormField_AutofillFieldType_CONFIRMATION_PASSWORD;
    case autofill::SINGLE_USERNAME:
      return sync_pb::FormField_AutofillFieldType_SINGLE_USERNAME;
    case autofill::SINGLE_USERNAME_FORGOT_PASSWORD:
      return sync_pb::
          FormField_AutofillFieldType_SINGLE_USERNAME_FORGOT_PASSWORD;
    case autofill::SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES:
      return sync_pb::
          FormField_AutofillFieldType_SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES;
    case autofill::ONE_TIME_CODE:
      return sync_pb::FormField_AutofillFieldType_ONE_TIME_CODE;
    case autofill::DRIVERS_LICENSE_EXPIRATION_DATE:
      return sync_pb::
          FormField_AutofillFieldType_DRIVERS_LICENSE_EXPIRATION_DATE;
    case autofill::DRIVERS_LICENSE_ISSUE_DATE:
      return sync_pb::FormField_AutofillFieldType_DRIVERS_LICENSE_ISSUE_DATE;
    case autofill::DRIVERS_LICENSE_NUMBER:
      return sync_pb::FormField_AutofillFieldType_DRIVERS_LICENSE_NUMBER;
    case autofill::DRIVERS_LICENSE_REGION:
      return sync_pb::FormField_AutofillFieldType_DRIVERS_LICENSE_REGION;
    case autofill::PASSPORT_EXPIRATION_DATE:
      return sync_pb::FormField_AutofillFieldType_PASSPORT_EXPIRATION_DATE;
    case autofill::PASSPORT_ISSUE_DATE:
      return sync_pb::FormField_AutofillFieldType_PASSPORT_ISSUE_DATE;
    case autofill::PASSPORT_ISSUING_COUNTRY:
      return sync_pb::FormField_AutofillFieldType_PASSPORT_ISSUING_COUNTRY;
    case autofill::PASSPORT_NUMBER:
      return sync_pb::FormField_AutofillFieldType_PASSPORT_NUMBER;
    case autofill::VEHICLE_LICENSE_PLATE:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_LICENSE_PLATE;
    case autofill::VEHICLE_MAKE:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_MAKE;
    case autofill::VEHICLE_MODEL:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_MODEL;
    case autofill::VEHICLE_PLATE_STATE:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_PLATE_STATE;
    case autofill::VEHICLE_VIN:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_VIN;
    case autofill::VEHICLE_YEAR:
      return sync_pb::FormField_AutofillFieldType_VEHICLE_YEAR;
    case autofill::NATIONAL_ID_CARD_NUMBER:
      return sync_pb::FormField_AutofillFieldType_NATIONAL_ID_CARD_NUMBER;
    case autofill::NATIONAL_ID_CARD_EXPIRATION_DATE:
      return sync_pb::
          FormField_AutofillFieldType_NATIONAL_ID_CARD_EXPIRATION_DATE;
    case autofill::NATIONAL_ID_CARD_ISSUE_DATE:
      return sync_pb::FormField_AutofillFieldType_NATIONAL_ID_CARD_ISSUE_DATE;
    case autofill::NATIONAL_ID_CARD_ISSUING_COUNTRY:
      return sync_pb::
          FormField_AutofillFieldType_NATIONAL_ID_CARD_ISSUING_COUNTRY;
    case autofill::REDRESS_NUMBER:
      return sync_pb::FormField_AutofillFieldType_REDRESS_NUMBER;
    case autofill::KNOWN_TRAVELER_NUMBER:
      return sync_pb::FormField_AutofillFieldType_KNOWN_TRAVELER_NUMBER;
    case autofill::KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE:
      return sync_pb::
          FormField_AutofillFieldType_KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE;
    case autofill::FLIGHT_RESERVATION_FLIGHT_NUMBER:
      return sync_pb::
          FormField_AutofillFieldType_FLIGHT_RESERVATION_FLIGHT_NUMBER;
    case autofill::FLIGHT_RESERVATION_TICKET_NUMBER:
      return sync_pb::
          FormField_AutofillFieldType_FLIGHT_RESERVATION_TICKET_NUMBER;
    case autofill::FLIGHT_RESERVATION_CONFIRMATION_CODE:
      return sync_pb::
          FormField_AutofillFieldType_FLIGHT_RESERVATION_CONFIRMATION_CODE;
    case autofill::FLIGHT_RESERVATION_DEPARTURE_AIRPORT:
      return sync_pb::
          FormField_AutofillFieldType_FLIGHT_RESERVATION_DEPARTURE_AIRPORT;
    case autofill::FLIGHT_RESERVATION_ARRIVAL_AIRPORT:
      return sync_pb::
          FormField_AutofillFieldType_FLIGHT_RESERVATION_ARRIVAL_AIRPORT;
    case autofill::ORDER_ID:
      return sync_pb::FormField_AutofillFieldType_ORDER_ID;
    case autofill::ORDER_DATE:
      return sync_pb::FormField_AutofillFieldType_ORDER_DATE;
    case autofill::ORDER_MERCHANT_NAME:
      return sync_pb::FormField_AutofillFieldType_ORDER_MERCHANT_NAME;
    case autofill::SHIPMENT_TRACKING_NUMBER:
      return sync_pb::FormField_AutofillFieldType_SHIPMENT_TRACKING_NUMBER;

    // Non-fillable types handled earlier.
    case autofill::NO_SERVER_DATA:
    case autofill::UNKNOWN_TYPE:
    case autofill::EMPTY_TYPE:
    case autofill::AMBIGUOUS_TYPE:
    case autofill::MERCHANT_EMAIL_SIGNUP:
    case autofill::PRICE:
    case autofill::NUMERIC_QUANTITY:
    case autofill::SEARCH_TERM:
    case autofill::NOT_PASSWORD:
    case autofill::NOT_USERNAME:
    case autofill::NOT_ACCOUNT_CREATION_PASSWORD:
    case autofill::NEW_PASSWORD:
    case autofill::PROBABLY_NEW_PASSWORD:
    case autofill::NOT_NEW_PASSWORD:
    case autofill::FLIGHT_RESERVATION_DEPARTURE_DATE:
    case autofill::MAX_VALID_FIELD_TYPE:
      NOTREACHED();
  }
  NOTREACHED();
}

namespace {
sync_pb::FormField FormFieldToProto(const PageContext::FormField& field) {
  sync_pb::FormField pb_field;
  pb_field.set_id_attribute(base::UTF16ToUTF8(field.id_attribute));
  pb_field.set_name_attribute(base::UTF16ToUTF8(field.name_attribute));
  pb_field.set_form_control_type(
      std::string(autofill::FormControlTypeToString(field.form_control_type)));
  pb_field.set_value(base::UTF16ToUTF8(field.value));
  pb_field.set_form_signature(field.autofill_signature.form_signature.value());
  pb_field.set_field_signature(
      field.autofill_signature.field_signature.value());
  for (sync_pb::FormField_AutofillFieldType type : field.autofill_types) {
    pb_field.add_autofill_types(type);
  }

  return pb_field;
}

std::optional<PageContext::FormField> FormFieldFromProto(
    const sync_pb::FormField& pb_field) {
  std::optional<autofill::FormControlType> form_control_type =
      autofill::StringToFormControlTypeDiscouraged(
          pb_field.form_control_type());
  if (!form_control_type.has_value()) {
    return std::nullopt;
  }

  PageContext::FormField field;
  field.id_attribute = base::UTF8ToUTF16(pb_field.id_attribute());
  field.name_attribute = base::UTF8ToUTF16(pb_field.name_attribute());
  field.form_control_type = *form_control_type;
  field.value = base::UTF8ToUTF16(pb_field.value());
  field.autofill_signature.form_signature =
      autofill::FormSignature(pb_field.form_signature());
  field.autofill_signature.field_signature =
      autofill::FieldSignature(pb_field.field_signature());
  for (int i = 0; i < pb_field.autofill_types_size(); ++i) {
    field.autofill_types.insert(pb_field.autofill_types(i));
  }

  return field;
}

sync_pb::FormFieldInfo FormFieldInfoToProto(
    const PageContext::FormFieldInfo& info) {
  sync_pb::FormFieldInfo pb_info;
  for (const auto& field : info.fields) {
    *pb_info.add_fields() = FormFieldToProto(field);
  }
  return pb_info;
}

PageContext::FormFieldInfo FormFieldInfoFromProto(
    const sync_pb::FormFieldInfo& pb_info) {
  PageContext::FormFieldInfo info;
  for (const auto& pb_field : pb_info.fields()) {
    if (std::optional<PageContext::FormField> field =
            FormFieldFromProto(pb_field)) {
      info.fields.push_back(std::move(*field));
    }
  }
  return info;
}

sync_pb::TextFragmentData TextFragmentDataToProto(
    const TextFragmentData& text_fragment) {
  sync_pb::TextFragmentData pb_text_fragment;
  pb_text_fragment.set_text_start(text_fragment.text_start);
  pb_text_fragment.set_text_end(text_fragment.text_end);
  pb_text_fragment.set_prefix(text_fragment.prefix);
  pb_text_fragment.set_suffix(text_fragment.suffix);
  return pb_text_fragment;
}

TextFragmentData TextFragmentDataFromProto(
    const sync_pb::TextFragmentData& pb_text_fragment) {
  return TextFragmentData(pb_text_fragment.text_start(),
                          pb_text_fragment.text_end(),
                          pb_text_fragment.prefix(), pb_text_fragment.suffix());
}

sync_pb::ScrollPosition ScrollPositionToProto(
    const ScrollPosition& scroll_position) {
  sync_pb::ScrollPosition pb_scroll_position;
  if (!scroll_position.text_fragment.IsEmpty()) {
    *pb_scroll_position.mutable_text_fragment() =
        TextFragmentDataToProto(scroll_position.text_fragment);
  }
  return pb_scroll_position;
}

ScrollPosition ScrollPositionFromProto(
    const sync_pb::ScrollPosition& pb_scroll_position) {
  ScrollPosition scroll_position;
  if (pb_scroll_position.has_text_fragment()) {
    scroll_position.text_fragment =
        TextFragmentDataFromProto(pb_scroll_position.text_fragment());
  }
  return scroll_position;
}

}  // namespace

sync_pb::PageContext PageContextToProto(const PageContext& context) {
  sync_pb::PageContext pb_page_context;
  if (!context.form_field_info.fields.empty()) {
    *pb_page_context.mutable_form_field_info() =
        FormFieldInfoToProto(context.form_field_info);
  }
  if (!context.scroll_position.IsEmpty()) {
    *pb_page_context.mutable_scroll_position() =
        ScrollPositionToProto(context.scroll_position);
  }
  return pb_page_context;
}

PageContext PageContextFromProto(const sync_pb::PageContext& pb_page_context) {
  PageContext page_context;
  page_context.form_field_info =
      FormFieldInfoFromProto(pb_page_context.form_field_info());
  if (pb_page_context.has_scroll_position()) {
    page_context.scroll_position =
        ScrollPositionFromProto(pb_page_context.scroll_position());
  }
  return page_context;
}

}  // namespace send_tab_to_self
