/*
  ==============================================================================

    This file contains the basic framework code for a JUCE plugin processor.

  ==============================================================================
*/

#pragma once

#include <JuceHeader.h>

struct FilePlay {
  int position;
  int fileIndex;
  float volume;
};

//==============================================================================
/**
*/
class CustomDrumsAudioProcessor : public juce::AudioProcessor {
public:
  //==============================================================================
  CustomDrumsAudioProcessor();
  ~CustomDrumsAudioProcessor() override;

  //==============================================================================
  void prepareToPlay(double sampleRate, int samplesPerBlock) override;
  void loadFile(juce::MemoryInputStream* input);
  void loadFiles();
  void releaseResources() override;

  bool isBusesLayoutSupported(const BusesLayout& layouts) const override;

  void processBlock(juce::AudioBuffer<float>&, juce::MidiBuffer&) override;

  //==============================================================================
  juce::AudioProcessorEditor* createEditor() override;
  bool hasEditor() const override;

  //==============================================================================
  const juce::String getName() const override;

  bool acceptsMidi() const override;
  bool producesMidi() const override;
  bool isMidiEffect() const override;
  double getTailLengthSeconds() const override;

  //==============================================================================
  int getNumPrograms() override;
  int getCurrentProgram() override;
  void setCurrentProgram(int index) override;
  const juce::String getProgramName(int index) override;
  void changeProgramName(int index, const juce::String& newName) override;

  //==============================================================================
  void getStateInformation(juce::MemoryBlock& destData) override;
  void setStateInformation(const void* data, int sizeInBytes) override;

private:
  juce::AudioFormatManager formatManager;
  juce::AudioFormat* wavFormat;
  std::vector<FilePlay> fileQueue;
  std::vector<juce::AudioSampleBuffer> fileBuffers;

  void playSamples(juce::AudioBuffer<float>& buffer);

  //==============================================================================
  JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CustomDrumsAudioProcessor)
};
