/*
 * Copyright (C) 2009 Google Inc.
 *
 * 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 holding metadata for international
// telephone numbers.
// @author Shaopeng Jia

syntax = "proto2";

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

message NumberFormat {
  // pattern is a regex that is used to match the national (significant)
  // number. For example, the pattern "(20)(\d{4})(\d{4})" will match number
  // "2070313000", which is the national (significant) number for Google London.
  // Note the presence of the parentheses, which are capturing groups what
  // specifies the grouping of numbers.
  required string pattern = 1;

  // format specifies how the national (significant) number matched by
  // pattern should be formatted.
  // Using the same example as above, format could contain "$1 $2 $3",
  // meaning that the number should be formatted as "20 7031 3000".
  // Each $x are replaced by the numbers captured by group x in the
  // regex specified by pattern.
  required string format = 2;

  // This field is a regex that is used to match a certain number of digits
  // at the beginning of the national (significant) number. When the match is
  // successful, the accompanying pattern and format should be used to format
  // this number. For example, if leading_digits="[1-3]|44", then all the
  // national numbers starting with 1, 2, 3 or 44 should be formatted using the
  // accompanying pattern and format.
  //
  // The first leadingDigitsPattern matches up to the first three digits of the
  // national (significant) number; the next one matches the first four digits,
  // then the first five and so on, until the leadingDigitsPattern can uniquely
  // identify one pattern and format to be used to format the number.
  //
  // In the case when only one formatting pattern exists, no
  // leading_digits_pattern is needed.
  repeated string leading_digits_pattern = 3;

  // This field specifies how the national prefix ($NP) together with the first
  // group ($FG) in the national significant number should be formatted in
  // the NATIONAL format when a national prefix exists for a certain country.
  // For example, when this field contains "($NP$FG)", a number from Beijing,
  // China (whose $NP = 0), which would by default be formatted without
  // national prefix as 10 1234 5678 in NATIONAL format, will instead be
  // formatted as (010) 1234 5678; to format it as (0)10 1234 5678, the field
  // would contain "($NP)$FG". Note $FG should always be present in this field,
  // but $NP can be omitted. For example, having "$FG" could indicate the
  // number should be formatted in NATIONAL format without the national prefix.
  // This is commonly used to override the rule from generalDesc.
  //
  // When this field is missing, a number will be formatted without national
  // prefix in NATIONAL format. This field does not affect how a number
  // is formatted in other formats, such as INTERNATIONAL.
  optional string national_prefix_formatting_rule = 4;

  // This field specifies how any carrier code ($CC) together with the first
  // group ($FG) in the national significant number should be formatted
  // when formatWithCarrierCode is called, if carrier codes are used for a
  // certain country.
  optional string domestic_carrier_code_formatting_rule = 5;
}

message PhoneNumberDesc {
  // The national_number_pattern is the pattern that a valid national
  // significant number would match. This specifies information such as its
  // total length and leading digits.
  optional string national_number_pattern = 2;

  // The possible_number_pattern represents what a potentially valid phone
  // number for this region may be written as. This is a superset of the
  // national_number_pattern above and includes numbers that have the area code
  // omitted. Typically the only restrictions here are in the number of digits.
  // This could be used to highlight tokens in a text that may be a phone
  // number, or to quickly prune numbers that could not possibly be a phone
  // number for this locale.
  optional string possible_number_pattern = 3;

  // An example national significant number for the specific type. It should
  // not contain any formatting information.
  optional string example_number = 6;
}

message PhoneMetadata {
  // The general_desc contains information which is a superset of descriptions
  // for all types of phone numbers. If any element is missing in the
  // description of a specific type in the XML file, the element will inherit
  // from its counterpart in the general_desc. Every locale is assumed to have
  // fixed line and mobile numbers - if these types are missing in the XML
  // file, they will inherit all fields from the general_desc. For all other
  // types, if the whole type is missing in the xml file, it will be given a
  // national_number_pattern of "NA" and a possible_number_pattern of "NA".
  required PhoneNumberDesc general_desc = 1;
  required PhoneNumberDesc fixed_line = 2;
  required PhoneNumberDesc mobile = 3;
  required PhoneNumberDesc toll_free = 4;
  required PhoneNumberDesc premium_rate = 5;
  required PhoneNumberDesc shared_cost = 6;
  required PhoneNumberDesc personal_number = 7;
  required PhoneNumberDesc voip = 8;

  // The ISO 3166-1 alpha-2 representation of a country/region
  required string id = 9;

  // The country calling code that one would dial from overseas when trying to
  // dial a phone number in this country. For example, this would be "64" for
  // New Zealand.
  required int32 country_code = 10;

  // The international_prefix of country A is the number that needs to be
  // dialled from country A to another country (country B). This is followed
  // by the country code for country B. Note that some countries may have more
  // than one international prefix, and for those cases, a regular expression
  // matching the international prefixes will be stored in this field.
  required string international_prefix = 11;

  // If more than one international prefix is present, a preferred prefix can
  // be specified here for out-of-country formatting purposes. If this field is
  // not present, and multiple international prefixes are present, then "+"
  // will be used instead.
  optional string preferred_international_prefix = 17;

  // The national prefix of country A is the number that needs to be dialled
  // before the national significant number when dialling internally. This
  // would not be dialled when dialling internationally. For example, in New
  // Zealand, the number that would be locally dialled as 09 345 3456 would be
  // dialled from overseas as +64 9 345 3456. In this case, 0 is the national
  // prefix.
  optional string national_prefix = 12;

  // The preferred prefix when specifying an extension in this country. This is
  // used for formatting only, and if this is not specified, a suitable default
  // should be used instead. For example, if you wanted extensions to be
  // formatted in the following way:
  // 1 (365) 345 445 ext. 2345
  // " ext. "  should be the preferred extension prefix.
  optional string preferred_extn_prefix = 13;

  // This field is used for cases where the national prefix of a country
  // contains a carrier selection code, and is written in the form of a
  // regular expression. For example, to dial the number 2222-2222 in
  // Fortaleza, Brazil (area code 85) using the long distance carrier Oi
  // (selection code 31), one would dial 0 31 85 2222 2222. Assuming the
  // only other possible carrier selection code is 32, the field will
  // contain "03[12]".
  //
  // When it is missing from the XML file, this field inherits the value of
  // national_prefix, if that is present.
  optional string national_prefix_for_parsing = 15;

  // This field is only populated and used under very rare situations.
  // For example, mobile numbers in Argentina are written in two completely
  // different ways when dialed in-country and out-of-country
  // (e.g. 0343 15 555 1212 is exactly the same number as +54 9 343 555 1212).
  // This field is used together with national_prefix_for_parsing to transform
  // the number into a particular representation for storing in the phonenumber
  // proto buffer in those rare cases.
  optional string national_prefix_transform_rule = 16;

  // Specifies whether the mobile and fixed-line patterns are the same or not.
  // This is used to speed up determining phone number type in countries where
  // these two types of phone numbers can never be distinguished.
  optional bool same_mobile_and_fixed_line_pattern = 18 [default=false];

  // Note that the number format here is used for formatting only, not parsing.
  // Hence all the varied ways a user *may* write a number need not be recorded
  // - just the ideal way we would like to format it for them. When this element
  // is absent, the national significant number will be formatted as a whole
  // without any formatting applied.
  repeated NumberFormat number_format = 19;

  // This field is populated only when the national significant number is
  // formatted differently when it forms part of the INTERNATIONAL format
  // and NATIONAL format. A case in point is mobile numbers in Argentina:
  // The number, which would be written in INTERNATIONAL format as
  // +54 9 343 555 1212, will be written as 0343 15 555 1212 for NATIONAL
  // format. In this case, the prefix 9 is inserted when dialling from
  // overseas, but otherwise the prefix 0 and the carrier selection code
  // 15 (inserted after the area code of 343) is used.
  repeated NumberFormat intl_number_format = 20;

  // This field is set when this country is considered to be the main country
  // for a calling code. It may not be set by more than one country with the
  // same calling code, and it should not be set by countries with a unique
  // calling code. This can be used to indicate that "GB" is the main country
  // for the calling code "44" for example, rather than Jersey or the Isle of
  // Man.
  optional bool main_country_for_code = 22 [default=false];

  // This field is populated only for countries or regions that share a country
  // calling code. If a number matches this pattern, it could belong to this
  // region. This is not intended as a replacement for IsValidForRegion, and
  // does not mean the number must come from this region (for example, 800
  // numbers are valid for all NANPA countries.) This field should be a regular
  // expression of the expected prefix match.
  optional string leading_digits = 23;
}

message PhoneMetadataCollection {
  repeated PhoneMetadata metadata = 1;
}
