#ifndef MISSION_TMTC_PERSISTENTLOGTMSTORETASK_H_
#define MISSION_TMTC_PERSISTENTLOGTMSTORETASK_H_

#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/storagemanager/StorageManagerIF.h>
#include <fsfw/tasks/ExecutableObjectIF.h>
#include <fsfw/tmtcservices/AcceptsTelemetryIF.h>
#include <mission/com/TmStoreTaskBase.h>
#include <mission/com/VirtualChannelWithQueue.h>
#include <mission/genericFactory.h>
#include <mission/tmtc/PersistentTmStore.h>
#include <mission/tmtc/PersistentTmStoreWithTmQueue.h>

struct LogStores {
  LogStores(PersistentTmStores& stores)
      : okStore(*stores.okStore), notOkStore(*stores.notOkStore), miscStore(*stores.miscStore) {}
  PersistentTmStoreWithTmQueue& okStore;
  PersistentTmStoreWithTmQueue& notOkStore;
  PersistentTmStoreWithTmQueue& miscStore;
};

class PersistentLogTmStoreTask : public TmStoreTaskBase, public ExecutableObjectIF {
 public:
  PersistentLogTmStoreTask(object_id_t objectId, StorageManagerIF& ipcStore, LogStores tmStore,
                           VirtualChannel& channel, SdCardMountedIF& sdcMan,
                           const std::atomic_bool& ptmeLocked);

  ReturnValue_t performOperation(uint8_t opCode) override;

 private:
  LogStores stores;
  DumpContext okStoreContext;
  DumpContext notOkStoreContext;
  DumpContext miscStoreContext;
  Countdown tcHandlingCd = Countdown(400);
  Countdown graceDelayDuringDumping = Countdown(200);
  bool someFileWasSwapped = false;

  bool initStoresIfPossible() override;
  void startTransition(Mode_t mode, Submode_t submode) override;
};

#endif /* MISSION_TMTC_PERSISTENTLOGTMSTORETASK_H_ */