// Copyright 2020 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.

#include "arc/apk-cache/apk_cache_ctl_commands.h"

#include <sysexits.h>

#include <iostream>
#include <string>
#include <vector>

#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/optional.h>
#include <sqlite3.h>

#include "arc/apk-cache/apk_cache_database.h"
#include "arc/apk-cache/apk_cache_utils.h"

namespace apk_cache {

ExitCode CommandLs(const base::FilePath& cache_root, std::ostream& out_stream) {
  base::FilePath db_path = cache_root.AppendASCII(kDatabaseFile);
  base::FilePath files_base = cache_root.AppendASCII(kFilesBase);

  // If database file does not exist, exit.
  if (!base::PathExists(db_path)) {
    LOG(ERROR) << "APK Cache database does not exist.";
    return ExitCode::kErrorNoDatabase;
  }

  // Open database connection
  apk_cache::ApkCacheDatabase apk_cache_database(db_path);
  if (apk_cache_database.Init() != SQLITE_OK) {
    LOG(ERROR) << "Failed to open database.";
    return ExitCode::kErrorDatabaseOpenFail;
  }

  auto file_entries = apk_cache_database.GetFileEntries();
  if (!file_entries) {
    LOG(ERROR) << "Failed to query in database.";
    return ExitCode::kErrorDatabaseQueryFail;
  }

  for (const FileEntry& entry : *file_entries) {
    out_stream << "ID: " << entry.id << "\tPackage: " << entry.package_name
               << "\tVersion: " << entry.version_code
               << "\tPriority: " << entry.priority << "\tType: " << entry.type
               << "\tTimestamp: " << entry.access_time
               << "\tHash: " << entry.hash.value_or("null")
               << "\tSize: " << entry.size << "\tSize on disk: ";

    // Check actual file size on disk.
    base::FilePath file_path =
        files_base.AppendASCII(GetFileNameById(entry.id));

    int64_t file_size;
    if (base::GetFileSize(file_path, &file_size))
      out_stream << file_size;
    else
      out_stream << "null";

    out_stream << std::endl;
  }

  return ExitCode::kOk;
}

}  // namespace apk_cache
