//  SPDX-License-Identifier: MIT
//
//  EmulationStation Desktop Edition
//  GuiOrphanedDataCleanup.h
//
//  Removes orphaned game media, gamelist.xml entries and custom collections entries.
//

#ifndef ES_APP_GUIS_GUI_ORPHANED_DATA_CLEANUP_H
#define ES_APP_GUIS_GUI_ORPHANED_DATA_CLEANUP_H

#include "GuiComponent.h"
#include "components/BusyComponent.h"
#include "guis/GuiSettings.h"
#include "views/ViewController.h"

#include <atomic>
#include <mutex>
#include <thread>

class GuiOrphanedDataCleanup : public GuiComponent
{
public:
    GuiOrphanedDataCleanup(std::function<void()> reloadCallback);
    ~GuiOrphanedDataCleanup();

    void cleanupMediaFiles();
    void cleanupGamelists();
    void cleanupCollections();

    void update(int deltaTime) override;
    void render(const glm::mat4& parentTrans) override;

private:
    void onSizeChanged() override;
    bool input(InputConfig* config, Input input) override;

    std::vector<HelpPrompt> getHelpPrompts() override;
    HelpStyle getHelpStyle() override { return ViewController::getInstance()->getViewHelpStyle(); }

    Renderer* mRenderer;
    NinePatchComponent mBackground;
    ComponentGrid mGrid;
    BusyComponent mBusyAnim;
    std::function<void()> mReloadCallback;

    std::shared_ptr<ComponentGrid> mButtons;
    std::shared_ptr<ButtonComponent> mButton1;
    std::shared_ptr<ButtonComponent> mButton2;
    std::shared_ptr<ButtonComponent> mButton3;
    std::shared_ptr<ButtonComponent> mButton4;

    std::shared_ptr<TextComponent> mTitle;
    std::shared_ptr<TextComponent> mStatus;
    std::shared_ptr<TextComponent> mDescriptionHeader;
    std::shared_ptr<TextComponent> mDescription;
    std::shared_ptr<TextComponent> mSystemProcessingHeader;
    std::shared_ptr<TextComponent> mEntryCountHeader;
    std::shared_ptr<TextComponent> mSystemProcessing;
    std::shared_ptr<TextComponent> mEntryCount;
    std::shared_ptr<TextComponent> mErrorHeader;
    std::shared_ptr<TextComponent> mError;

    std::unique_ptr<std::thread> mThread;
    std::mutex mMutex;
    int mCursorPos;

    std::string mMediaDescription;
    std::string mGamelistDescription;
    std::string mCollectionsDescription;
    std::string mCurrentSystem;
    std::string mErrorMessage;

    std::string mMediaDirectory;
    std::vector<std::string> mMediaTypes;

    std::atomic<bool> mIsProcessing;
    std::atomic<bool> mStopProcessing;
    std::atomic<bool> mCompleted;
    std::atomic<bool> mFailed;
    std::atomic<bool> mNeedsReloading;
    std::atomic<int> mProcessedCount;
    bool mHasCustomCollections;
    bool mCaseSensitiveFilesystem;

    enum class CleanupType {
        MEDIA,
        GAMELISTS,
        COLLECTIONS
    };

    CleanupType mCleanupType;
};

#endif // ES_APP_GUIS_GUI_ORPHANED_DATA_CLEANUP_H
