# Apache License
# Version 2.0, January 2004
# http://www.apache.org/licenses/
#
# TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
#
# 1. Definitions.
#
#     "License" shall mean the terms and conditions for use, reproduction, and
#     distribution as defined by Sections 1 through 9 of this document.
#
#     "Licensor" shall mean the copyright owner or entity authorized by the
#     copyright owner that is granting the License.
#
#     "Legal Entity" shall mean the union of the acting entity and all other
#     entities that control, are controlled by, or are under common control with
#     that entity. For the purposes of this definition, "control" means (i) the
#     power, direct or indirect, to cause the direction or management of such
#     entity, whether by contract or otherwise, or (ii) ownership of
#     fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
#     ownership of such entity.
#
#     "You" (or "Your") shall mean an individual or Legal Entity exercising
#     permissions granted by this License.
#
#     "Source" form shall mean the preferred form for making modifications,
#     including but not limited to software source code, documentation source,
#     and configuration files.
#
#     "Object" form shall mean any form resulting from mechanical transformation
#     or translation of a Source form, including but not limited to compiled
#     object code, generated documentation, and conversions to
#     other media types.
#
#     "Work" shall mean the work of authorship, whether in Source or Object
#     form, made available under the License, as indicated by a copyright notice
#     that is included in or attached to the work (an example is provided in the
#     Appendix below).
#
#     "Derivative Works" shall mean any work, whether in Source or Object form,
#     that is based on (or derived from) the Work and for which the editorial
#     revisions, annotations, elaborations, or other modifications represent,
#     as a whole, an original work of authorship. For the purposes of this
#     License, Derivative Works shall not include works that remain separable
#     from, or merely link (or bind by name) to the interfaces of, the Work and
#     Derivative Works thereof.
#
#     "Contribution" shall mean any work of authorship, including the original
#     version of the Work and any modifications or additions to that Work or
#     Derivative Works thereof, that is intentionally submitted to Licensor for
#     inclusion in the Work by the copyright owner or by an individual or
#     Legal Entity authorized to submit on behalf of the copyright owner.
#     For the purposes of this definition, "submitted" means any form of
#     electronic, verbal, or written communication sent to the Licensor or its
#     representatives, including but not limited to communication on electronic
#     mailing lists, source code control systems, and issue tracking systems
#     that are managed by, or on behalf of, the Licensor for the purpose of
#     discussing and improving the Work, but excluding communication that is
#     conspicuously marked or otherwise designated in writing by the copyright
#     owner as "Not a Contribution."
#
#     "Contributor" shall mean Licensor and any individual or Legal Entity on
#     behalf of whom a Contribution has been received by Licensor and
#     subsequently incorporated within the Work.
#
# 2. Grant of Copyright License.
#
#     Subject to the terms and conditions of this License, each Contributor
#     hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
#     royalty-free, irrevocable copyright license to reproduce, prepare
#     Derivative Works of, publicly display, publicly perform, sublicense,
#     and distribute the Work and such Derivative Works in
#     Source or Object form.
#
# 3. Grant of Patent License.
#
#     Subject to the terms and conditions of this License, each Contributor
#     hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
#     royalty-free, irrevocable (except as stated in this section) patent
#     license to make, have made, use, offer to sell, sell, import, and
#     otherwise transfer the Work, where such license applies only to those
#     patent claims licensable by such Contributor that are necessarily
#     infringed by their Contribution(s) alone or by combination of their
#     Contribution(s) with the Work to which such Contribution(s) was submitted.
#     If You institute patent litigation against any entity (including a
#     cross-claim or counterclaim in a lawsuit) alleging that the Work or a
#     Contribution incorporated within the Work constitutes direct or
#     contributory patent infringement, then any patent licenses granted to
#     You under this License for that Work shall terminate as of the date such
#     litigation is filed.
#
# 4. Redistribution.
#
#     You may reproduce and distribute copies of the Work or Derivative Works
#     thereof in any medium, with or without modifications, and in Source or
#     Object form, provided that You meet the following conditions:
#
#     1. You must give any other recipients of the Work or Derivative Works a
#     copy of this License; and
#
#     2. You must cause any modified files to carry prominent notices stating
#     that You changed the files; and
#
#     3. You must retain, in the Source form of any Derivative Works that You
#     distribute, all copyright, patent, trademark, and attribution notices from
#     the Source form of the Work, excluding those notices that do not pertain
#     to any part of the Derivative Works; and
#
#     4. If the Work includes a "NOTICE" text file as part of its distribution,
#     then any Derivative Works that You distribute must include a readable copy
#     of the attribution notices contained within such NOTICE file, excluding
#     those notices that do not pertain to any part of the Derivative Works,
#     in at least one of the following places: within a NOTICE text file
#     distributed as part of the Derivative Works; within the Source form or
#     documentation, if provided along with the Derivative Works; or, within a
#     display generated by the Derivative Works, if and wherever such
#     third-party notices normally appear. The contents of the NOTICE file are
#     for informational purposes only and do not modify the License.
#     You may add Your own attribution notices within Derivative Works that You
#     distribute, alongside or as an addendum to the NOTICE text from the Work,
#     provided that such additional attribution notices cannot be construed
#     as modifying the License.
#
#     You may add Your own copyright statement to Your modifications and may
#     provide additional or different license terms and conditions for use,
#     reproduction, or distribution of Your modifications, or for any such
#     Derivative Works as a whole, provided Your use, reproduction, and
#     distribution of the Work otherwise complies with the conditions
#     stated in this License.
#
# 5. Submission of Contributions.
#
#     Unless You explicitly state otherwise, any Contribution intentionally
#     submitted for inclusion in the Work by You to the Licensor shall be under
#     the terms and conditions of this License, without any additional
#     terms or conditions. Notwithstanding the above, nothing herein shall
#     supersede or modify the terms of any separate license agreement you may
#     have executed with Licensor regarding such Contributions.
#
# 6. Trademarks.
#
#     This License does not grant permission to use the trade names, trademarks,
#     service marks, or product names of the Licensor, except as required for
#     reasonable and customary use in describing the origin of the Work and
#     reproducing the content of the NOTICE file.
#
# 7. Disclaimer of Warranty.
#
#     Unless required by applicable law or agreed to in writing, Licensor
#     provides the Work (and each Contributor provides its Contributions)
#     on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
#     either express or implied, including, without limitation, any warranties
#     or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS
#     FOR A PARTICULAR PURPOSE. You are solely responsible for determining the
#     appropriateness of using or redistributing the Work and assume any risks
#     associated with Your exercise of permissions under this License.
#
# 8. Limitation of Liability.
#
#     In no event and under no legal theory, whether in tort
#     (including negligence), contract, or otherwise, unless required by
#     applicable law (such as deliberate and grossly negligent acts) or agreed
#     to in writing, shall any Contributor be liable to You for damages,
#     including any direct, indirect, special, incidental, or consequential
#     damages of any character arising as a result of this License or out of
#     the use or inability to use the Work (including but not limited to damages
#     for loss of goodwill, work stoppage, computer failure or malfunction,
#     or any and all other commercial damages or losses), even if such
#     Contributor has been advised of the possibility of such damages.
#
# 9. Accepting Warranty or Additional Liability.
#
#     While redistributing the Work or Derivative Works thereof, You may choose
#     to offer, and charge a fee for, acceptance of support, warranty,
#     indemnity, or other liability obligations and/or rights consistent with
#     this License. However, in accepting such obligations, You may act only
#     on Your own behalf and on Your sole responsibility, not on behalf of any
#     other Contributor, and only if You agree to indemnify, defend, and hold
#     each Contributor harmless for any liability incurred by, or claims
#     asserted against, such Contributor by reason of your accepting any such
#     warranty or additional liability.
#
# END OF TERMS AND CONDITIONS
#
# APPENDIX: How to apply the Apache License to your work
#
#     To apply the Apache License to your work, attach the following boilerplate
#     notice, with the fields enclosed by brackets "[]" replaced with your own
#     identifying information. (Don't include the brackets!) The text should be
#     enclosed in the appropriate comment syntax for the file format. We also
#     recommend that a file or class name and description of purpose be included
#     on the same "printed page" as the copyright notice for easier
#     identification within third-party archives.
#
#         Copyright 2018 Gadzhibala Pirmagomedov
#
#         Licensed under the Apache License, Version 2.0 (the "License");
#         you may not use this file except in compliance with the License.
#         You may obtain a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#         Unless required by applicable law or agreed to in writing, software
#         distributed under the License is distributed on an "AS IS" BASIS,
#         WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
#         or implied. See the License for the specific language governing
#         permissions and limitations under the License.

