+#include <QVariant>
+
+#include "stat-model.h"
+
+StatModel::StatModel(QList<Club *> &cList, QList<Score *> &sList) : clubList(cList), scoreList(sList)
+{
+ update();
+}
+
+int StatModel::rowCount(const QModelIndex & parent) const
+{
+ return ROWS;
+}
+
+int StatModel::columnCount(const QModelIndex & parent) const
+{
+ return COLS;
+}
+
+QVariant StatModel::data(const QModelIndex & index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ int row = index.row();
+ int col = index.column();
+
+ //
+ // ALIGNMENT
+ //
+ if (role == Qt::TextAlignmentRole ) {
+ return Qt::AlignCenter;
+ }
+
+ //
+ // NUMBERS
+ //
+ if (role == Qt::DisplayRole) {
+ switch (row) {
+ case ROW_ROUNDS:
+ return stat.at(col)->rounds();
+ case ROW_AVERAGE:
+ return stat.at(col)->average();
+ case ROW_MIN:
+ return stat.at(col)->min();
+ case ROW_MAX:
+ return stat.at(col)->max();
+ case ROW_BIRDIE:
+ case ROW_PAR:
+ case ROW_BOGEY:
+ case ROW_MORE:
+ return QVariant();
+ }
+ }
+ return QVariant();
+}
+
+QVariant StatModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ // Only vertical header -- horizontal is hidden
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ if (orientation == Qt::Horizontal) {
+ // TODO: check when no or less data than cols
+ return stat.at(section)->year();
+ }
+
+ if (orientation == Qt::Vertical) {
+ switch(section) {
+ case ROW_ROUNDS:
+ return QString("Rounds");
+ case ROW_AVERAGE:
+ return QString("Average");
+ case ROW_MIN:
+ return QString("Best");
+ case ROW_MAX:
+ return QString("Worst");
+ case ROW_BIRDIE:
+ return QString("Birdies");
+ case ROW_PAR:
+ return QString("Pars");
+ case ROW_BOGEY:
+ return QString("Bogeys");
+ case ROW_MORE:
+ return QString("More");
+ }
+ }
+
+ return QVariant();
+}
+
+void StatModel::update(void)
+{
+ QListIterator<Score *> iScore(scoreList);
+ QMultiMap<QString, Score *> yearMap;
+ QStringList yearList;
+
+ // Create multi map with years as keys, scores as values
+ // Create list of years
+ while (iScore.hasNext()) {
+ Score *score = iScore.next();
+ QString year = score->getDate().split("-").at(0);
+ yearMap.insert(year, score);
+ yearList << year;
+ }
+
+ // Create uniq list of years
+ QSet<QString> yearSet = QSet<QString>::fromList(yearList);
+
+ QSetIterator<QString> iYear(yearSet);
+
+ // For each year collect the statistics
+ while (iYear.hasNext()) {
+ QString year = iYear.next();
+
+ StatItem *item = new StatItem;
+ item->setYear(year);
+
+ QList<Score *> scoresPerYear = yearMap.values(year);
+ QListIterator<Score *> iScoresPerYear(scoresPerYear);
+
+ item->setRounds(scoresPerYear.count());
+
+ // for each year, add score
+ int sum = 0;
+ int min = 200;
+ int max = 0;
+ while (iScoresPerYear.hasNext()) {
+ Score *s = iScoresPerYear.next();
+ int tot = s->getTotal(Total).toInt();
+ sum += tot;
+
+ if (tot > max)
+ max = tot;
+
+ if (tot < min)
+ min = tot;
+ }
+ int avg = sum / scoresPerYear.count();
+
+ item->setAverage(avg);
+ item->setMin(min);
+ item->setMax(max);
+
+ stat << item;
+ }
+}