"""Base address properties"""
interface Address {
  """Name prefix"""
  prefix: String

  """Firstname"""
  firstname: String

  """Name prefix"""
  middlename: String

  """Lastname"""
  lastname: String

  """Name suffix"""
  suffix: String

  """Company"""
  company: String

  """Street"""
  street: [String!]!

  """City"""
  city: String

  """Postcode"""
  postcode: String

  """Region"""
  region: AddressRegion

  """Country"""
  country: Country!

  """Telephone"""
  telephone: String
}

"""Object containing a partially or fully populated address"""
input AddressInput {
  """Name prefix"""
  prefix: String

  """Firstname"""
  firstname: String

  """Name prefix"""
  middlename: String

  """Lastname"""
  lastname: String

  """Name suffix"""
  suffix: String

  """Company"""
  company: String

  """Street, one line per array item"""
  street: [String!]

  """City"""
  city: String

  """Postcode"""
  postcode: String

  """Region code"""
  regionCode: ID

  """Country code"""
  countryCode: ID

  """Telephone"""
  telephone: String
}

"""An address region"""
type AddressRegion {
  """Region code, ISO 3166-2"""
  code: String!

  """Region name"""
  name: String!
}

"""Enum representing possible validation errors for an address"""
enum AddressValidationError {
  """City is missing a value"""
  errorMissingCity

  """Country is missing a value"""
  errorMissingCountry

  """Firstname is missing a value"""
  errorMissingFirstname

  """Lastname is missing a value"""
  errorMissingLastname

  """Postcode is missing a value"""
  errorMissingPostcode

  """Region is missing a value"""
  errorMissingRegion

  """Street is missing a value"""
  errorMissingStreet

  """Telephone is missing a value"""
  errorMissingTelephone
}

"""An option and its product selections for a bundle product"""
type BundleOption {
  """Bundle option id, used to select an option when adding a quote item"""
  optionId: ID!

  """If picking an option is required"""
  required: Boolean!

  """The type of input used for this option"""
  type: BundleOptionType!

  """Title for the option"""
  title: String!

  """The list of product selections for this option"""
  selections: [BundleSelection!]!
}

"""The type of bundle option input"""
enum BundleOptionType {
  """
  A checkbox should be used, or a yes-no selector, to pick zero or more selections
  """
  checkbox

  """
  A radio button should be used to pick a single selection from the option
  """
  radio

  """
  A dropdown should be used for the option allowing the customer to pick one selection
  """
  select

  """
  A multiselect should be used for the option allowing the customer to pick zero or more selections
  """
  multi
}

"""A selection for a bundle option which can be picked by the customer"""
type BundleSelection {
  """Selection id to pick this product"""
  selectionId: ID!

  """If this selection is included by default"""
  isDefault: Boolean!

  """The number of items this selection has by default"""
  qty: Float!

  """If the qty can be modified"""
  isQtyFixed: Boolean!

  """The price of this option"""
  price: ProductPrice!

  """The product for this bundle selection"""
  product: ProductOption!
}

