#!/usr/bin/env python3
#
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""This script has helper methods to facilitate CTS/CTS-V upload."""

from __future__ import print_function
from subprocess import check_call

import os
import shutil
import zipfile


class UploadUtils(object):
  """Internal Helper for CTS and CTS Verifier Upload scripts."""

  SPACE_COUNT_CTSV_BOARD_NAME = 14
  SPACE_COUNT_CTSV_BUILD_VERSION = 22
  SPACE_COUNT_VERIFIER_VERSION = 18
  SPACE_COUNT_TIMESTAMP = 17
  SPACE_COUNT_CTS_BOARD_NAME = 13
  SPACE_COUNT_CTS_BUILD_VERSION = 12
  SPACE_COUNT_CTS_BOARD_ABI = 13
  SPACE_COUNT_PACKAGE_NAME = 30
  SPACE_COUNT_FAILED_TESTS = 6
  SPACE_COUNT_PASSED_TESTS = 6
  C_PURPLE = '\033[95m'
  C_RED = '\033[91m'
  C_BLACK = '\033[98m'
  BOLD = '\033[1m'
  C_END = '\033[00m'
  TABLE_HEADER_CTS = (' Time Stamp           : Board   :'
                      'Build Version : Board ABI : '
                      'TEST PACKAGE / MODULE NAME  : FAILED :'
                      ' PASSED')
  TABLE_HEADER_CTSV = (' Build Board Name : '
                       'Build Board Version : '
                       'CTS VERIFIER VERSION')
  def __init__(self):
    self.build_info_list = []
    self.obsolete_file_count = 0
    self.untested_file_count = 0
    self.build_mismatch_file_count = 0

  def PrintObsoleteFolderCount(self):
    """Prints obsolete file count in case of build id mismatch."""
    if not self.build_mismatch_file_count == 0:
      err_msg = ('Build ID Mismatch!Pushed {0} invalid files to BuildID'
                 ' Mismatch Folder'.format(self.build_mismatch_file_count))
      print(self.BOLD + self.C_RED + err_msg +self.BOLD+ self.C_END)

  def PrintUntestedFolderCount(self):
    """Prints untested file count if untested tests exist."""
    if not self.untested_file_count == 0:
      err_msg = ('Untested Test(s) Detected!Pushed {0} files to Untested'
                 ' Tests Folder'.format(self.untested_file_count))
      print(self.BOLD + self.C_RED + err_msg +self.BOLD+ self.C_END)

  def ExtractZipFile(self, zipped_file, dir_path):
    """Extracts Zip File contents to current working directory.

    Args:
      zipped_file: Input zip file.
      dir_path: Results directory path.
    """
    with zipfile.ZipFile(zipped_file, 'r') as zf:
      zf.extractall(dir_path)

  def CopyFileToDestination(self, src_path, src_file_name,
                            dest_path, dest_file_name):
    """Copies file from source path to destination path

    Args:
      src_path: source file path.
      src_file_name: source file name.
      dest_path: destination file path.
      dest_file_name: destination file name.
    """
    src_file = os.path.join(src_path, src_file_name)
    dest_file = os.path.join(dest_path, dest_file_name)
    try:
      shutil.copy(src_file, dest_file)
    except IOError as e:
      print('Unable to copy file. %s' % e)

  def SplitFileName(self, file_path):
    """Splits file to create file names with different extensions.

    Args:
      file_path: Input file path.
      Sample Input File: ~/Downloads/Manual/2017.09.22_14.27.09.zip

    Returns:
      List of base file names with different extensions.
      Sample base file names returned in split_file_list:
      base: 2017.09.22_14.27.09.zip
      basename: 2017.09.22_14.27.09
      basename_xml_file: 2017.09.22_14.27.09.xml
      basename_xml_gz_file: 2017.09.22_14.27.09.xml.gz
    """
    base = os.path.basename(file_path)
    basename = os.path.splitext(base)[0]
    basename_xml_file = '%s%s' % (basename, '.xml')
    basename_xml_gz_file = '%s%s%s' % (basename, '.xml', '.gz')
    return [base,
            basename,
            basename_xml_file,
            basename_xml_gz_file]

  def PrintFormattedDataCtsv(self, item):
    """Prints build information in a tabular form to the terminal.

    Sample table printed to terminal:
    Build Board Name : Build Board Version : CTS VERIFIER VERSION
    : relm           : R62-9901.20.0       : 7.1_r9

    Args:
       item: Information list to be printed to terminal.
    """
    print(('{:^%s}'%self.SPACE_COUNT_CTSV_BOARD_NAME).format(item[1]),
          ('{:>%s}'%self.SPACE_COUNT_CTSV_BUILD_VERSION).format(item[2]),
          ('{:>%s}'%self.SPACE_COUNT_VERIFIER_VERSION).format(item[3]))

  def PrintFormattedDataCts(self, item):
    """Prints build information in a tabular form to the terminal.

    Sample table printed to terminal:
    : Time Stamp         : Build Board Name : Build Version: Build BOARD ABI
    : PACKAGE NAME           : FAILED  : PASSED
    : 2017.09.22_14.27.09: relm             : R62-9901.20.0: x86
    : CtsUsageStatsTestCases : 0       : 1

    Args:
      item: Information List to be printed to terminal.
    """
    print(('{:>%s}'%self.SPACE_COUNT_TIMESTAMP).format(item[0]),
          ('{:^%s}'%self.SPACE_COUNT_CTS_BOARD_NAME).format(item[1]),
          ('{:^%s}'%self.SPACE_COUNT_CTS_BUILD_VERSION).format(item[2]),
          ('{:>%s}'%self.SPACE_COUNT_CTS_BOARD_ABI).format(item[3]),
          ('{:^%s}'%self.SPACE_COUNT_PACKAGE_NAME).format(item[4]),
          ('{:<%s}'%self.SPACE_COUNT_FAILED_TESTS).format(item[5]),
          ('{:<%s}'%self.SPACE_COUNT_PASSED_TESTS).format(item[6]))

  def GetXmlTagNamesCtsv(self):
    """Get xml tag names.

    Returns:
      tag_list: List of xml tag names.
    """
    BUILD_N = 'Build'
    RESULT = 'Result'
    SUITE_VERSION = 'suite_version'
    BUILD_BOARD = 'build_board'
    BUILD_ID_N = 'build_id'
    TEST = 'Test'
    return [BUILD_N,
            RESULT,
            SUITE_VERSION,
            BUILD_BOARD,
            BUILD_ID_N,
            TEST]

  def GetXmlTagNamesCts(self, test_result_filename):
    """Get xml tag names from M/N test result xml file.

    Args:
      test_result_filename: M/N Build Test Result file name.

    Returns:
      tag_list: List of xml tag names.
    """
    TEST_RESULT_FILENAME_M_BUILD = 'testResult.xml'
    SUMMARY = 'Summary'
    BUILD_M = 'BuildInfo'
    BUILD_N = 'Build'
    BUILD_BOARD_VERSION = 'build_board'
    BUILD_ID_M = 'buildID'
    BUILD_ID_N = 'build_id'
    TEST_PACKAGE_LIST_M = 'TestPackage'
    TEST_PACKAGE_LIST_N = 'Module'
    TEST_PACKAGE_NAME_M = 'appPackageName'
    TEST_PACKAGE_NAME_N = 'name'
    BUILD_ABI_TYPE = 'abi'
    FAILED = 'failed'
    PASSED = 'pass'
    if test_result_filename == TEST_RESULT_FILENAME_M_BUILD:
      BUILD_VERSION = BUILD_M
      BUILD_ID_TYPE = BUILD_ID_M
      TEST_PACKAGE_LIST_VERSION = TEST_PACKAGE_LIST_M
      TEST_PACKAGE_NAME_VERSION = TEST_PACKAGE_NAME_M
    else:
      BUILD_VERSION = BUILD_N
      BUILD_ID_TYPE = BUILD_ID_N
      TEST_PACKAGE_LIST_VERSION = TEST_PACKAGE_LIST_N
      TEST_PACKAGE_NAME_VERSION = TEST_PACKAGE_NAME_N
    return [SUMMARY,
            BUILD_VERSION,
            BUILD_BOARD_VERSION,
            BUILD_ID_TYPE,
            TEST_PACKAGE_LIST_VERSION,
            TEST_PACKAGE_NAME_VERSION,
            BUILD_ABI_TYPE,
            FAILED,
            PASSED]

  def UpdateBuildInfoList(self, obj):
    """Appends object to list.

    Args:
      obj: Contents to be appended to list.
    """
    self.build_info_list.append(obj)

  def CreateApfeFolder(self, filename, dir_path):
    """Creates hierarchy for uploading result files to APFE bucket.

    Args:
      filename: Valid file to upload to APFE folder.
      dir_path: Results directory path.
    """
    build_board = ''
    build_id = ''
    split_file_list = self.SplitFileName(filename)
    base = split_file_list[0]
    build_board = self.build_info_list[-1][1]
    build_id = self.build_info_list[-1][2]
    release_folder = '%s-release' % build_board
    build_folder = '%s' % build_id
    manual_folder = 'manual'
    apfe_path = os.path.join(dir_path, release_folder, build_folder,
                             manual_folder)
    if not os.path.exists(apfe_path):
      os.makedirs(apfe_path)
    self.CopyFileToDestination(dir_path, base, apfe_path, base)

  def CreateCtsFolder(self, filename, dir_path):
    """Creates hierarchy for upload to CTS Dashboard bucket.

    Args:
      filename: Input File to be added to CTS folder.
      dir_path: Results directory path.
    """
    build_id = None
    build_board = None
    build_board = self.build_info_list[-1][1]
    build_id = self.build_info_list[-1][2]
    split_file_list = self.SplitFileName(filename)
    basename_xml_file = split_file_list[2]
    basename_xml_gz_file = split_file_list[3]
    build_id_board_folder = '%s_%s' % (build_id, build_board)
    cts_path = os.path.join(dir_path, build_id_board_folder)
    if not os.path.exists(cts_path):
      os.makedirs(cts_path)
    gzip_file_path = os.path.join(dir_path, basename_xml_file)
    check_call(['gzip', gzip_file_path])
    self.CopyFileToDestination(dir_path,
                               basename_xml_gz_file,
                               cts_path,
                               basename_xml_gz_file)

  def CreateUntestedFolder(self, filename, dir_path):
    """Creates Untested Folder to save files if there are UnTested Tests.

    Args:
      filename: Input file name.
      dir_path: Results directory path.
    """
    split_file_list = self.SplitFileName(filename)
    base = split_file_list[0]
    if self.untested_tests_exist is True:
      self.untested_file_count = self.untested_file_count + 1
    untested_folder = 'Untested Tests'
    untested_path = os.path.join(dir_path, untested_folder)
    if not os.path.exists(untested_path):
      os.makedirs(untested_path)
    self.CopyFileToDestination(dir_path, base, untested_path, base)

  def CreateObsoleteFolder(self, filename, dir_path):
    """Creates Obsolete Folder to save files if there is a BUILDID mismatch.

    Args:
      filename: Input file name.
      dir_path: Results directory path.
    """
    split_file_list = self.SplitFileName(filename)
    base = split_file_list[0]
    if self.build_mismatch_exist is True:
      self.build_mismatch_file_count = self.build_mismatch_file_count + 1
    if self.untested_tests_exist is True:
      self.untested_file_count = self.untested_file_count + 1
    obsolete_folder = 'BuildID Mismatch Folder'
    obsolete_path = os.path.join(dir_path, obsolete_folder)
    if not os.path.exists(obsolete_path):
      os.makedirs(obsolete_path)
    self.CopyFileToDestination(dir_path, base, obsolete_path, base)
