#!/usr/bin/env python3
# Copyright 2018 - The Android Open Source Project
#
# 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.

"""AIDEgen metrics functions."""

import logging
import os
import platform
import sys

from aidegen import constant
from atest import atest_utils

try:
    from asuite.metrics import metrics
    from asuite.metrics import metrics_base
    from asuite.metrics import metrics_utils
except ImportError:
    logging.debug('Import metrics fail, can\'t send metrics')
    metrics = None
    metrics_base = None
    metrics_utils = None


def starts_asuite_metrics(references):
    """Starts to record metrics data.

    Send a metrics data to log server at the same time.

    Args:
        references: a list of reference data, when importing whole Android
                    it contains 'is_android_tree'.
    """
    if not metrics:
        return
    atest_utils.print_data_collection_notice()
    metrics_base.MetricsBase.tool_name = constant.AIDEGEN_TOOL_NAME
    metrics_utils.get_start_time()
    command = ' '.join(sys.argv)
    metrics.AtestStartEvent(
        command_line=command,
        test_references=references,
        cwd=os.getcwd(),
        os=platform.platform())


def ends_asuite_metrics(exit_code, stacktrace='', logs=''):
    """Send the end event to log server.

    Args:
        exit_code: An integer of exit code.
        stacktrace: A string of stacktrace.
        logs: A string of logs.
    """
    if not metrics_utils:
        return
    metrics_utils.send_exit_event(
        exit_code,
        stacktrace=stacktrace,
        logs=logs)
