# Copyright (c) Facebook, Inc. and its affiliates.

# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

from __future__ import absolute_import, division, print_function, unicode_literals

import pprint

import pkg_resources
import requests
from wadebug import exceptions


class Events:
    RUN_ACTIONS = "run_actions"
    RUN_ACTIONS_AND_SEND_RESULTS = "run_actions_and_send_results"
    SEND_LOGS = "send_logs"


class Analytics:
    API_ENDPOINT = "https://graph.facebook.com/v3.1/wa_debug_logs"
    CLIENT_TOKEN = "260133211267543|a2471a9f36e4eaf6b9b79bb60b7887ee"
    TIMEOUT = 30

    # set VERSION on first import of this class
    VERSION = "unknown"
    try:
        VERSION = pkg_resources.get_distribution("wadebug").version
    except Exception:
        pass  # ignore when building from WhatsApp internal build system

    @staticmethod
    def send_event(event, data, phone_number=None, files_param=None):
        postData = {
            "access_token": Analytics.CLIENT_TOKEN,
            "event_type": event,
            "event_data": data,
            "phone_number": phone_number,
            "version": Analytics.VERSION,
        }

        try:
            res = requests.post(
                url=Analytics.API_ENDPOINT,
                data=postData,
                timeout=Analytics.TIMEOUT,
                files=files_param,
            ).json()
        except ValueError:
            raise ValueError("Invalid JSON response")
        except requests.exceptions.RequestException:
            raise exceptions.FBNetworkError(
                "Network Error. Please ensure you can connect to www.facebook.com"
            )

        if res.get("error"):
            raise ValueError(pprint.pformat(res))

        return res.get("run_id")

    @staticmethod
    def send_logs_to_fb(zipped_logs_file_handle, phone_number=None):
        files_param = {
            "logs_archive": (
                "wadebug_logs.zip",
                zipped_logs_file_handle,
                "application/zip",
            )
        }
        return Analytics.send_event(
            Events.SEND_LOGS,
            data="none",
            files_param=files_param,
            phone_number=phone_number,
        )