"""A category containing products"""
type Category {
  """Description"""
  description: String

  """Image"""
  image: ImageData

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeywords: String

  """Page Title"""
  metaTitle: String

  """Name"""
  name: String!

  """Child-categories which are included in the menu"""
  children: [Category!]!

  """Category display mode"""
  displayMode: CategoryDisplayMode

  """Parent category, if any"""
  parent: Category

  """List of products in this category"""
  products(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show, default 1"""
    page: Int = 1
  ): PaginatedProducts!

  """Category url"""
  url: String!
}

"""Setting for category display mode"""
enum CategoryDisplayMode {
  """Products only"""
  PRODUCTS

  """Static block only"""
  PAGE

  """Static block and products"""
  PRODUCTS_AND_PAGE
}

"""An attribute which can be configured on configurable products"""
type ConfigurationAttribute {
  """Attribute property"""
  attribute: String!

  """Attribute label"""
  label: String!
}

"""
A child-product/configuration-item available to pick for a configurable product
"""
type ConfigurationOptionItem {
  """Product final price"""
  price: ProductPrice!

  """The product"""
  product: ProductOption!

  """List of values this item fulfills"""
  values: [ConfigurationOptionItemValue!]!
}

"""A value for the configurable attribute on configurable products"""
type ConfigurationOptionItemValue {
  """Attribute property this value belongs to"""
  attribute: String!

  """Attribute value"""
  value: String!
}

"""Available options and their attributes for a configurable product"""
type ConfigurationOptions {
  """List of configurable attributes"""
  attributes: [ConfigurationAttribute!]!

  """List of items to pick from"""
  items: [ConfigurationOptionItem!]!
}

"""A country in an address"""
type Country {
  """Country code, ISO 3166-2"""
  code: ID!

  """Country name for the current locale"""
  name: String!
}

"""Type containing the result of createCustomerAddress"""
type CreateCustomerAddressResult {
  """The type of result"""
  result: CreateCustomerAddressResultType!

  """The customer result, if no error occurred"""
  customer: Customer

  """
  The set address customer address, if no error occurred or if address failed to validate
  """
  address: CustomerAddress

  """List of validation errors if the address failed to validate"""
  validationErrors: [AddressValidationError!]!
}

"""Type of result from removeCustomerAddress mutation"""
enum CreateCustomerAddressResultType {
  """Address"""
  success

  """Customer is not logged in."""
  errorNotLoggedIn

  """The supplied address id is invalid."""
  errorInvalidAddress
}

"""Type containing customer information"""
type Customer {
  """Date Of Birth"""
  dob: String

  """First Name"""
  firstname: String!

  """Gender"""
  gender: String

  """Last Name"""
  lastname: String!

  """Middle Name/Initial"""
  middlename: String

  """Prefix"""
  prefix: String

  """Suffix"""
  suffix: String

  """List of addresses for the customer."""
  addresses: [CustomerAddress!]!

  """Customer email"""
  email: String!

  """Customer created date"""
  createdAt: String!
}

"""A customer address"""
type CustomerAddress implements Address {
  """Name prefix"""
  prefix: String

  """Firstname"""
  firstname: String

  """Name prefix"""
  middlename: String

  """Lastname"""
  lastname: String

  """Name suffix"""
  suffix: String

  """Company"""
  company: String

  """Street"""
  street: [String!]!

  """City"""
  city: String

  """Postcode"""
  postcode: String

  """Region"""
  region: AddressRegion

  """Country"""
  country: Country!

  """Telephone"""
  telephone: String

  """Address id, used to update/delete"""
  id: ID!

  """If the address is the default billing address"""
  isDefaultBilling: Boolean!

  """If the address is the default shipping address"""
  isDefaultShipping: Boolean!
}

"""Media Gallery Image"""
type GalleryItem {
  """Gallery item image data"""
  image(
    """Maximum width of the image"""
    width: Int

    """Minimum width of the image"""
    height: Int

    """If to fill the image to the given size"""
    fill: Boolean = false
  ): ImageData!

  """Image label"""
  label: String
}

"""Image data"""
type ImageData {
  """The image URL"""
  src(
    """Maximum width of the image"""
    width: Int

    """Minimum width of the image"""
    height: Int

    """If to fill the image to the given size"""
    fill: Boolean = false
  ): String!
}

"""A partially populated product of unknown type"""
interface ListProduct {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!
}

"""Product List Attribute Interface, for a partial product"""
interface ListProductAttributes {
  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""Product List Attribute Set Default Interface"""
interface ListProductAttributesDefault {
  """Color"""
  color: String

  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Manufacturer"""
  manufacturer: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""A partially populated bundle product"""
type ListProductBundle implements ListProduct {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Options for a bundle product"""
  bundleOptions: [BundleOption!]!
}

"""Product List Bundle Attribute Interface"""
interface ListProductBundleAttributes {
  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!
  priceType: Int!

  """Price View"""
  priceView: String!

  """Shipment"""
  shipmentType: Int!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
  weightType: Int!
}

"""Product List Bundle Attribute Set Default"""
type ListProductBundleAttributesDefault implements ListProductAttributes & ListProductBundleAttributes & ListProductAttributesDefault {
  """Color"""
  color: String

  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Manufacturer"""
  manufacturer: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!
  priceType: Int!

  """Price View"""
  priceView: String!

  """Shipment"""
  shipmentType: Int!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
  weightType: Int!
}

"""A partially populated configurable product"""
type ListProductConfigurable implements ListProduct {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Options for a configurable product"""
  configOptions: ConfigurationOptions!
}

"""Product List Configurable Attribute Interface"""
interface ListProductConfigurableAttributes {
  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""Product List Configurable Attribute Set Default"""
type ListProductConfigurableAttributesDefault implements ListProductAttributes & ListProductConfigurableAttributes & ListProductAttributesDefault {
  """Color"""
  color: String

  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Manufacturer"""
  manufacturer: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""A partially populated simple product"""
type ListProductSimple implements ListProduct {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!
}

"""Product List Simple Attribute Interface"""
interface ListProductSimpleAttributes {
  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""Product List Simple Attribute Set Default"""
type ListProductSimpleAttributesDefault implements ListProductAttributes & ListProductSimpleAttributes & ListProductAttributesDefault {
  """Color"""
  color: String

  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Manufacturer"""
  manufacturer: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""A partially populated virtual product"""
type ListProductVirtual implements ListProduct {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!
}

"""Product List Virtual Attribute Interface"""
interface ListProductVirtualAttributes {
  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""Product List Virtual Attribute Set Default"""
type ListProductVirtualAttributesDefault implements ListProductAttributes & ListProductVirtualAttributes & ListProductAttributesDefault {
  """Color"""
  color: String

  """Image Label"""
  imageLabel: String
  linksExist: Int

  """Links can be purchased separately"""
  linksPurchasedSeparately: Int!

  """Manufacturer"""
  manufacturer: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Display Actual Price"""
  msrpDisplayActualPriceType: String

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Set Product as New from Date"""
  newsFromDate: String

  """Set Product as New to Date"""
  newsToDate: String

  """Price"""
  price: Float!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Special Price From Date"""
  specialFromDate: String

  """Special Price"""
  specialPrice: Float

  """Special Price To Date"""
  specialToDate: String

  """Status"""
  status: String!

  """Tax Class"""
  taxClassId: String!

  """Thumbnail"""
  thumbnail: ImageData

  """Thumbnail Label"""
  thumbnailLabel: String

  """URL Key"""
  urlKey: String
}

"""Type containing the result of a login operation"""
type LoginCustomerResult {
  """The result type"""
  result: LoginCustomerResultType!

  """Present if it is a success"""
  customer: Customer
}

"""Type indicating the result of a login operation"""
enum LoginCustomerResultType {
  """A successful login"""
  success

  """Invalid email or password."""
  errorInvalidEmailOrPassword

  """The account is not yet confirmed by email."""
  errorUserNotConfirmed

  """Login mutation is not enabled"""
  errorLoginNotEnabled
}

"""Root mutation type."""
type Mutation {
  """Attempts to log in a customer"""
  loginCustomer(
    """The email of the customer account"""
    email: String!

    """The password"""
    password: String!
  ): LoginCustomerResult!

  """Attempts to log out a customer"""
  logoutCustomer: Boolean!

  """Updates the customer information for the currently logged in customer"""
  updateCustomer(
    """The new customer information"""
    customer: UpdateCustomerInput!
  ): UpdateCustomerResult!

  """
  Updates the email for the currently logged in customer, this will also propagate to any quote.
  """
  updateCustomerEmail(
    """The new email for the account"""
    email: String!
  ): UpdateCustomerEmailResult!

  """
  Attempts to set the given address id as the default billing address for the currently logged in customer
  """
  setCustomerDefaultBillingAddress(
    """The id of the customer address to use as default billing address"""
    id: ID!
  ): SetCustomerDefaultAddressResult!

  """
  Attempts to set the given address id as the default shipping address for the currently logged in customer
  """
  setCustomerDefaultShippingAddress(
    """The id of the customer address to use as default shipping address"""
    id: ID!
  ): SetCustomerDefaultAddressResult!

  """Creates a customer address"""
  createCustomerAddress(
    """The new address data"""
    address: AddressInput!

    """
    If the newly created address should be set as the default billing address
    """
    setDefaultBilling: Boolean = false

    """
    If the newly created address should be set as the default shipping address
    """
    setDefaultShipping: Boolean = false
  ): CreateCustomerAddressResult!

  """Updates a customer address with new data"""
  updateCustomerAddress(
    """The id of the customer address to update"""
    id: ID!

    """Address data to update"""
    address: AddressInput!
  ): UpdateCustomerAddressResult!

  """Attempts to delete a customer address"""
  removeCustomerAddress(
    """The id of the customer address"""
    id: ID!
  ): RemoveCustomerAddressResult!
}

"""Object containing a list of partially populated products"""
type PaginatedProducts {
  """List of products"""
  items: [ListProduct!]!

  """Total number of products in this paginated collection"""
  totalCount: Int!
}

"""Price information which carries tax information"""
interface Price {
  """Price excluding VAT"""
  exVat: Float!

  """Price including VAT"""
  incVat: Float!

  """VAT amount"""
  vat: Float!
}

"""Information about a filterable product attribute"""
type ProductAttribute {
  """The attribute label"""
  label: String!

  """
  If the attribute has different values which can be selected they will be listed here
  """
  values: [String!]
}

"""Filterable product attributes and their values"""
type ProductAttributes {
  """Attribute data for color"""
  color: ProductAttribute!

  """Attribute data for manufacturer"""
  manufacturer: ProductAttribute!
}

"""A fully populated product of unknown type"""
interface ProductDetail {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for detail page"""
  attributes: ProductDetailAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Media gallery"""
  gallery: [GalleryItem]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Cross-sell products"""
  crossSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Related products"""
  relatedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Up-sell products"""
  upSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!
}

"""Product Detail Attribute Interface, for a full product"""
interface ProductDetailAttributes {
  """Description"""
  description: String!

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""Product Detail Attribute Set Default Interface"""
interface ProductDetailAttributesDefault {
  """Color"""
  color: String

  """Description"""
  description: String!

  """Manufacturer"""
  manufacturer: String

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""A fully populated bundle product"""
type ProductDetailBundle implements ProductDetail {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for detail page"""
  attributes: ProductDetailAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Media gallery"""
  gallery: [GalleryItem]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Cross-sell products"""
  crossSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Related products"""
  relatedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Up-sell products"""
  upSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Options for a bundle product"""
  bundleOptions: [BundleOption!]!
}

"""Product Detail Bundle Attribute Interface"""
interface ProductDetailBundleAttributes {
  """Description"""
  description: String!

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""Product Detail Bundle Attribute Set Default"""
type ProductDetailBundleAttributesDefault implements ProductDetailAttributes & ProductDetailBundleAttributes & ProductDetailAttributesDefault {
  """Color"""
  color: String

  """Description"""
  description: String!

  """Manufacturer"""
  manufacturer: String

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""A fully populated configurable product"""
type ProductDetailConfigurable implements ProductDetail {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for detail page"""
  attributes: ProductDetailAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Media gallery"""
  gallery: [GalleryItem]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Cross-sell products"""
  crossSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Related products"""
  relatedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Up-sell products"""
  upSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Options for a configurable product"""
  configOptions: ConfigurationOptions!
}

"""Product Detail Configurable Attribute Interface"""
interface ProductDetailConfigurableAttributes {
  """Description"""
  description: String!

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""Product Detail Configurable Attribute Set Default"""
type ProductDetailConfigurableAttributesDefault implements ProductDetailAttributes & ProductDetailConfigurableAttributes & ProductDetailAttributesDefault {
  """Color"""
  color: String

  """Description"""
  description: String!

  """Manufacturer"""
  manufacturer: String

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""A fully populated simple product"""
type ProductDetailSimple implements ProductDetail {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for detail page"""
  attributes: ProductDetailAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Media gallery"""
  gallery: [GalleryItem]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Cross-sell products"""
  crossSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Related products"""
  relatedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Up-sell products"""
  upSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!
}

"""Product Detail Simple Attribute Interface"""
interface ProductDetailSimpleAttributes {
  """Description"""
  description: String!

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""Product Detail Simple Attribute Set Default"""
type ProductDetailSimpleAttributesDefault implements ProductDetailAttributes & ProductDetailSimpleAttributes & ProductDetailAttributesDefault {
  """Color"""
  color: String

  """Description"""
  description: String!

  """Manufacturer"""
  manufacturer: String

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""A fully populated virtual product"""
type ProductDetailVirtual implements ProductDetail {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for detail page"""
  attributes: ProductDetailAttributes!

  """Attribute set name"""
  attributeSetName: String!

  """Categories this product is part of"""
  categories: [Category!]!

  """Media gallery"""
  gallery: [GalleryItem]!

  """Product original price"""
  originalPrice: ProductPrice!

  """Product final price"""
  price: ProductPrice!

  """URL"""
  url: String!

  """Cross-sell products"""
  crossSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Related products"""
  relatedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Up-sell products"""
  upSellProducts(
    """Maximum number of products to list"""
    pageSize: Int = 4

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!
}

"""Product Detail Virtual Attribute Interface"""
interface ProductDetailVirtualAttributes {
  """Description"""
  description: String!

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""Product Detail Virtual Attribute Set Default"""
type ProductDetailVirtualAttributesDefault implements ProductDetailAttributes & ProductDetailVirtualAttributes & ProductDetailAttributesDefault {
  """Color"""
  color: String

  """Description"""
  description: String!

  """Manufacturer"""
  manufacturer: String

  """Meta Description"""
  metaDescription: String

  """Meta Keywords"""
  metaKeyword: String

  """Meta Title"""
  metaTitle: String

  """Minimal Price"""
  minimalPrice: Float

  """Manufacturer's Suggested Retail Price"""
  msrp: Float

  """Apply MAP"""
  msrpEnabled: String

  """Name"""
  name: String!

  """Short Description"""
  shortDescription: String!

  """Small Image"""
  smallImage: ImageData

  """Small Image Label"""
  smallImageLabel: String

  """Thumbnail"""
  thumbnail: ImageData
}

"""
A product which is a possible option or selection in a configurable or bundle product
"""
interface ProductOption {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!
}

"""
A simple product available as option or selection for configurable product or bundle
"""
type ProductOptionSimple implements ProductOption {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!
}

"""
A virtual product available as option or selection for configurable product or bundle
"""
type ProductOptionVirtual implements ProductOption {
  """SKU"""
  sku: String!

  """Product type"""
  type: ProductType!

  """Product name"""
  name: String!

  """Product attributes for list"""
  attributes: ListProductAttributes!

  """Attribute set name"""
  attributeSetName: String!
}

"""Price information for a product in base store currency"""
type ProductPrice implements Price {
  """Price excluding VAT"""
  exVat: Float!

  """Price including VAT"""
  incVat: Float!

  """VAT amount"""
  vat: Float!
}

"""Type indicating variant of product"""
enum ProductType {
  """Complex product containing multiple variants"""
  bundle

  """Complex product containing variants"""
  configurable

  """Simple single product"""
  simple

  """Simple product without physical representation"""
  virtual
}

"""Available filters for products"""
type ProductsBy {
  """List of products filtered by color"""
  color(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1

    """The value to match against"""
    value: String!
  ): PaginatedProducts

  """List of products filtered by manufacturer"""
  manufacturer(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1

    """The value to match against"""
    value: String!
  ): PaginatedProducts

  """List of products filtered by price"""
  price(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1

    """The minimum value"""
    min: Float

    """The maximum value"""
    max: Float
  ): PaginatedProducts
}

"""Root query type."""
type Query {
  """Customer information if a customer is logged in"""
  customer: Customer

  """Information about the current store"""
  info: StoreInfo!

  """Attempt to fetch a resource by its route"""
  route(
    """Path to resource"""
    path: String!
  ): Route

  """Categories which can be shown in the main menu"""
  categoryNav: [Category!]!

  """Root category for the store"""
  rootCategory: Category!

  """
  All purchased products ordered by number of ordered products, from all users in the store
  """
  bestsellingProducts(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """Product attributes and thier data"""
  productAttributes: ProductAttributes!

  """Detailed product information about a specific SKU"""
  productBySku(
    """Product SKU"""
    sku: String!
  ): ProductDetail

  """Filter products by a specific attribute"""
  productsBy: ProductsBy! @deprecated(reason: "Use producs query with attributeFilter instead")

  """All available products"""
  products(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts!

  """
  Filter products by a specified search term, null means the term is too short
  """
  productsBySearch(
    """Search term/phrase"""
    term: String!

    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts

  """Get list of recently viewed products."""
  recentlyViewedProducts(
    """Maximum number of products to list"""
    pageSize: Int = 20

    """Which page to show"""
    page: Int = 1
  ): PaginatedProducts
  _service: _Service!
}

"""Type containing the result of a customer address removal."""
type RemoveCustomerAddressResult {
  """The type of result from removeCustomerAddress"""
  result: RemoveCustomerAddressResultType!
}

"""Type of result from removeCustomerAddress mutation"""
enum RemoveCustomerAddressResultType {
  """Address was successfully removed."""
  success

  """Customer is not logged in."""
  errorNotLoggedIn

  """The supplied address id is invalid."""
  errorInvalidAddressId
}

"""Response from a route"""
interface Route {
  """Type of route resource"""
  type: RouteType!
}

"""
An instruction to redirect to the supplied path to obtain the resource
"""
type RouteCategory implements Route {
  """Type of route"""
  type: RouteType!

  """The Category"""
  category: Category!
}

"""A response containing a detailed product"""
type RouteProduct implements Route {
  """Type of route"""
  type: RouteType!

  """
  The parent category of the product, if any. This will depend on the route
  """
  category: Category

  """The product"""
  product: ProductDetail!
}

"""A response containing a category"""
type RouteRedirect implements Route {
  """If the redirect is a permanent redirect"""
  isPermanent: Boolean!

  """Type of route"""
  type: RouteType!

  """Redirect to"""
  url: String!
}

"""Type indicating variant of route resource"""
enum RouteType {
  """A category"""
  category

  """A CMS page"""
  cms_page

  """A product"""
  product

  """A redirect to another path"""
  redirect
}

"""
Result of setCustomerDefaultShippingAddress or setCustomerDefaultBillingAddress.
"""
type SetCustomerDefaultAddressResult {
  """The type of result"""
  result: SetCustomerDefaultAddressResultType!

  """The customer result, if no error occurred"""
  customer: Customer

  """The set address customer address, if no error occurred"""
  address: Address
}

"""Type of result from updateCustomerEmail mutation"""
enum SetCustomerDefaultAddressResultType {
  """Default address was successfully updated."""
  success

  """Default address was not modified."""
  notModified

  """Customer is not logged in."""
  errorNotLoggedIn

  """The supplied address id is invalid."""
  errorInvalidAddressId
}

"""Basic store information"""
type StoreInfo {
  """Base currency code"""
  baseCurrencyCode: String!

  """Base URL"""
  baseUrl: String!

  """Currency codes"""
  currencyCodes: [String!]!

  """List of available countries for the store"""
  countries: [Country!]!

  """Default country for the store"""
  defaultCountry: Country!

  """Default page description"""
  defaultDescription: String

  """Default page title"""
  defaultTitle: String

  """Locale code for the store"""
  locale: String!

  """Name"""
  name: String!

  """Page title prefix"""
  titlePrefix: String

  """Page title suffix"""
  titleSuffix: String
}

"""Result of updateCustomerAddress mutation"""
type UpdateCustomerAddressResult {
  """The type of result"""
  result: UpdateCustomerAddressResultType!

  """The customer result, if no error occurred"""
  customer: Customer

  """The updated customer address, if no error occurred"""
  address: CustomerAddress

  """List of validation errors if the address failed to validate"""
  validationErrors: [AddressValidationError!]!
}

"""Type of result from updateCustomerAddress mutation"""
enum UpdateCustomerAddressResultType {
  """Address was successfully updated"""
  success

  """Address was not modified"""
  notModified

  """Customer is not logged in."""
  errorNotLoggedIn

  """The supplied address id is invalid."""
  errorInvalidAddressId

  """The supplied address id is invalid."""
  errorInvalidAddress
}

"""Result of updateCustomerEmail mutation"""
type UpdateCustomerEmailResult {
  """The type of result"""
  result: UpdateCustomerEmailResultType!

  """The customer result, if no error occurred"""
  customer: Customer
}

"""Type of result from updateCustomerEmail mutation"""
enum UpdateCustomerEmailResultType {
  """Email was successfully updated."""
  success

  """Email was not modified."""
  notModified

  """Customer is not logged in."""
  errorNotLoggedIn

  """The supplied email address is invalid."""
  errorInvalidEmail

  """The supplied email is used by another customer"""
  errorEmailExists
}

"""New data for customer"""
input UpdateCustomerInput {
  """Firstname"""
  firstname: String!

  """Lastname"""
  lastname: String!
}

"""Result of updateCustomer mutation"""
type UpdateCustomerResult {
  """The result type"""
  result: UpdateCustomerResultType!

  """Present if it is a success"""
  customer: Customer
}

"""Type of result from updateCustomer mutation"""
enum UpdateCustomerResultType {
  """Address was successfully updated"""
  success

  """Address was not modified"""
  notModified

  """Customer is not logged in."""
  errorNotLoggedIn
}

"""Object containing a Federation service specification for this service"""
type _Service {
  """String representation of the service schema"""
  sdl: String!
}
