#ifndef QCUSTOMCALENDARWIDGET_H
#define QCUSTOMCALENDARWIDGET_H

#include <QCalendarWidget>
#include <QPushButton>
#include <QLabel>
#include <QProxyStyle>

class ScopeSelectionModel;

class NoFocusStyle : public QProxyStyle
{
    Q_OBJECT
public:
    explicit NoFocusStyle(QObject *parent):QProxyStyle() { setParent(parent); }

private:
    void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                       QPainter *painter, const QWidget *widget) const;
};
/**
 * @brief The CalendarWidgetEx class
 */
class CalendarWidgetEx : public QCalendarWidget
{
    Q_OBJECT
public:
    enum SelectMode
    {
        Normal,
        Multi,
        Scope,
    };
public:
    explicit CalendarWidgetEx(QWidget *parent = nullptr);
    ~CalendarWidgetEx() override {}
    void SetSelectMode(SelectMode mode, ScopeSelectionModel *pDataModel = nullptr);
    QList<QDate> GetSelectDays(){return m_listMultiSelectDays;}

    void hideNavigatioinButton(bool bPreYear, bool bPreMon, bool bNextYear, bool bNextMon);
private:
    QDate dateForCell(int row, int column) const;
    QDate referenceDate() const;
    int columnForFirstOfMonth(const QDate &date) const;
    int columnForDayOfWeek(int day) const;
    void initSkinColor();
protected:
    void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const override;
    void paintEvent(QPaintEvent *) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void leaveEvent(QEvent *) override;
public:
    QSize minimumSizeHint() const override;
private slots:
    void OnClicked(const QDate &date);
private:
    /* 亮色 */
    const QColor NORMAL_TEXT_BRIGHT{QColor(58,63,99)};
    const QColor TODAY_TEXT_BRIGHT{QColor(68,88,254)};
    const QColor SELECT_TEXT_BRIGHT{Qt::white};
    const QColor DISABLE_TEXT_BRIGHT{QColor(133, 142, 189)};
    const QColor SPLIT_LINE_BRIGHT{QColor(0, 0, 0, 23)};
    const QColor SELECT_BRIGHT{QColor(68, 88, 254)};
    const QColor HOVER_BRIGHT{QColor(227, 238, 255)};
    /* 暗色 */
    const QColor NORMAL_TEXT_DEEP{QColor(255,255,255,230)};
    const QColor TODAY_TEXT_DEEP{Qt::white};
    const QColor SELECT_TEXT_DEEP{Qt::white};
    const QColor DISABLE_TEXT_DEEP{QColor(255,255,255,77)};
    const QColor SPLIT_LINE_DEEP{QColor(255,255,255,64)};
    const QColor SELECT_DEEP{QColor(233, 161, 18)};
    const QColor HOVER_DEEP{QColor(132, 134, 136)};
    
    const QColor TODAY_DEEP{QColor(67, 142, 255)};
    const QColor BG_PEN_DEEP{QColor(255,255,255,51)};
    const QColor BG_BRUSH_DEEP{QColor{116,117,120}};
    const QColor BG_SPECIAL_PEN_DEEP{QColor{27, 186, 102}};
    const QColor BG_SPECIAL_BRUSH_DEEP{QColor{78, 112, 97}};



    const int DEFAULT_FONT_SIZE = 14;
    const int TEXT_WIDTH = 24;
    const qreal WINDOW_RADIUS = 2.0;
    const int WINDOW_WIDTH = 325;
    const int WINDOW_HEIGHT = 350;

    QDate m_dateMouseOver;
    QList<QDate> m_listMultiSelectDays;
    SelectMode m_modeSelection;
    ScopeSelectionModel *m_pDateScopeModel;
    int m_nLineHeight;      //星期和日之间的分割线的Y坐标
    bool m_hasTopSplitLine; // 是否绘制顶部分割线
    QColor m_normalTextColor;
    QColor m_todayTextColor;
    QColor m_selectTextColor;
    QColor m_disableTextColor;
    QColor m_splitLineColor;
    QColor m_selectBlockColor;
    QColor m_hoverBlockColor;
};
#endif // QCUSTOMCALENDARWIDGET_H