<?php
/**
 * Copyright 2017 Adobe
 * All Rights Reserved.
 */
namespace Magento\Catalog\Api\Data;

use Magento\Catalog\Api\Data\ProductRender\ButtonInterface;
use Magento\Catalog\Api\Data\ProductRender\PriceInfoInterface;
use Magento\Framework\Api\ExtensibleDataInterface;

/**
 * Represents Data Object which holds enough information to render product
 * This information is put into part as Add To Cart or Add to Compare Data or Price Data
 *
 * @api
 * @since 102.0.0
 */
interface ProductRenderInterface extends ExtensibleDataInterface
{
    /**
     * Provide information needed for render "Add To Cart" button on front
     *
     * @return \Magento\Catalog\Api\Data\ProductRender\ButtonInterface
     * @since 102.0.0
     */
    public function getAddToCartButton();

    /**
     * Set information needed for render "Add To Cart" button on front
     *
     * @param ButtonInterface $cartAddToCartButton
     * @return void
     * @since 102.0.0
     */
    public function setAddToCartButton(ButtonInterface $cartAddToCartButton);

    /**
     * Provide information needed for render "Add To Compare" button on front
     *
     * @return \Magento\Catalog\Api\Data\ProductRender\ButtonInterface
     * @since 102.0.0
     */
    public function getAddToCompareButton();

    /**
     * Set information needed for render "Add To Compare" button on front
     *
     * @param ButtonInterface $compareButton
     * @return string
     * @since 102.0.0
     */
    public function setAddToCompareButton(ButtonInterface $compareButton);

    /**
     * Provide information needed for render prices and adjustments for different product types on front
     *
     * Prices are represented in raw format and in current currency
     *
     * @return \Magento\Catalog\Api\Data\ProductRender\PriceInfoInterface
     * @since 102.0.0
     */
    public function getPriceInfo();

    /**
     * Set information needed for render prices and adjustments for different product types on front
     *
     * @param \Magento\Catalog\Api\Data\ProductRender\PriceInfoInterface $priceInfo
     * @return void
     * @since 102.0.0
     */
    public function setPriceInfo(PriceInfoInterface $priceInfo);

    /**
     * Provide enough information, that needed to render image on front
     *
     * Images can be separated by image codes
     *
     * @return \Magento\Catalog\Api\Data\ProductRender\ImageInterface[]
     * @since 102.0.0
     */
    public function getImages();

    /**
     * Set enough information, that needed to render image on front
     *
     * @param \Magento\Catalog\Api\Data\ProductRender\ImageInterface[] $images
     * @return void
     * @since 102.0.0
     */
    public function setImages(array $images);

    /**
     * Provide product url
     *
     * @return string
     * @since 102.0.0
     */
    public function getUrl();

    /**
     * Set product url
     *
     * @param string $url
     * @return void
     * @since 102.0.0
     */
    public function setUrl($url);

    /**
     * Provide product identifier
     *
     * @return int
     * @since 102.0.0
     */
    public function getId();

    /**
     * Set product identifier
     *
     * @param int $id
     * @return void
     * @since 102.0.0
     */
    public function setId($id);

    /**
     * Provide product name
     *
     * @return string
     * @since 102.0.0
     */
    public function getName();

    /**
     * Set product name
     *
     * @param string $name
     * @return void
     * @since 102.0.0
     */
    public function setName($name);

    /**
     * Provide product type. Such as bundle, grouped, simple, etc...
     *
     * @return string
     * @since 102.0.0
     */
    public function getType();

    /**
     * Set product type.
     *
     * @param string $productType
     * @return void
     * @since 102.0.0
     */
    public function setType($productType);

    /**
     * Provide information about product saleability (In Stock)
     *
     * @return string
     * @since 102.0.0
     */
    public function getIsSalable();

    /**
     * Set information about product saleability (Stock, other conditions)
     *
     * Is used to provide information to frontend JS renders
     * You can add plugin, in order to hide product on product page or product list on front
     *
     * @param string $isSalable
     * @return void
     * @since 102.0.0
     */
    public function setIsSalable($isSalable);

    /**
     * Provide information about current store id or requested store id
     *
     * Product should be assigned to provided store id
     * This setting affect store scope attributes
     *
     * @return int
     * @since 102.0.0
     */
    public function getStoreId();

    /**
     * Set current or desired store id to product
     *
     * @param int $storeId
     * @return void
     * @since 102.0.0
     */
    public function setStoreId($storeId);

    /**
     * Provide current or desired currency code to product
     *
     * This setting affect formatted prices*
     *
     * @return string
     * @since 102.0.0
     */
    public function getCurrencyCode();

    /**
     * Set current or desired currency code to product
     *
     * @param string $currencyCode
     * @return void
     * @since 102.0.0
     */
    public function setCurrencyCode($currencyCode);

    /**
     * Retrieve existing extension attributes object or create a new one.
     *
     * @return \Magento\Catalog\Api\Data\ProductRenderExtensionInterface
     * @since 102.0.0
     */
    public function getExtensionAttributes();

    /**
     * Set an extension attributes object.
     *
     * @param \Magento\Catalog\Api\Data\ProductRenderExtensionInterface $extensionAttributes
     * @return $this
     * @since 102.0.0
     */
    public function setExtensionAttributes(
        \Magento\Catalog\Api\Data\ProductRenderExtensionInterface $extensionAttributes
    );
}
