# 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 throttler reduces result size by deleting files permanently."""

import os

import throttler_lib
import utils_lib


# Default threshold of file size in KB for a file to be qualified for deletion.
DEFAULT_FILE_SIZE_THRESHOLD_BYTE = 1024 * 1024

# Regex for file path that should not be deleted.
NON_DELETABLE_FILE_PATH_PATTERNS = [
        '.*perf.data$',       # Performance test data.
        ]

def _delete_file(file_info):
    """Delete the given file and update the summary.

    @param file_info: A ResultInfo object containing summary for the file to be
            shrunk.
    """
    utils_lib.LOG('Deleting file %s.' % file_info.path)
    try:
        os.remove(file_info.path)
    except OSError as e:
        utils_lib.LOG('Failed to delete file %s Error: %s' %
                      (file_info.path, e))

    # Update the trimmed_size in ResultInfo.
    file_info.trimmed_size = 0


def throttle(summary, max_result_size_KB,
             file_size_threshold_byte=DEFAULT_FILE_SIZE_THRESHOLD_BYTE,
             exclude_file_patterns=[]):
    """Throttle the files in summary by trimming file content.

    Stop throttling until all files are processed or the result size is already
    reduced to be under the given max_result_size_KB.

    @param summary: A ResultInfo object containing result summary.
    @param max_result_size_KB: Maximum test result size in KB.
    @param file_size_threshold_byte: Threshold of file size in byte for a file
            to be qualified for deletion. All qualified files will be deleted,
            until all files are processed or the result size is under the given
            max_result_size_KB.
    @param exclude_file_patterns: A list of regex pattern for files not to be
            throttled. Default is an empty list.
    """
    file_infos, _ = throttler_lib.sort_result_files(summary)
    file_infos = throttler_lib.get_throttleable_files(
            file_infos,
            exclude_file_patterns + NON_DELETABLE_FILE_PATH_PATTERNS)

    for info in file_infos:
        if info.trimmed_size > file_size_threshold_byte:
            _delete_file(info)
            if throttler_lib.check_throttle_limit(summary, max_result_size_KB):
                return