#ifndef WSPR_BAND_HOPPING_HPP__
#define WSPR_BAND_HOPPING_HPP__

#include <QObject>

#include "pimpl_h.hpp"

class QSettings;
class Configuration;
class QWidget;

//
// WSPR Band Hopping Control
//
//  WSPR specifies  a globally  coordinated band hopping  schedule and
//  this class implements that.
//
// Responsibilities
//
//  Provides a  maintenance dialog allowing  the user to  define which
//  bands are allowed from the band hopping schedule as defined here:
//
//    http://physics.princeton.edu/pulsar/K1JT/doc/wspr/wspr-main.html
//
//  Along with selecting bands a flag  indicating that a short tune up
//  signal is  required for specified  bands before they are  used for
//  transmit or receive, unless they  are flagged as Rx Only (intended
//  to protect Rx active aerials and non-licensed bands).
//
//  Provides a Qt property that holds  the Tx percentage which is used
//  to generate a semi-randomized schedule of period to transmit. This
//  schedule is random but adjusted to limit the number of consecutive
//  transmission periods, it also adjusts  the schedule to ensure that
//  the overall number of transmission periods in any two hour hopping
//  schedule reflects the percentage provided.
//
// Collaborations
//
//  Settings including  the selected bands  with periods, the  tune up
//  flags  and the  gray line  duration are  maintained in  persistent
//  storage using the provided QSettings object instance.
//
//  A passed  in Configuration  object instance is  used to  query the
//  FrequencyList_v2_101 model  to determine working frequencies  for each
//  band. The  row index  of this  model is  returned by  this classes
//  hopping scheduling method so it may be conveniently used to select
//  a new working frequency by a client.
//
class WSPRBandHopping
  : public QObject
{
  Q_OBJECT;
  Q_PROPERTY (int tx_percent READ tx_percent WRITE set_tx_percent);

public:
  WSPRBandHopping (QSettings *, Configuration const *, QWidget * parent = nullptr);
  ~WSPRBandHopping ();

  // display the band hopping maintenance dialog
  Q_SLOT void show_dialog (bool);

  // Property tx_percent implementation
  int tx_percent () const;
  Q_SLOT void set_tx_percent (int);

  // structure that defines the results of the next_hop() method
  struct Hop
  {
    QString period_name_;
    int frequencies_index_;     // may be -1 indicating no change
    bool tune_required_;
    bool tx_next_;
  };
  // return the next band parameters
  Hop next_hop (bool tx_enabled);
  // determine if the next period should be a transmit period
  bool next_is_tx (bool simple_schedule = false);

private:
  // implementation hidden from public interface
  class impl;
  pimpl<impl> m_;
};

#endif
