/*
 * 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). Fox example, this would be 1 for NANPA countries, and 33 for France.
  required int32 country_code = 1;

// National (significant) Number is defined in International Telecommunication Union Recommendation
// E.164. It is a language/country-neutral representation of a phone number at a country level. For
// countries which have the concept of Area Code, the National (significant) Number contains the
// area code. It contains a maximum number of digits which equal to 15 - n, where n is the number of
// digits of the country code. Take note that National (significant) Number does not contain
// National(trunk) prefix. Obviously, as a uint64, it will never contain any formatting (hypens,
// 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). However, only ASCII digits should be stored here.
  optional string extension = 3;

// In some countries, the national (significant) number starts with a "0" 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.
//
// This field can be safely ignored (there is no need to set it) for most countries. Some limited
// amount of countries behave like Italy - for these cases, if the leading zero of a number would be
// retained even when dialling internationally, set this flag to true.
//
// Clients who use the parsing functionality of the i18n phone number libraries
// will have this field set if necessary automatically.
  optional bool italian_leading_zero = 4;

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

// 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 {
    // The country_code is derived based on a phone number with a leading "+", e.g. the French
    // number "+33 (0)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 (0)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 (0)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 "(0)1 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