import requests


class IikoBiz:
    def __init__(self, login, password):

        self.login = login
        self.password = password

    def token(self):
        try:

            return requests.get(
                'https://iiko.biz:9900/api/0/auth/access_token?user_id=' +
                self.login + '&user_secret=' + self.password,
                timeout=5).text[1:1]

        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить токен " + "\n" + self.login)

    def organization(self, token):

        try:

            return requests.get(
                'https://iiko.biz:9900/api/0/organization/list?access_token=' +
                token).json()

        except requests.exceptions.ConnectTimeout:
            print(
                "Не удалось получить список организаций " + "\n" + self.login)

    def courier(self, token, org):

        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/rmsSettings/getCouriers?access_token='
                + token + '&organization=' + org).json()

        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить курьеров " + "\n" + self.login)

    def orders_courier(self, token, org, courier):

        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/orders/get_courier_orders?access_token='
                + token + '&organization=' + org + '&courier=' + courier +
                '&request_timeout=00%3A02%3A00').json()

        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить заказы " + "\n" + self.login)

    """Все заказы"""

    def all_orders(self, token, **kwargs):

        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/orders/deliveryOrders?access_token='
                + token,
                params=kwargs).json()

        except requests.exceptions.ConnectTimeout:
            print("Не получить заказы " + "\n" + self.login)

    """История заказа гостя"""

    def customer_history(self, token, org, customer):

        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/orders/deliveryHistoryByCustomerId?access_token='
                + token + '&organization=' + org + '&customerId=' + customer +
                '&request_timeout=00%3A02%3A00').json()

        except requests.exceptions.ConnectTimeout:
            print("Не получить заказы " + "\n" + self.login)

    def nomenclature(self, token, org):
        """Получить дерево номенклатуры"""
        try:
            return requests.get('https://iiko.biz:9900/api/0/nomenclature/' +
                                org + '?access_token=' + token).json()

        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить номенклатуру " + "\n" + self.login)

    "-------------------Города, улицы, регионы-------------------"

    def cities(self, token, org):
        """Список городов"""
        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/cities/cities?access_token=' +
                token + '&organization=' + org).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список городов" + "\n" + self.login)

    def cities_list(self, token, org):
        """возвращает список всех городов заданной организации"""
        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/citiesList/cities?access_token=' +
                token + '&organization=' + org).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список городов" + "\n" + self.login)

    def streets(self, token, org, citi_id):
        """возвращает список улиц города заданной организации"""
        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/citiesList/streets?access_token='
                + token + '&organization=' + org + '&city=' + citi_id).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список улиц" + "\n" + self.login)

    "--------------------------------------Стоп-листы--------------------------------------"

    def stop_list(self, token, org):
        """Получить стоп-лист по сети ресторанов"""
        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/stopLists/getDeliveryStopList?access_token='
                + token + '&organization=' + org).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список улиц" + "\n" + self.login)

    "--------------------------------------Журнал событий--------------------------------------"

    def events(self, token, timeout=None):
        """Получить стоп-лист по сети ресторанов"""
        try:
            return requests.get(
                'https://iiko.biz:9900/api/0/events/events?access_token=' +
                token + '&request_timeout=' + timeout).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список улиц" + "\n" + self.login)

    def events_meta(self, token, body, timeout=None):
        """Получить мета информацию журнала событий (описание возвращаемых данных)"""
        try:
            return requests.post(
                'https://iiko.biz:9900/api/0/events/eventsMetadata?access_token='
                + token + '&request_timeout=' + timeout,
                body=body).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список улиц" + "\n" + self.login)

    def events_session(self, token, body, timeout=None):
        """Получить информацию о кассовых сменах"""
        try:
            return requests.post(
                'https://iiko.biz:9900/api/0/events/sessions?access_token=' +
                token + '&request_timeout=' + timeout,
                body=body).json()
        except requests.exceptions.ConnectTimeout:
            print("Не удалось получить список улиц" + "\n" + self.login)
