/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2013-2017, Regents of the University of California.
 *
 * This file is part of ChronoShare, a decentralized file sharing application over NDN.
 *
 * ChronoShare is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * ChronoShare is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received copies of the GNU General Public License along with
 * ChronoShare, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 *
 * See AUTHORS.md for complete list of ChronoShare authors and contributors.
 */

#ifndef CHRONOSHARE_SRC_DISPATCHER_HPP
#define CHRONOSHARE_SRC_DISPATCHER_HPP

#include "core/chronoshare-common.hpp"

#include "action-log.hpp"
#include "content-server.hpp"
#include "fetch-manager.hpp"
#include "object-db.hpp"
#include "object-manager.hpp"
#include "sync-core.hpp"

#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <map>

namespace ndn {
namespace chronoshare {

typedef shared_ptr<ActionItem> ActionItemPtr;

// TODO:
// This class lacks a permanent table to store the files in fetching process
// and fetch the missing pieces for those in the table after the application launches

/**
  * @brief Class synchroize different components
  *
  * - from SyncLog: when state changes -> to fetch missing actions
  *
  * - from FetchManager/Actions: when action is fetched -> to request a file, specified by the action
  *                                                     -> to add action to the action log
  *
  * - from ActionLog/Delete: when action applied(file state changed, file deleted) -> to delete local file
  *
  * - from ActionLog/AddOrUpdate: when action applied(file state changes, file added or modified) ->
  *                               to assemble the file if file is available in the ObjectDb, otherwise, do nothing
  *
  * - from FetchManager/Files: when file segment is retrieved -> save it in ObjectDb
  *                            when file fetch is completed   -> if file belongs to FileState, then assemble
  *                            it to filesystem. Don't do anything otherwise
  */

class Dispatcher
{
public:
  // sharedFolder is the name to be used in NDN name;
  // rootDir is the shared folder dir in local file system;
  Dispatcher(const std::string& localUserName, const std::string& sharedFolder,
             const boost::filesystem::path& rootDir, Face& face, bool enablePrefixDiscovery = true);
  ~Dispatcher();

  // ----- Callbacks, they only submit the job to executor and immediately return so that event
  // processing thread won't be blocked for too long -------

  // callback to process local file change
  void
  Did_LocalFile_AddOrModify(const boost::filesystem::path& relativeFilepath);

  void
  Did_LocalFile_Delete(const boost::filesystem::path& relativeFilepath);

  /**
   * @brief Invoked when FileState is detected to have a file which does not exist on a file system
   */
  void
  Restore_LocalFile(FileItemPtr file);

  // for test
  ConstBufferPtr
  SyncRoot()
  {
    return m_core->root();
  }

  inline void
  LookupRecentFileActions(const boost::function<void(const std::string&, int, int)>& visitor,
                          int limit)
  {
    m_actionLog->LookupRecentFileActions(visitor, limit);
  }

private:
  void
  Did_LocalFile_AddOrModify_Execute(boost::filesystem::path relativeFilepath); // cannot be const &
                                                                               // for Execute
                                                                               // event!!! otherwise
                                                                               // there will be
                                                                               // segfault

  void
  Did_LocalFile_Delete_Execute(boost::filesystem::path relativeFilepath); // cannot be const & for
                                                                          // Execute event!!!
                                                                          // otherwise there will be
                                                                          // segfault

  void
  Restore_LocalFile_Execute(FileItemPtr file);

private:
  /**
   * Callbacks:
   *
   * - from SyncLog: when state changes -> to fetch missing actions
   *
   * - from FetchManager/Actions: when action is fetched -> to request a file, specified by the action
   *                                                     -> to add action to the action log
   *
   * - from ActionLog/Delete: when action applied(file state changed, file deleted) -> to delete local file
   *
   * - from ActionLog/AddOrUpdate: when action applied(file state changes, file added or modified) ->
   *                               to assemble the file if file is available in the ObjectDb, otherwise, do nothing
   *
   * - from FetchManager/Files: when file segment is retrieved -> save it in ObjectDb
   *                            when file fetch is completed   -> if file belongs to FileState, then assemble
   *                            it to filesystem. Don't do anything otherwise
   */

  // callback to process remote sync state change
  void
  Did_SyncLog_StateChange(SyncStateMsgPtr stateMsg);

  void
  Did_SyncLog_StateChange_Execute(SyncStateMsgPtr stateMsg);

  void
  Did_FetchManager_ActionFetch(const Name& deviceName, const Name& actionName, uint32_t seqno,
                               shared_ptr<Data> actionData);

  void
  Did_ActionLog_ActionApply_Delete(const std::string& filename);

  void
  Did_ActionLog_ActionApply_Delete_Execute(std::string filename);

  // void
  // Did_ActionLog_ActionApply_AddOrModify(const std::string &filename, Name device_name,
  // sqlite3_int64 seq_no,
  //                                        ConstBufferPtr hash, time_t m_time, int mode, int
  //                                        seg_num);

  void
  Did_FetchManager_FileSegmentFetch(const Name& deviceName, const Name& fileSegmentName,
                                    uint32_t segment, shared_ptr<Data> fileSegmentData);

  void
  Did_FetchManager_FileSegmentFetch_Execute(Name deviceName, Name fileSegmentName, uint32_t segment,
                                            shared_ptr<Data> fileSegmentData);

  void
  Did_FetchManager_FileFetchComplete(const Name& deviceName, const Name& fileBaseName);

  void
  Did_FetchManager_FileFetchComplete_Execute(Name deviceName, Name fileBaseName);

  void
  Did_LocalPrefix_Updated(const Name& prefix);

private:
  void
  AssembleFile_Execute(const Name& deviceName, const Buffer& filehash,
                       const boost::filesystem::path& relativeFilepath);

  // void
  // fileChanged(const boost::filesystem::path &relativeFilepath, ActionType type);

  // void
  // syncStateChanged(const SyncStateMsgPtr &stateMsg);

  // void
  // actionReceived(const ActionItemPtr &actionItem);

  // void
  // fileSegmentReceived(const Name &name, const Ccnx::Bytes &content);

  // void
  // fileReady(const Name &fileNamePrefix);

private:
  Face& m_face;
  unique_ptr<SyncCore> m_core;
  SyncLogPtr m_syncLog;
  ActionLogPtr m_actionLog;
  FileStatePtr m_fileState;
  FileStatePtr m_fileStateCow;

  boost::filesystem::path m_rootDir;
  boost::asio::io_service& m_ioService;

  ObjectManager m_objectManager;
  Name m_localUserName;
  // maintain object db ptrs so that we don't need to create them
  // for every fetched segment of a file

  std::map<Buffer, shared_ptr<ObjectDb>> m_objectDbMap;

  std::string m_sharedFolder;
  unique_ptr<ContentServer> m_server;
  //unique_ptr<StateServer> m_stateServer;
  bool m_enablePrefixDiscovery;

  FetchManagerPtr m_actionFetcher;
  FetchManagerPtr m_fileFetcher;

  KeyChain m_keyChain;
};

namespace error {
struct Dispatcher : virtual boost::exception, virtual std::exception
{
};
typedef boost::error_info<struct tag_errmsg, std::string> error_info_str;
} // namespace error

} // namespace chronoshare
} // namespace ndn

#endif // CHRONOSHARE_SRC_DISPATCHER_HPP
