// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/android/remove_stale_data.h"

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "base/trace_event/base_tracing.h"

namespace base {
namespace android {

namespace {

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class DeleteResult {
  kNotFound = 0,
  kDeleted = 1,
  kDeleteError = 2,
  kMaxValue = kDeleteError,
};

void RecordDeleteResult(DeleteResult result) {
  base::UmaHistogramEnumeration("NetworkService.ClearStaleDataDirectoryResult",
                                result);
}

void RemoveStaleDataDirectoryOnPool(const base::FilePath& data_directory) {
  TRACE_EVENT0("startup", "RemoveStaleDataDirectoryOnPool");
  if (!base::PathExists(data_directory)) {
    RecordDeleteResult(DeleteResult::kNotFound);
    return;
  }
  if (base::DeletePathRecursively(data_directory)) {
    RecordDeleteResult(DeleteResult::kDeleted);
    return;
  }
  RecordDeleteResult(DeleteResult::kDeleteError);
}

}  // namespace

void RemoveStaleDataDirectory(const base::FilePath& data_directory) {
  base::ThreadPool::PostTask(
      FROM_HERE,
      {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
      base::BindOnce(&RemoveStaleDataDirectoryOnPool, data_directory));
}

}  // namespace android
}  // namespace base