#
# Copyright (C) 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.

import logging
import os
import re
import zipfile

from vts.proto import VtsReportMessage_pb2 as ReportMsg
from vts.runners.host import keys
from vts.utils.python.common import cmd_utils
from vts.utils.python.web import feature_utils


class GcsUtils(feature_utils.Feature):
    """GCS (Google Cloud Storage) utility provider.

    Attributes:
        _TOGGLE_PARAM: String, the name of the parameter used to toggle the feature
        _REQUIRED_PARAMS: list, the list of parameter names that are required
        _OPTIONAL_PARAMS: list, the list of parameter names that are optional
    """

    _TOGGLE_PARAM = None
    _REQUIRED_PARAMS = [keys.ConfigKeys.IKEY_SERVICE_JSON_PATH]
    _OPTIONAL_PARAMS = []

    def __init__(self, user_params):
        """Initializes the gcs util provider.

        Args:
            user_params: A dictionary from parameter name (String) to parameter value.
        """
        self.ParseParameters(
            toggle_param_name=self._TOGGLE_PARAM,
            required_param_names=self._REQUIRED_PARAMS,
            optional_param_names=self._OPTIONAL_PARAMS,
            user_params=user_params)

    def GetGcloudAuth(self):
        """Connects to a service account with access to the gcloud bucket."""
        gcloud_path = GcsUtils.GetGcloudPath()
        gcloud_key = getattr(self, keys.ConfigKeys.IKEY_SERVICE_JSON_PATH)
        if gcloud_path is not None:
            auth_cmd = "%s auth activate-service-account --key-file %s" % (
                gcloud_path, gcloud_key)
            _, stderr, ret_code = cmd_utils.ExecuteOneShellCommand(auth_cmd)
            if ret_code == 0:
                logging.info(stderr)
            else:
                logging.error(stderr)

    @staticmethod
    def GetGcloudPath():
        """Returns the gcloud file path if found; None otherwise."""
        sh_stdout, _, ret_code = cmd_utils.ExecuteOneShellCommand(
            "which gcloud")
        if ret_code == 0:
            return sh_stdout.strip()
        else:
            logging.error("`gcloud` doesn't exist on the host; "
                          "please install Google Cloud SDK before retrying.")
            return None

    @staticmethod
    def GetGsutilPath():
        """Returns the gsutil file path if found; None otherwise."""
        sh_stdout, sh_stderr, ret_code = cmd_utils.ExecuteOneShellCommand(
            "which gsutil")
        if ret_code == 0:
            return sh_stdout.strip()
        else:
            logging.error("`gsutil` doesn't exist on the host; "
                          "please install Google Cloud SDK before retrying.")
            return None