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

// Use the <code>chrome.autofillPrivate</code> API to add, remove, or update
// autofill data from the settings UI.
namespace autofillPrivate {
  // Fields used as part of an address.
  enum AddressField {
    FULL_NAME,
    COMPANY_NAME,
    ADDRESS_LINES,
    ADDRESS_LEVEL_1,
    ADDRESS_LEVEL_2,
    ADDRESS_LEVEL_3,
    POSTAL_CODE,
    SORTING_CODE,
    COUNTRY_CODE
  };

  // Metadata about an autofill entry (address or credit card) which is used to
  // render a summary list of all entries.
  dictionary AutofillMetadata {
    // Short summary of the address which is displayed in the UI; an
    // undefined value means that this entry has just been created on the client
    // and has not yet been given a summary.
    DOMString summaryLabel;

    // Short, secondary summary of the address which is displalyed in the UI; an
    // undefined value means that this entry has just been created on the client
    // and has not yet been given a summary.
    DOMString? summarySublabel;

    // Whether the entry is locally owned by Chrome (as opposed to being a
    // profile synced down from the server). Non-local entries may not be
    // editable.
    boolean? isLocal;

    // For credit cards, whether this is a full copy of the card
    boolean? isCached;
  };

  // An address entry which can be saved in the autofill section of the
  // settings UI.
  dictionary AddressEntry {
    // Globally unique identifier for this entry.
    DOMString? guid;

    DOMString[]? fullNames;

    DOMString? companyName;

    // Street address (multiple lines, newlines preserved).
    DOMString? addressLines;

    // The broadest administrative level in the address, i.e. the province
    // within which the locality is found; for example, in the US, this would be
    // the state; in Switzerland it would be the canton; in the UK, the post
    // town.
    DOMString? addressLevel1;

    // The second administrative level, in addresses with two or more
    // administrative levels; in the countries with two administrative levels,
    // this would typically be the city, town, village, or other locality within
    // which the relevant street address is found.
    DOMString? addressLevel2;

    // The third administrative level, in addresses with three or more
    // administrative levels.
    DOMString? addressLevel3;

    // Postal code, post code, ZIP code, CEDEX code (if CEDEX, append "CEDEX",
    // and the arrondissement, if relevant, to the address-level2 field).
    DOMString? postalCode;

    // A sorting code is similar to a postal code. However, whereas a postal
    // code normally refers to a single geographical location, a sorting code
    // often does not. Instead, a sorting code is assigned to an organization,
    // which might be geographically distributed. The most prominent example of
    // a sorting code system is CEDEX in France.
    DOMString? sortingCode;

    // A two-character string representing the address' country. See
    // autofill_country.cc for a list of valid codes.
    DOMString? countryCode;

    DOMString[]? phoneNumbers;

    DOMString[]? emailAddresses;

    DOMString? languageCode;

    AutofillMetadata? metadata;
  };

  // An entry representing a country and its code.
  dictionary CountryEntry {
    // The internationalized name of the country.
    DOMString? name;

    // A two-character string representing the country.
    DOMString? countryCode;
  };

  // A component to be shown in an address editor. Different countries have
  // different components to their addresses.
  dictionary AddressComponent {
    // The field type.
    AddressField field;

    // The name of the field.
    DOMString fieldName;

    // A hint for the UI regarding whether the input is likely to be long.
    boolean isLongField;

    // A placeholder for the text field to be used when the user has not yet
    // input a value for the field.
    DOMString? placeholder;
  };

  // A row of address components. Each component in a row should be shown in the
  // same row in the UI. For example, city, state, and zip code are all included
  // on the same line for US addresses.
  dictionary AddressComponentRow {
    AddressComponent[] row;
  };

  // The address components for a given country code. Each entry in |components|
  // constitutes a row in the UI, while each inner array contains the list of
  // components to use in that row. For example, city, state, and zip code are
  // all included on the same line for US addresses. This dictionary also
  // includes the associated language code.
  dictionary AddressComponents {
    // The components.
    AddressComponentRow[] components;

    // The language code.
    DOMString languageCode;
  };

