#pragma once

#include <boost/signals2.hpp>

#include "config.h"

// Virtual base class
// Abstraction of BPM detection / setting
class Click
{
public:
  Click(){}
  virtual ~Click(){}
};

// Internally generated
// Configured via: BPM
class InternalClick: public Click
{
public:
  InternalClick(Config& config): m_bpm(config.get_bpm()){}
  virtual ~InternalClick(){}

private:
  int m_bpm;
};

// Generated from MIDI notes
// Configured via channel and note to listen to
class NoteClick: public Click
{
public:
  NoteClick(Config& config):
    m_channel(config.get_midi_channel()),
    m_note(config.get_midi_note())
  {
  }

  virtual ~NoteClick(){}

  // signals
  boost::signals2::signal<void()> signal_click;

  // slots
  void receive_note(int channel, int note, uint64_t timestamp)
  {
    (void) timestamp;

    if (true || (channel == m_channel && note == m_note)) {
      signal_click();
    }
  }

private:
  int m_channel;
  int m_note;
};

// Generated from MIDI Clock
class ClockClick: public Click
{
public:
  ClockClick(){}
  virtual ~ClockClick(){}
};