// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/storage/savegame.h"

#include "base/debug/trace_event.h"
#include "base/logging.h"

namespace cobalt {
namespace storage {

// An arbitrary max size for |last_bytes_| to prevent it from growing larger
// than desired.
size_t kMaxLastBytesSize = 128 * 1024;

Savegame::Savegame(const Options& options) : options_(options) {}

Savegame::~Savegame() {}

bool Savegame::Read(std::vector<uint8>* bytes, size_t max_to_read) {
  DCHECK(thread_checker_.CalledOnValidThread());
  TRACE_EVENT0("cobalt::storage", "Savegame::Read()");
  bool ret = PlatformRead(bytes, max_to_read);
  return ret;
}

bool Savegame::Write(const std::vector<uint8>& bytes) {
  DCHECK(thread_checker_.CalledOnValidThread());
  TRACE_EVENT0("cobalt::storage", "Savegame::Write()");
  if (bytes == last_bytes_) {
    return true;
  }

  bool ret = PlatformWrite(bytes);

  if (bytes.size() <= kMaxLastBytesSize) {
    last_bytes_ = bytes;
  } else {
    DLOG(WARNING) << "Unable to cache last savegame, which is used to prevent "
                     "duplicate saves, because it is too large: "
                  << bytes.size() << " bytes";
    last_bytes_.clear();
  }

  return ret;
}

bool Savegame::Delete() {
  DCHECK(thread_checker_.CalledOnValidThread());
  return PlatformDelete();
}

}  // namespace storage
}  // namespace cobalt
