// Copyright 2018 The Chromium 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 "chromeos/services/assistant/platform/file_provider_impl.h"

#include "base/logging.h"
#include "chromeos/grit/chromeos_resources.h"
#include "chromeos/services/assistant/utils.h"
#include "ui/base/resource/resource_bundle.h"

namespace chromeos {
namespace assistant {
namespace {

constexpr int kReadFileSizeLimitInBytes = 10 * 1024 * 1024;

}  // namespace

FileProviderImpl::FileProviderImpl()
    : root_path_(
          GetRootPath().Append(FILE_PATH_LITERAL("google-assistant-library"))) {
}

FileProviderImpl::~FileProviderImpl() = default;

std::string FileProviderImpl::ReadFile(const std::string& path) {
  std::string data;
  base::ReadFileToStringWithMaxSize(root_path_.Append(path), &data,
                                    kReadFileSizeLimitInBytes);
  return data;
}

bool FileProviderImpl::WriteFile(const std::string& path,
                                 const std::string& data) {
  base::FilePath full_path = root_path_.Append(path);
  if (!base::PathExists(full_path.DirName()) &&
      !base::CreateDirectory(full_path.DirName()))
    return false;

  // Create a temp file.
  base::FilePath temp_file;
  if (!base::CreateTemporaryFileInDir(full_path.DirName(), &temp_file)) {
    return false;
  }

  // Write to the tmp file.
  const int size = data.size();
  int written_size = base::WriteFile(temp_file, data.data(), size);
  if (written_size != size) {
    return false;
  }

  // Replace the current file with the temp file.
  if (!base::ReplaceFile(temp_file, full_path, nullptr)) {
    return false;
  }

  return true;
}

std::string FileProviderImpl::ReadSecureFile(const std::string& path) {
  return ReadFile(path);
}

bool FileProviderImpl::WriteSecureFile(const std::string& path,
                                       const std::string& data) {
  // No need to encrypt since |root_path_| should be inside the primary user's
  // cryptohome and is already encrypted.
  return WriteFile(path, data);
}

void FileProviderImpl::CleanAssistantData() {
  base::DeleteFile(root_path_, true);
}

bool FileProviderImpl::GetResource(uint16_t resource_id, std::string* out) {
  int chrome_resource_id = -1;
  switch (resource_id) {
    case assistant_client::resource_ids::kGeneralError:
      chrome_resource_id = IDR_ASSISTANT_SPEECH_RECOGNITION_ERROR;
      break;
    case assistant_client::resource_ids::kWifiNeedsSetupError:
    case assistant_client::resource_ids::kWifiNotConnectedError:
    case assistant_client::resource_ids::kWifiCannotConnectError:
    case assistant_client::resource_ids::kNetworkConnectingError:
    // These above do not apply to ChromeOS, but let it fall through to get a
    // generic error.
    case assistant_client::resource_ids::kNetworkCannotReachServerError:
      chrome_resource_id = IDR_ASSISTANT_NO_INTERNET_ERROR;
      break;
    default:
      break;
  }

  if (chrome_resource_id < 0)
    return false;

  auto data = ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
      chrome_resource_id);
  out->assign(data.data(), data.length());
  return true;
}

}  // namespace assistant
}  // namespace chromeos
