/*
 * Copyright (C) 2009 The Libphonenumber Authors
 *
 * 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.
 */

// Definition of protocol buffer for representing international telephone numbers.
// @author Shaopeng Jia

syntax = "proto2";

option java_package = "com.google.i18n.phonenumbers";
option optimize_for = LITE_RUNTIME;

package i18n.phonenumbers;

message PhoneNumber {
  // The country calling code for this number, as defined by the International
  // Telecommunication Union (ITU). For example, this would be 1 for NANPA
  // countries, and 33 for France.
  required int32 country_code = 1;

  // The National (significant) Number, as defined in International
  // Telecommunication Union (ITU) Recommendation E.164, without any leading
  // zero. The leading-zero is stored separately if required, since this is an
  // uint64 and hence cannot store such information. Do not use this field
  // directly: if you want the national significant number, call the
  // getNationalSignificantNumber method of PhoneNumberUtil.
  //
  // For countries which have the concept of an "area code" or "national
  // destination code", this is included in the National (significant) Number.
  // Although the ITU says the maximum length should be 15, we have found longer
  // numbers in some countries e.g. Germany.
  // Note that the National (significant) Number does not contain the National
  // (trunk) prefix. Obviously, as a uint64, it will never contain any
  // formatting (hyphens, spaces, parentheses), nor any alphanumeric spellings.
  required uint64 national_number = 2;

  // Extension is not standardized in ITU recommendations, except for being
  // defined as a series of numbers with a maximum length of 40 digits. It is
  // defined as a string here to accommodate for the possible use of a leading
  // zero in the extension (organizations have complete freedom to do so, as
  // there is no standard defined). Other than digits, some other dialling
  // characters such as "," (indicating a wait) may be stored here.
  optional string extension = 3;

  // In some countries, the national (significant) number starts with one or
  // more "0"s without this being a national prefix or trunk code of some kind.
  // For example, the leading zero in the national (significant) number of an
  // Italian phone number indicates the number is a fixed-line number.  There
  // have been plans to migrate fixed-line numbers to start with the digit two
  // since December 2000, but it has not happened yet. See
  // http://en.wikipedia.org/wiki/%2B39 for more details.
  //
  // These fields can be safely ignored (there is no need to set them) for most
  // countries. Some limited number of countries behave like Italy - for these
  // cases, if the leading zero(s) of a number would be retained even when
  // dialling internationally, set this flag to true, and also set the number of
  // leading zeros.
  //
  // Clients who use the parsing functionality of the i18n phone
  // number libraries will have these fields set if necessary automatically.
  optional bool italian_leading_zero = 4;
  optional int32 number_of_leading_zeros = 8 [ default = 1 ];

  // The next few fields are non-essential fields for a phone number. They
  // retain extra information about the form the phone number was in when it was
  // provided to us to parse. They can be safely ignored by most clients. To
  // populate them, call parseAndKeepRawInput on PhoneNumberUtil.

  // This field is used to store the raw input string containing phone numbers
  // before it was canonicalized by the library. For example, it could be used
  // to store alphanumerical numbers such as "1-800-GOOG-411".
  optional string raw_input = 5;

  // The source from which the country_code is derived. This is not set in the
  // general parsing method, but in the method that parses and keeps raw_input.
  // New fields could be added upon request.
  enum CountryCodeSource {
    // Default value returned if this is not set, because the phone number was
    // created using parse, not parseAndKeepRawInput. hasCountryCodeSource will
    // return false if this is the case.
    UNSPECIFIED = 0;

    // The country_code is derived based on a phone number with a leading "+",
    // e.g. the French number "+33 1 42 68 53 00".
    FROM_NUMBER_WITH_PLUS_SIGN = 1;

    // The country_code is derived based on a phone number with a leading IDD,
    // e.g. the French number "011 33 1 42 68 53 00", as it is dialled from US.
    FROM_NUMBER_WITH_IDD = 5;

    // The country_code is derived based on a phone number without a leading
    // "+", e.g. the French number "33 1 42 68 53 00" when defaultCountry is
    // supplied as France.
    FROM_NUMBER_WITHOUT_PLUS_SIGN = 10;

    // The country_code is derived NOT based on the phone number itself, but
    // from the defaultCountry parameter provided in the parsing function by the
    // clients. This happens mostly for numbers written in the national format
    // (without country code). For example, this would be set when parsing the
    // French number "01 42 68 53 00", when defaultCountry is supplied as
    // France.
    FROM_DEFAULT_COUNTRY = 20;
  }

  // The source from which the country_code is derived.
  optional CountryCodeSource country_code_source = 6;

  // The carrier selection code that is preferred when calling this phone number
  // domestically. This also includes codes that need to be dialed in some
  // countries when calling from landlines to mobiles or vice versa. For
  // example, in Columbia, a "3" needs to be dialed before the phone number
  // itself when calling from a mobile phone to a domestic landline phone and
  // vice versa.
  //
  // Note this is the "preferred" code, which means other codes may work as
  // well.
  optional string preferred_domestic_carrier_code = 7;
}

// Examples:
//
// Google MTV, +1 650-253-0000, (650) 253-0000
// country_code: 1
// national_number: 6502530000
//
// Google Paris, +33 (0)1 42 68 53 00, 01 42 68 53 00
// country_code: 33
// national_number: 142685300
//
// Google Beijing, +86-10-62503000, (010) 62503000
// country_code: 86
// national_number: 1062503000
//
// Google Italy, +39 02-36618 300, 02-36618 300
// country_code: 39
// national_number: 236618300
// italian_leading_zero: true
