//+------------------------------------------------------------------+
//|                                       QualityReportPrinter.mqh   |
//|                Experts tab reporting for trade quality metrics   |
//+------------------------------------------------------------------+
#ifndef QUALITYREPORTPRINTER_MQH
#define QUALITYREPORTPRINTER_MQH

#include "TradeQualityTypes.mqh"

//+--------------------------------------------------------------------+
//| CQualityReportPrinter                                              |
//| Prints the same figures shown on the dashboard to the Experts tab, |
//| prefixed with a caller-supplied label so that two runs (for        |
//| example, "All Trades" and "London Session Only") stay              |
//| distinguishable in the log.                                        |
//+--------------------------------------------------------------------+
class CQualityReportPrinter
  {
public:
                     CQualityReportPrinter(void);
                    ~CQualityReportPrinter(void);

   void              Print(const string label,const CQualityMetrics &metrics) const;
  };

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CQualityReportPrinter::CQualityReportPrinter(void)
  {
  }

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CQualityReportPrinter::~CQualityReportPrinter(void)
  {
  }

//+------------------------------------------------------------------+
//| Print                                                            |
//| Writes one labeled block of metrics to the Experts tab.          |
//+------------------------------------------------------------------+
void CQualityReportPrinter::Print(const string label,const CQualityMetrics &metrics) const
  {
   ::PrintFormat("--- Trade Quality Report: %s ---",label);
   ::PrintFormat("%s Trades: %d (Win:%d Loss:%d Breakeven:%d)",
                 label,metrics.m_trade_count,metrics.m_win_count,metrics.m_loss_count,metrics.m_breakeven_count);
   ::PrintFormat("%s Win rate: %.1f%% (95%% Wilson CI: %.1f%% - %.1f%%)",
                 label,metrics.m_win_rate*100.0,metrics.m_wilson_lower*100.0,metrics.m_wilson_upper*100.0);

   if(metrics.m_avg_win_currency_defined)
      ::PrintFormat("%s Average win: %.2f",label,metrics.m_avg_win_currency);
   else
      ::PrintFormat("%s Average win: n/a",label);

   if(metrics.m_avg_loss_currency_defined)
      ::PrintFormat("%s Average loss: %.2f",label,metrics.m_avg_loss_currency);
   else
      ::PrintFormat("%s Average loss: n/a",label);

   ::PrintFormat("%s Expectancy: %.2f (currency), %.1f pips",label,metrics.m_expectancy_currency,metrics.m_expectancy_pips);

   if(metrics.m_expectancy_r_multiple_defined)
      ::PrintFormat("%s Expectancy per dollar risked: %.3fR",label,metrics.m_expectancy_r_multiple);
   else
      ::PrintFormat("%s Expectancy per dollar risked: n/a",label);

   if(metrics.m_quality_score_defined)
      ::PrintFormat("%s Trade Quality Score: %.3f (%s)",label,metrics.m_quality_score,metrics.m_quality_rating);
   else
      ::PrintFormat("%s Trade Quality Score: n/a (%s)",label,metrics.m_quality_rating);

   ::PrintFormat("%s Sample size: %s",label,metrics.m_sample_adequacy);
  }

#endif // QUALITYREPORTPRINTER_MQH
//+------------------------------------------------------------------+