summaryrefslogtreecommitdiff
path: root/src/model/Sport.h
blob: c5d1c66085084001a8d9922eeb5f6db64eae4649 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#pragma once

#include "MedalWinner.h"
#include "CompetitorWithResults.h"
#include <QAbstractListModel>
#include <QNetworkAccessManager>
#include <qcontainerfwd.h>
#include <set>

#include <QJsonObject>
#include <QJsonDocument>
#include <QString>
#include <QList>
#include "EventInfo.h"

using namespace std;

class SportModel : public QAbstractListModel
{
  Q_OBJECT

  Q_PROPERTY(QString discipline READ discipline WRITE setDiscipline NOTIFY disciplineChanged);

public:
  enum Role
  {
    EventName = Qt::UserRole + 1,
    Competitors
  };

  explicit SportModel(QObject *parent = nullptr);

  virtual int rowCount(const QModelIndex &parent) const override;
  virtual QVariant data(const QModelIndex &index, int role) const override;
  virtual QHash<int, QByteArray> roleNames() const override;

  QString discipline() const;
  void setDiscipline(const QString &discipline);
public slots:
  void request(QString discipline);
  void parseData();

  signals:
    void disciplineChanged();

  private:
    QList<EventInfo*> m_sportList;
    QString m_discipline;
    QNetworkAccessManager m_networkManager;
    QNetworkReply *m_reply = nullptr;
};

class Sport
{

public:
  Sport(QJsonObject discipline)
  {
    this->discipline = discipline;
  }

  set<QString> getCategories();
  QList<CompetitorWithResults> getCompetitorsByCategory(QString category);
  QList<MedalWinner> getCompetitorsWithMedal();

  // filter to change the current competitor array
  void lastName(QList<Competitor> &competitors);
  void filterByName(QList<Competitor> &competitors, QString name);
  void filterByCountry(QList<Competitor> &competitors, QString nocShort);

  // sort functions to change the order of the current competitor array
  void sortByName(QList<Competitor> &competitors);
  void sortByCountry(QList<Competitor> &competitors);
  void sortByResult(QList<CompetitorWithResults> &competitors);
  void sortByMedals(QList<MedalWinner> &competitors);
  void reverseOrder(QList<Competitor> &competitors);

  // statistic function(s)
  void addRelativeToFirst(QList<CompetitorWithResults> &competitors);

  void setDiscipline(QJsonObject discipline)
  {
    this->discipline = QJsonObject(discipline);
  }

private:
  /*
   * Analysis of provided competitor objects:
   *
   * Attributes:
   * - code
   * - noc (national olympics comittee)
   * - name (sometimes the country name? mostly the competitors name)
   * - order
   * [- results] (only if the results are out!)
   *
   *
   * Analysis of provided result objects:
   *
   * Attributes:
   * - position
   * - mark
   * - medalType
   * - irk
   * [- winnerLoserTie] (only if provided in the discipline?)
   *
   * Analysis of where to find the medal winners:
   *
   * Search for ... in category name.
   * - "Bronze"
   * - "Gold"
   * - "Final"
   *
   * ! ATTENTION !
   * When searching for "Final" there might be "Final A", "Final B", etc.
   * The results will only be in ONE of these categories!
   * -> which is good... cause then we can count occurences.
   */
  QJsonObject discipline;

  void filterCompetitors(QList<Competitor> &competitors, QString filter);

  bool validateDiscipline();
  QJsonObject createCompetitorWithMedals(QJsonObject medalComp);

  float calcRelativeStat(QString ref, QString val);
};