#include "TaskCleanStorage.h"

#include "Application.h"
#include "Blackboard.h"
#include "DialogView.h"
#include "FilePath.h"
#include "PersistentStorage.h"

TaskCleanStorage::TaskCleanStorage(
	std::weak_ptr<PersistentStorage> storage,
	std::shared_ptr<DialogView> dialogView,
	const std::vector<FilePath>& filePaths,
	bool clearAllErrors)
	: m_storage(storage)
	, m_dialogView(dialogView)
	, m_filePaths(filePaths)
	, m_clearAllErrors(clearAllErrors)
{
}

void TaskCleanStorage::doEnter(std::shared_ptr<Blackboard> blackboard)
{
	m_dialogView->showUnknownProgressDialog(
		L"Clearing Files", std::to_wstring(m_filePaths.size()) + L" Files");

	m_start = TimeStamp::now();

	if (!m_filePaths.empty() || m_clearAllErrors)
	{
		if (std::shared_ptr<PersistentStorage> storage = m_storage.lock())
		{
			storage->setMode(SqliteIndexStorage::STORAGE_MODE_CLEAR);
		}
	}
}

Task::TaskState TaskCleanStorage::doUpdate(std::shared_ptr<Blackboard> blackboard)
{
	if (std::shared_ptr<PersistentStorage> storage = m_storage.lock())
	{
		if (m_clearAllErrors)
		{
			storage->clearAllErrors();
		}

		storage->clearFileElements(m_filePaths, [=](int progress) {
			m_dialogView->showProgressDialog(
				L"Clearing", std::to_wstring(m_filePaths.size()) + L" Files", progress);
		});
	}

	m_filePaths.clear();

	return STATE_SUCCESS;
}

void TaskCleanStorage::doExit(std::shared_ptr<Blackboard> blackboard)
{
	blackboard->set("clear_time", TimeStamp::durationSeconds(m_start));

	m_dialogView->hideProgressDialog();
}

void TaskCleanStorage::doReset(std::shared_ptr<Blackboard> blackboard) {}