  // A credit card entry which can be saved in the autofill section of the
  // settings UI.
  dictionary CreditCardEntry {
    // Globally unique identifier for this entry.
    DOMString? guid;

    // Name of the person who owns the credit card.
    DOMString? name;

    // Credit card number.
    DOMString? cardNumber;

    // Month as 2-character string ("01" = January, "12" = December).
    DOMString? expirationMonth;

    // Year as a 4-character string (as in "2015").
    DOMString? expirationYear;

    AutofillMetadata? metadata;
  };

  // Parameters to be passed to validatePhoneNumbers().
  dictionary ValidatePhoneParams {
    // The phone numbers to validate.
    DOMString[] phoneNumbers;

    // The index into |phoneNumbers| at which the newly-added/edited phone
    // number resides.
    long indexOfNewNumber;

    // A two-character string representing the address' country. See
    // autofill_country.cc for a list of valid codes.
    DOMString countryCode;
  };

  callback GetCountryListCallback = void(CountryEntry[] countries);
  callback GetAddressComponentsCallback = void(AddressComponents components);
  callback GetAddressListCallback = void(AddressEntry[] entries);
  callback ValidatePhoneNumbersCallback =
      void(DOMString[] validatedPhoneNumbers);
  callback GetCreditCardListCallback = void(CreditCardEntry[] entries);

  interface Functions {
    // Saves the given address. If |address| has an empty string as its ID, it
    // will be assigned a new one and added as a new entry.
    // |address|: The address entry to save.
    static void saveAddress(AddressEntry address);

    // Gets the list of all countries.
    // |callback|: Callback which will be called with the countries.
    static void getCountryList(GetCountryListCallback callback);

    // Gets the address components for a given country code.
    // |countryCode|: A two-character string representing the address' country
    //     whose components should be returned. See autofill_country.cc for a
    //     list of valid codes.
    // |callback|: Callback which will be called with components.
    static void getAddressComponents(DOMString countryCode,
        GetAddressComponentsCallback callback);

    // Gets the list of addresses.
    // |callback|: Callback which will be called with the list of addresses.
    static void getAddressList(GetAddressListCallback callback);

    // Saves the given credit card. If |card| has an empty string as its
    // ID, it will be assigned a new one and added as a new entry.
    // |card|: The card entry to save.
    static void saveCreditCard(CreditCardEntry card);

    // Removes the entry (address or credit card) with the given ID.
    // |guid|: ID of the entry to remove. 
    static void removeEntry(DOMString guid);

    // Validates a newly-added phone number and invokes the callback with a list
    // of validated numbers. Note that if the newly-added number was invalid, it
    // will not be returned in the list of valid numbers.
    // |params|: The parameters to this function.
    // |callback|: Callback which will be called with validated phone numbers.
    static void validatePhoneNumbers(ValidatePhoneParams params,
        ValidatePhoneNumbersCallback callback);

    // Gets the list of credit cards.
    // |callback|: Callback which will be called with the list of credit cards.
    static void getCreditCardList(GetCreditCardListCallback callback);

    // Clears the data associated with a wallet card which was saved
    // locally so that the saved copy is masked (e.g., "Card ending
    // in 1234").
    // |guid|: GUID of the credit card to mask.
    static void maskCreditCard(DOMString guid);
  };

  interface Events {
    // Fired when the address list has changed, meaning that an entry has been
    // added, removed, or changed.
    // |entries| The updated list of entries.
    static void onAddressListChanged(AddressEntry[] entries);

    // Fired when the credit card list has changed, meaning that an entry has
    // been added, removed, or changed.
    // |entries| The updated list of entries.
    static void onCreditCardListChanged(CreditCardEntry[] entries);
  };
};
