<?php
/**
 * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
 */
namespace Temando\Shipping\Model;

/**
 * Temando Order Interface
 *
 * An order entity at the Temando platform.
 *
 * @package Temando\Shipping\Model
 * @author  Christoph Aßmann <christoph.assmann@netresearch.de>
 * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
 * @link    https://www.temando.com/
 */
interface OrderInterface
{
    const ORDER_ID = 'order_id';
    const CREATED_AT = 'created_at';
    const LAST_MODIFIED_AT = 'last_modified_at';
    const ORDERED_AT = 'ordered_at';

    const STATUS = 'status';
    const STATUS_AWAITING_PAYMENT = 'awaiting payment';
    const STATUS_CONFIRMED = 'confirmed';
    const STATUS_PROCESSING = 'processing';
    const STATUS_FULFILLED = 'fulfilled';
    const STATUS_CANCELLED = 'cancelled';
    const STATUS_ARCHIVED = 'archived';
    const STATUS_REFUNDED = 'refunded';
    const STATUS_CLOSED = 'closed';

    const BILLING = 'billing';
    const RECIPIENT = 'recipient';
    const ORDER_ITEMS = 'order_items';

    const CURRENCY = 'currency';
    const AMOUNT = 'amount';

    const SOURCE_REFERENCE = 'source_reference';
    const SOURCE_ID = 'source_id';
    const SOURCE_INCREMENT_ID = 'source_increment_id';

    const CHECKOUT_FIELDS = 'checkout_fields';

    const COLLECTION_POINT = 'collection_point';
    const COLLECTION_POINT_SEARCH_REQUEST = 'collection_point_search_request';

    const PICKUP_LOCATION = 'pickup_location';
    const PICKUP_LOCATION_SEARCH_REQUEST = 'pickup_location_search_request';

    const SELECTED_EXPERIENCE_CODE = 'experience_code';
    const SELECTED_EXPERIENCE_CURRENCY = 'experience_currency';
    const SELECTED_EXPERIENCE_AMOUNT = 'experience_amount';
    const SELECTED_EXPERIENCE_LANGUAGE = 'experience_language';
    const SELECTED_EXPERIENCE_DESCRIPTION = 'experience_description';

    /**
     * @return string
     */
    public function getOrderId();

    /**
     * @return string
     */
    public function getCreatedAt();

    /**
     * @return string
     */
    public function getLastModifiedAt();

    /**
     * @return string
     */
    public function getOrderedAt();

    /**
     * @return string
     */
    public function getStatus();

    /**
     * @return \Temando\Shipping\Model\Order\OrderBillingInterface
     */
    public function getBilling();

    /**
     * @return \Temando\Shipping\Model\Order\OrderRecipientInterface
     */
    public function getRecipient();

    /**
     * @return \Temando\Shipping\Model\Order\OrderItemInterface[]
     */
    public function getOrderItems();

    /**
     * @return string
     */
    public function getCurrency();

    /**
     * @return float
     */
    public function getAmount();

    /**
     * @return int
     */
    public function getSourceReference();

    /**
     * @return string
     */
    public function getSourceId();

    /**
     * @return string
     */
    public function getSourceIncrementId();

    /**
     * @return \Temando\Shipping\Model\Checkout\Attribute\CheckoutFieldInterface[]
     */
    public function getCheckoutFields();

    /**
     * @return \Temando\Shipping\Api\Data\Delivery\CollectionPointSearchRequestInterface|null
     */
    public function getCollectionPointSearchRequest();

    /**
     * @return \Temando\Shipping\Api\Data\Delivery\QuoteCollectionPointInterface|null
     */
    public function getCollectionPoint();

    /**
     * @return \Temando\Shipping\Api\Data\Delivery\PickupLocationSearchRequestInterface|null
     */
    public function getPickupLocationSearchRequest();

    /**
     * @return \Temando\Shipping\Api\Data\Delivery\QuotePickupLocationInterface|null
     */
    public function getPickupLocation();

    /**
     * @return string
     */
    public function getExperienceCode();

    /**
     * @return string
     */
    public function getExperienceCurrency();

    /**
     * @return float
     */
    public function getExperienceAmount();

    /**
     * @return string
     */
    public function getExperienceLanguage();

    /**
     * @return string
     */
    public function getExperienceDescription();
}