#ifndef GETSTOCKLIST_H
#define GETSTOCKLIST_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkCookie>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QStandardItemModel>
#include <QMenu>
#include <QLineSeries>   // 折线类
#include <QSplineSeries> // 曲线类
#include <QTimer>
#include <QCompleter> // 用于模糊匹配
#include "customitem.h"
#include "customsortproxymodel.h"

QT_CHARTS_USE_NAMESPACE  // 命名空间得使用起来,要不然类会拿不到


/*
 * 关于SSL的处理,由于要请求 https的链接,需要将编译器目录下的两个dll动态库拷贝到对应编译器的bin目录下
 * 将libeay32.dll 和 ssleay32.dll 两个文件复制到对应的区域
 * 例如从编译器的opt\bin原始目录:...\Qt5.9.4\Tools\mingw530_32\opt\bin 找个这2个dll
 * 拷贝到编译器的bin目录下: ...\Qt5.9.4\Tools\mingw530_32\bin
 */
namespace Ui {
class GetStockList;
}

class GetStockList : public QMainWindow
{
    Q_OBJECT

public:
    explicit GetStockList(QWidget *parent = 0);
    ~GetStockList();
    void getStockAllCode(QByteArray &buffer); // 获取所有沪深股票的信息
    void getStockOne(QByteArray &buffer); // 获取单只股票的处理
    void getIndustryInfo(QByteArray &buffer); // 获取行业信息
    void getStockByIndustry(QByteArray &buffer,QString industryCode); // 通过行业获取股票

signals:
    void sendChartData(QLineSeries*);  // 折线
    void sendChartData(QSplineSeries*);  // 曲线
    void sendInfoMess(QString); // 发送消息提示
    void sendClosePrice(QString,QString); // 发送最新的价格:名字、价格
    void sendCodeNames(QMap<QString, QString> &); // 给历史分析界面发送名字代号信息

private slots:
    void on_pushButton_get_clicked();
    void showAplyData(QNetworkReply *reply);  // 用来响应请求的回传数据的槽函数

    void on_pushButton_get_2_clicked();  // 获取沪深股市数据的按钮槽函数
    void showMenu();
    void policySlot();
    void priceSlot();
    void maPolicySlot(); // MA策略槽
    void maTest100Slot(); // MA策略回测前100名槽
    void multiResonateTest100Slot(); // 多策略共振回测前100名槽
    void macdPolicySlot(); // MACD策略槽
    void buttomToUpPolicySlot(); // 底部翻转策略--主要用于月线处理
    void multiResonatePolicySlot(); // 多策略共振
    void oneUpCrossFourSlot(); // 一阳穿四线,千军万马来相见
    void oneUpCrossFourTest100Slot(); // 一阳穿四线,千军万马来相见 回测

    void getCodeSlot(); // 获取股票代号的定时器的槽
    void pollMultiSlot(); // 轮询多策略共振定时器

    void on_pushButton_industry_clicked();

    void getLastClosePrice(QString name); // 通过名字获取股票价格槽

    void on_pushButton_filterCap_clicked();

    void on_pushButton_search_clicked();

    void on_lineEdit_search_returnPressed();

private:
    Ui::GetStockList *ui;
    // 这2个用于爬取数据的
    QNetworkRequest m_request; // 用于管理请求头的
    QString m_cookie; // 缓存
    QNetworkAccessManager m_manager; // 用于管理http请求及响应的

    // 下面这几个用于显式爬到的股票数据
    QStandardItemModel *m_model; // 标准项模型,用来存储数据的,将模型和视图进行了分离
    CustomSortProxyModel *m_customModel; // 用于排序的自定义模型

    QMenu *m_menu; // 菜单指针,用来处理右击菜单的
    int m_numsCnt; // 单个股票的数据行数
    int m_menuIndex; // 针对单个股票需要判断是哪个操作,用来记录下标的

    QTimer *m_getCodeTimer; // 获取股票代号的定时器
    QMap<QString,QString> m_codeNames; // 股票代号和名字

    QMap<QString,QString> m_industryInfo; // 行业代码和行业名字
    QMap<QString,QVector<QString>> m_codeAndIndustry; // 股票代号及对应的行业代码
    QString m_curIndustry; // 当前行业
    QString m_dateType; // 日期类型:day week month year
    int m_maTestNum; // ma策略回测数量

    QTimer *m_pollMultiTimer; // 轮询多策略定时器

    QCompleter *m_completer; // 支持模糊匹配


};

#endif // GETSTOCKLIST_H