#ifndef COMBINEDGRAPH_H
#define COMBINEDGRAPH_H

#include <QList>
#include <QString>
#include "graphtab.h"

class CombinedGraphItem;
class SliderInfoItem;

class CombinedGraph : public GraphTab
{
    Q_OBJECT

public:
    CombinedGraph(QWidget *parent = 0);
    ~CombinedGraph();

    QString label() const {return tr("All");}
    QList<GraphItem*> loadData(const Data &data, Map *map);
    void clear();
    void setUnits(enum Units units);
    void setGraphType(GraphType type);
    void showTracks(bool show);
    void showRoutes(bool show);

protected:
    void updateSliderInfo();

private:
    enum DataType {
        Elevation = 0,
        Speed,
        HeartRate,
        Temperature,
        Cadence,
        Power,
        GearRatio,
        DataTypeCount
    };

    struct GraphInfo {
        QString label;
        QString units;
        QColor color;
        qreal unitScale;
        qreal unitOffset;
    };

    struct NiceRange {
        qreal min;
        qreal max;
    };

    GraphInfo graphInfo(DataType type) const;
    static void graphMinMax(const Graph &graph, qreal &yMin, qreal &yMax);
    static qreal niceNum(qreal x, bool ceil);
    static NiceRange niceRange(qreal min, qreal max);
    static Graph remapGraph(const Graph &graph, qreal srcMin, qreal srcMax,
                            qreal dstMin, qreal dstMax);

    CombinedGraphItem *addItem(const Graph &graph, DataType type,
                               bool isRoute, const NiceRange &axisRange, const GraphInfo &axisInfo);

    void rebuildItems();
    void setInfo();

    struct RawGraph {
        Graph graph;
        DataType type;
        bool isRoute;
        int trackIndex;
        int loadGroup;
    };

    DataType _axisType;
    Units _units;
    bool _showTracks;
    bool _showRoutes;
    int _loadGroup;

    QList<RawGraph> _rawGraphs;
    QList<CombinedGraphItem *> _tracks;
    QList<CombinedGraphItem *> _routes;
};

#endif // COMBINEDGRAPH_H
