/****************************************************************************
 ** Copyright (C) 2001-2006 Klarälvdalens Datakonsult AB.  All rights reserved.
 **
 ** This file is part of the KD Gantt library.
 **
 ** This file may be distributed and/or modified under the terms of the
 ** GNU General Public License version 2 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.GPL included in the
 ** packaging of this file.
 **
 ** Licensees holding valid commercial KD Gantt licenses may use this file in
 ** accordance with the KD Gantt Commercial License Agreement provided with
 ** the Software.
 **
 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 **
 ** See http://www.kdab.net/kdgantt for
 **   information about KD Gantt Commercial License Agreements.
 **
 ** Contact info@kdab.net if any conditions of this
 ** licensing are not clear to you.
 **
 **********************************************************************/
#ifndef KDGANTTDATETIMEGRID_P_H
#define KDGANTTDATETIMEGRID_P_H

#include "kdganttdatetimegrid.h"
#include "kdganttabstractgrid_p.h"

#include <QDateTime>
#include <QBrush>

namespace KDGantt
{
class DateTimeScaleFormatter::Private
{
public:
    Private(DateTimeScaleFormatter::Range _range,
            const QString &_format,
            const QString &_templ,
            Qt::Alignment _alignment)
        : range(_range),
          format(_format),
          templ(_templ),
          alignment(_alignment)
    {
    }

    const DateTimeScaleFormatter::Range range;
    const QString format;
    const QString templ;
    const Qt::Alignment alignment;
};

class DateTimeGrid::Private : public AbstractGrid::Private
{
public:
    Private()
        : startDateTime(QDateTime::currentDateTime().addDays(-3)),
          dayWidth(100.),
          scale(ScaleAuto),
          weekStart(Qt::Monday),
          freeDays(QSet<Qt::DayOfWeek>() << Qt::Saturday << Qt::Sunday),
          rowSeparators(false),
          noInformationBrush(Qt::red, Qt::DiagCrossPattern),
          upper(new DateTimeScaleFormatter(DateTimeScaleFormatter::Week, QStringLiteral("w"))),
          lower(new DateTimeScaleFormatter(DateTimeScaleFormatter::Day, QStringLiteral("ddd"))),
          year_upper(DateTimeScaleFormatter::Year, QStringLiteral("yyyy")),
          year_lower(DateTimeScaleFormatter::Month, QStringLiteral("MMM")),
          month_upper(DateTimeScaleFormatter::Month, QStringLiteral("MMMM")),
          month_lower(DateTimeScaleFormatter::Week, QStringLiteral("w")),
          week_upper(DateTimeScaleFormatter::Week, QStringLiteral("w")),
          week_lower(DateTimeScaleFormatter::Day, QStringLiteral("ddd")),
          day_upper(DateTimeScaleFormatter::Day, QStringLiteral("dddd")),
          day_lower(DateTimeScaleFormatter::Hour, QStringLiteral("hh")),
          hour_upper(DateTimeScaleFormatter::Hour, QStringLiteral("hh")),
          hour_lower(DateTimeScaleFormatter::Minute, QStringLiteral("m")),
          minute_upper(DateTimeScaleFormatter::Minute, QStringLiteral("m")),
          minute_lower(DateTimeScaleFormatter::Second, QStringLiteral("s"))
    {
    }
    ~Private()
    {
        delete lower;
        delete upper;
    }

    qreal dateTimeToChartX(const QDateTime &dt) const;
    QDateTime chartXtoDateTime(qreal x) const;

    int tabHeight(const QString &txt, QWidget *widget = Q_NULLPTR) const;
    void getAutomaticFormatters(DateTimeScaleFormatter **lower, DateTimeScaleFormatter **upper);

    void paintVerticalDayLines(QPainter *painter,
                               const QRectF &sceneRect,
                               const QRectF &exposedRect,
                               QWidget *widget);
    void paintVerticalHourLines(QPainter *painter,
                                const QRectF &sceneRect,
                                const QRectF &exposedRect,
                                QWidget *widget);
    void paintVerticalUserDefinedLines(QPainter *painter,
                                       const QRectF &sceneRect,
                                       const QRectF &exposedRect,
                                       const DateTimeScaleFormatter *formatter,
                                       QWidget *widget);

    QDateTime startDateTime;
    QDateTime endDateTime;
    qreal dayWidth;
    Scale scale;
    Qt::DayOfWeek weekStart;
    QSet<Qt::DayOfWeek> freeDays;
    bool rowSeparators;
    QBrush noInformationBrush;

    DateTimeScaleFormatter *upper;
    DateTimeScaleFormatter *lower;

    DateTimeScaleFormatter year_upper;
    DateTimeScaleFormatter year_lower;
    DateTimeScaleFormatter month_upper;
    DateTimeScaleFormatter month_lower;
    DateTimeScaleFormatter week_upper;
    DateTimeScaleFormatter week_lower;
    DateTimeScaleFormatter day_upper;
    DateTimeScaleFormatter day_lower;
    DateTimeScaleFormatter hour_upper;
    DateTimeScaleFormatter hour_lower;
    DateTimeScaleFormatter minute_upper;
    DateTimeScaleFormatter minute_lower;
};

inline DateTimeGrid::DateTimeGrid(DateTimeGrid::Private *d) : AbstractGrid(d) {}

inline DateTimeGrid::Private *DateTimeGrid::d_func()
{
    return static_cast<Private *>(AbstractGrid::d_func());
}
inline const DateTimeGrid::Private *DateTimeGrid::d_func() const
{
    return static_cast<const Private *>(AbstractGrid::d_func());
}
}

#endif /* KDGANTTDATETIMEGRID_P_H */

