# 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.

"""Asuite simple Metrics Functions"""

import json
import logging
import os
import uuid

try:
    # PYTHON2
    from urllib2 import Request
    from urllib2 import urlopen
except ImportError:
    # PYTHON3
    from urllib.request import Request
    from urllib.request import urlopen


_JSON_HEADERS = {'Content-Type': 'application/json'}
_METRICS_RESPONSE = 'done'
_METRICS_TIMEOUT = 2 #seconds
_META_FILE = os.path.join(os.path.expanduser('~'),
                          '.config', 'asuite', '.metadata')
_ANDROID_BUILD_TOP = 'ANDROID_BUILD_TOP'

DUMMY_UUID = '00000000-0000-4000-8000-000000000000'


#pylint: disable=broad-except
def log_event(metrics_url, dummy_key_fallback=True, **kwargs):
    """Base log event function for asuite backend.

    Args:
        metrics_url: String, URL to report metrics to.
        dummy_key_fallback: Boolean, If True and unable to get grouping key,
                            use a dummy key otherwise return out. Sometimes we
                            don't want to return metrics for users we are
                            unable to identify. Default True.
        kwargs: Dict, additional fields we want to return metrics for.
    """
    try:
        try:
            key = str(_get_grouping_key())
        except Exception:
            if not dummy_key_fallback:
                return
            key = DUMMY_UUID
        data = {'grouping_key': key,
                'run_id': str(uuid.uuid4())}
        if kwargs:
            data.update(kwargs)
        data = json.dumps(data)
        request = Request(metrics_url, data=data,
                          headers=_JSON_HEADERS)
        response = urlopen(request, timeout=_METRICS_TIMEOUT)
        content = response.read()
        if content != _METRICS_RESPONSE:
            raise Exception('Unexpected metrics response: %s' % content)
    except Exception as e:
        logging.debug('Exception sending metrics: %s', e)


def _get_grouping_key():
    """Get grouping key. Returns UUID.uuid4."""
    if os.path.isfile(_META_FILE):
        with open(_META_FILE) as f:
            try:
                return uuid.UUID(f.read(), version=4)
            except ValueError:
                logging.debug('malformed group_key in file, rewriting')
    # TODO: Delete get_old_key() on 11/17/2018
    key = _get_old_key() or uuid.uuid4()
    dir_path = os.path.dirname(_META_FILE)
    if os.path.isfile(dir_path):
        os.remove(dir_path)
    try:
        os.makedirs(dir_path)
    except OSError as e:
        if not os.path.isdir(dir_path):
            raise e
    with open(_META_FILE, 'w+') as f:
        f.write(str(key))
    return key


def _get_old_key():
    """Get key from old meta data file if exists, else return None."""
    old_file = os.path.join(os.environ[_ANDROID_BUILD_TOP],
                            'tools/tradefederation/core/atest', '.metadata')
    key = None
    if os.path.isfile(old_file):
        with open(old_file) as f:
            try:
                key = uuid.UUID(f.read(), version=4)
            except ValueError:
                logging.debug('error reading old key')
        os.remove(old_file)
    return key
