#ifndef CustomPluginScanner_hpp
#define CustomPluginScanner_hpp

#include "common.h"
#include <JuceHeader.h>

class ScannerSuperprocess;

class CustomPluginScanner final : public juce::KnownPluginList::CustomScanner
{
public:
    CustomPluginScanner(const juce::String& architecture, const std::list<juce::String> & skipIdentifiers);
    ~CustomPluginScanner() override;
    
    bool findPluginTypesFor (juce::AudioPluginFormat& format,
                             juce::OwnedArray<juce::PluginDescription>& result,
                             const juce::String& fileOrIdentifier) override;
    
    void scanFinished() override;
    
private:
    /*  Scans for a plugin with format 'formatName' and ID 'fileOrIdentifier' using a subprocess,
        and adds discovered plugin descriptions to 'result'.

        Returns true on success.

        Failure indicates that the subprocess is unrecoverable and should be terminated.
    */
    bool addPluginDescriptions (const juce::String& formatName,
                                const juce::String& fileOrIdentifier,
                                juce::OwnedArray<juce::PluginDescription>& result);

    juce::String architecture;
    std::mutex threadSuperprocessMutex;
    std::map<platform_thread_t, std::unique_ptr<ScannerSuperprocess>> threadSuperprocess;
    std::list<juce::String> skipIdentifiers;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomPluginScanner)
};

#endif /* CustomPluginScanner_hpp */
