# Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
#
# 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.

"""
class for handling Test Apps. Currently it provides the following features:

1. get SDK path
2. get SDK tools
3. parse application info from its path. for example:
    * provide download info
    * provide partition table info

Test Apps should inherent from BaseApp class and overwrite the methods.
"""
import os
import sys
import time

# timestamp used for calculate log folder name
LOG_FOLDER_TIMESTAMP = time.time()


class BaseApp(object):
    """
    Base Class for App.
    Defines the mandatory methods that App need to implement.
    Also implements some common methods.

    :param app_path: the path for app.
    """

    def __init__(self, app_path):
        pass

    @classmethod
    def get_sdk_path(cls):
        """
        get sdk path.

        subclass must overwrite this method.

        :return: abs sdk path
        """
        pass

    @classmethod
    def get_tools(cls):
        """
        get SDK related tools for applications

        subclass must overwrite this method.

        :return: tuple, abs path of each tool
        """
        pass

    @classmethod
    def get_log_folder(cls, test_suite_name):
        """
        By default log folder is ``${SDK_PATH}/TEST_LOGS/${test_suite_name}_${timestamp}``.

        The log folder name is consist once start running, ensure all logs of will be put into the same folder.

        :param test_suite_name: the test suite name, by default it's the base file name for main module
        :return: the log folder path
        """
        if not test_suite_name:
            test_suite_name = os.path.splitext(os.path.basename(sys.modules['__main__'].__file__))[0]
        sdk_path = cls.get_sdk_path()
        log_folder = os.path.join(sdk_path, "TEST_LOGS",
                                  test_suite_name +
                                  time.strftime("_%m%d_%H_%M_%S", time.localtime(LOG_FOLDER_TIMESTAMP)))
        if not os.path.exists(log_folder):
            os.makedirs(log_folder)
        return log_folder

    def process_app_info(self):
        """
        parse built app info for DUTTool

        subclass must overwrite this method.

        :return: required info for specific DUTTool
        """
        pass
