// Copyright 2016 The Cobalt Authors. 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.

#ifndef COBALT_STORAGE_SAVEGAME_THREAD_H_
#define COBALT_STORAGE_SAVEGAME_THREAD_H_

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h"
#include "cobalt/storage/savegame.h"

namespace cobalt {
namespace storage {

// The SavegameThread wraps a Savegame object within its own thread in order to
// enable asynchronous writes to the savegame object.
class SavegameThread {
 public:
  explicit SavegameThread(const Savegame::Options& options);
  ~SavegameThread();

  // Returns the savegame data that existed on disk on startup.  This method
  // should only be called once, as the data will be released after it is
  // called.
  scoped_ptr<Savegame::ByteVector> GetLoadedRawBytes();

  // Flush data to be written to the savegame file.  The write will happen
  // asynchronously on SavegameThread's I/O thread, so this method will return
  // immediately.
  void Flush(scoped_ptr<Savegame::ByteVector> raw_bytes_ptr,
             const base::Closure& on_flush_complete);

 private:
  // Run on the I/O thread to start loading the savegame.
  void InitializeOnIOThread();

  // Called by the destructor, to ensure we destroy certain objects on the
  // I/O thread.
  void ShutdownOnIOThread();

  // Runs on the I/O thread to write the database to the savegame's persistent
  // storage.
  void FlushOnIOThread(scoped_ptr<Savegame::ByteVector> raw_bytes_ptr,
                       const base::Closure& on_flush_complete);

  // Savegame options passed in to SavegameThread's constructor.
  Savegame::Options options_;

  // On initialization, we'll read from the existing savegame file to get
  // the latest data.  This holds a reference to that data, but is released
  // as soon as GetLoadedRawBytes() is called for the first time.
  scoped_ptr<Savegame::ByteVector> loaded_raw_bytes_;

  // The database gets loaded from disk. We block on returning a SQL context
  // until storage_ready_ is signalled.
  base::WaitableEvent initialized_;

  // Storage I/O (savegame reads/writes) runs on a separate thread.
  scoped_ptr<base::Thread> thread_;

  // Interface to platform-specific savegame data.
  scoped_ptr<Savegame> savegame_;

  // How many flush failures have occurred since the last successful flush.
  // Flushes (storage writes) may sometimes fail, but we want to make sure
  // they're not consistently failing.
  int num_consecutive_flush_failures_;
};

}  // namespace storage
}  // namespace cobalt

#endif  // COBALT_STORAGE_SAVEGAME_THREAD_H_
