# coding: utf-8

from __future__ import absolute_import
from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from swagger_server.models.base_model_ import Model
from swagger_server import util
from swagger_server.models.adress import *
from swagger_server.models.merchant_urls import *
from swagger_server.models.customer import *
from swagger_server.models.order_line import *

class Order(Model):
    """NOTE: This class is auto generated by the swagger code generator program.

    Do not edit the class manually.
    """

    def __init__(self, id: str=None, merchant_name: str=None, purchase_country: str=None, purchase_currency: str=None, billing_address: Adress=None, order_amount: int=None, order_tax_amount: int=None, merchant_urls: MerchantUrls=None, customer: Customer=None, order_lines: List[OrderLine]=None):  # noqa: E501
        """Order - a model defined in Swagger

        :param id: The id of this Order.  # noqa: E501
        :type id: str
        :param merchant_name: The merchant_name of this Order.  # noqa: E501
        :type merchant_name: str
        :param purchase_country: The purchase_country of this Order.  # noqa: E501
        :type purchase_country: str
        :param purchase_currency: The purchase_currency of this Order.  # noqa: E501
        :type purchase_currency: str
        :param billing_address: The billing_address of this Order.  # noqa: E501
        :type billing_address: Adress
        :param order_amount: The order_amount of this Order.  # noqa: E501
        :type order_amount: int
        :param order_tax_amount: The order_tax_amount of this Order.  # noqa: E501
        :type order_tax_amount: int
        :param merchant_urls: The merchant_urls of this Order.  # noqa: E501
        :type merchant_urls: MerchantUrls
        :param customer: The customer of this Order.  # noqa: E501
        :type customer: Customer
        :param order_lines: The order_lines of this Order.  # noqa: E501
        :type order_lines: List[OrderLine]
        """
        self.swagger_types = {
            'id': str,
            'merchant_name': str,
            'purchase_country': str,
            'purchase_currency': str,
            'billing_address': Adress,
            'order_amount': int,
            'order_tax_amount': int,
            'merchant_urls': MerchantUrls,
            'customer': Customer,
            'order_lines': List[OrderLine]
        }

        self.attribute_map = {
            'id': 'id',
            'merchant_name': 'merchant_name',
            'purchase_country': 'purchase_country',
            'purchase_currency': 'purchase_currency',
            'billing_address': 'billing_address',
            'order_amount': 'order_amount',
            'order_tax_amount': 'order_tax_amount',
            'merchant_urls': 'merchant_urls',
            'customer': 'customer',
            'order_lines': 'order_lines'
        }

        self._id = id
        self._merchant_name = merchant_name
        self._purchase_country = purchase_country
        self._purchase_currency = purchase_currency
        self._billing_address = billing_address
        self._order_amount = order_amount
        self._order_tax_amount = order_tax_amount
        self._merchant_urls = merchant_urls
        self._customer = customer
        self._order_lines = order_lines

    @classmethod
    def from_dict(cls, dikt) -> 'Order':
        """Returns the dict as a model

        :param dikt: A dict.
        :type: dict
        :return: The Order of this Order.  # noqa: E501
        :rtype: Order
        """
        return util.deserialize_model(dikt, cls)

    @property
    def id(self) -> str:
        """Gets the id of this Order.


        :return: The id of this Order.
        :rtype: str
        """
        return self._id

    @id.setter
    def id(self, id: str):
        """Sets the id of this Order.


        :param id: The id of this Order.
        :type id: str
        """

        self._id = id

    @property
    def merchant_name(self) -> str:
        """Gets the merchant_name of this Order.


        :return: The merchant_name of this Order.
        :rtype: str
        """
        return self._merchant_name

    @merchant_name.setter
    def merchant_name(self, merchant_name: str):
        """Sets the merchant_name of this Order.


        :param merchant_name: The merchant_name of this Order.
        :type merchant_name: str
        """
        if merchant_name is None:
            raise ValueError("Invalid value for `merchant_name`, must not be `None`")  # noqa: E501

        self._merchant_name = merchant_name

    @property
    def purchase_country(self) -> str:
        """Gets the purchase_country of this Order.


        :return: The purchase_country of this Order.
        :rtype: str
        """
        return self._purchase_country

    @purchase_country.setter
    def purchase_country(self, purchase_country: str):
        """Sets the purchase_country of this Order.


        :param purchase_country: The purchase_country of this Order.
        :type purchase_country: str
        """
        if purchase_country is None:
            raise ValueError("Invalid value for `purchase_country`, must not be `None`")  # noqa: E501

        self._purchase_country = purchase_country

    @property
    def purchase_currency(self) -> str:
        """Gets the purchase_currency of this Order.


        :return: The purchase_currency of this Order.
        :rtype: str
        """
        return self._purchase_currency

    @purchase_currency.setter
    def purchase_currency(self, purchase_currency: str):
        """Sets the purchase_currency of this Order.


        :param purchase_currency: The purchase_currency of this Order.
        :type purchase_currency: str
        """
        if purchase_currency is None:
            raise ValueError("Invalid value for `purchase_currency`, must not be `None`")  # noqa: E501

        self._purchase_currency = purchase_currency

    @property
    def billing_address(self) -> Adress:
        """Gets the billing_address of this Order.


        :return: The billing_address of this Order.
        :rtype: Adress
        """
        return self._billing_address

    @billing_address.setter
    def billing_address(self, billing_address: Adress):
        """Sets the billing_address of this Order.


        :param billing_address: The billing_address of this Order.
        :type billing_address: Adress
        """

        self._billing_address = billing_address

    @property
    def order_amount(self) -> int:
        """Gets the order_amount of this Order.


        :return: The order_amount of this Order.
        :rtype: int
        """
        return self._order_amount

    @order_amount.setter
    def order_amount(self, order_amount: int):
        """Sets the order_amount of this Order.


        :param order_amount: The order_amount of this Order.
        :type order_amount: int
        """
        if order_amount is None:
            raise ValueError("Invalid value for `order_amount`, must not be `None`")  # noqa: E501

        self._order_amount = order_amount

    @property
    def order_tax_amount(self) -> int:
        """Gets the order_tax_amount of this Order.


        :return: The order_tax_amount of this Order.
        :rtype: int
        """
        return self._order_tax_amount

    @order_tax_amount.setter
    def order_tax_amount(self, order_tax_amount: int):
        """Sets the order_tax_amount of this Order.


        :param order_tax_amount: The order_tax_amount of this Order.
        :type order_tax_amount: int
        """
        if order_tax_amount is None:
            raise ValueError("Invalid value for `order_tax_amount`, must not be `None`")  # noqa: E501

        self._order_tax_amount = order_tax_amount

    @property
    def merchant_urls(self) -> MerchantUrls:
        """Gets the merchant_urls of this Order.


        :return: The merchant_urls of this Order.
        :rtype: MerchantUrls
        """
        return self._merchant_urls

    @merchant_urls.setter
    def merchant_urls(self, merchant_urls: MerchantUrls):
        """Sets the merchant_urls of this Order.


        :param merchant_urls: The merchant_urls of this Order.
        :type merchant_urls: MerchantUrls
        """
        if merchant_urls is None:
            raise ValueError("Invalid value for `merchant_urls`, must not be `None`")  # noqa: E501

        self._merchant_urls = merchant_urls

    @property
    def customer(self) -> Customer:
        """Gets the customer of this Order.


        :return: The customer of this Order.
        :rtype: Customer
        """
        return self._customer

    @customer.setter
    def customer(self, customer: Customer):
        """Sets the customer of this Order.


        :param customer: The customer of this Order.
        :type customer: Customer
        """
        if customer is None:
            raise ValueError("Invalid value for `customer`, must not be `None`")  # noqa: E501

        self._customer = customer

    @property
    def order_lines(self) -> List[OrderLine]:
        """Gets the order_lines of this Order.


        :return: The order_lines of this Order.
        :rtype: List[OrderLine]
        """
        return self._order_lines

    @order_lines.setter
    def order_lines(self, order_lines: List[OrderLine]):
        """Sets the order_lines of this Order.


        :param order_lines: The order_lines of this Order.
        :type order_lines: List[OrderLine]
        """
        if order_lines is None:
            raise ValueError("Invalid value for `order_lines`, must not be `None`")  # noqa: E501

        self._order_lines = order_lines
