#include "TrainReportTwoThree.h"
#include "ui_TrainReportTwoThree.h"
#include "cdatabaseinterface.h"
#include <QDebug>
#include <QPdfWriter>
#include <QPainter>
#include <QPrinter>
#include <QFileDialog>
#include <QMessageBox>
#include "gamecontrol.h"
#include "currentuserdata.h"

TrainReportTwoThree::TrainReportTwoThree(QDialog *parent) :
    QDialog(parent),
    ui(new Ui::TrainReportTwoThree)

{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);      //设置无边框
    setAttribute(Qt::WA_TranslucentBackground,true);//设置透明

    m_chart1 = new QChart();
    m_chart2 = new QChart();
    m_chart3 = new QChart();
}

TrainReportTwoThree::~TrainReportTwoThree()
{

    if(m_chart1)
        delete m_chart1;
    if(m_chart2)
        delete m_chart2;
    if(m_chart3)
        delete m_chart3;
    delete ui;
}

void TrainReportTwoThree::setReportData(const ST_TrainReport& st_TrainReportTwoThree,int type)
{
    ui->save_Btn->setVisible(type);
    ui->noSave_Btn->setVisible(type);
    ui->import_Btn->setVisible(true);
    ui->label->setText(tr("上下肢主被动康复训练仪报告"));

    ui->label_8->resize(150,40); //训练部位Label
    ui->label_8->move(500,140);

    ui->label_11->move(410,140); //年龄Label
    ui->age_Label->move(480,140);

    ui->label_2->move(570,80); //训练日期Label
    ui->label_2->resize(120,40);

    m_st_TrainReportTwoThree = st_TrainReportTwoThree;
    ui->name_Label->setText(st_TrainReportTwoThree.name);
    QString sex = st_TrainReportTwoThree.sex == 1 ? tr("女") :tr("男");
    ui->sex_Label->setText(sex);
    ui->phone_Label->setText(st_TrainReportTwoThree.phone);
    if(1<= st_TrainReportTwoThree.age && st_TrainReportTwoThree.age <= 90)
        ui->age_Label->setText(QString::number(st_TrainReportTwoThree.age) );

    ui->trainMode_Label->setText(getTrainMode(st_TrainReportTwoThree.trainMode));

    QString bodyStr;
    switch(st_TrainReportTwoThree.bodyIndex)
    {
    case 0:
        bodyStr = tr("水平上肢");
        break;
    case 1:
        bodyStr = tr("下肢");
        break;
    case 2:
        bodyStr = tr("上下肢");
        break;
    case 3:
        bodyStr = tr("垂直上肢");
        break;
    }

    qDebug() <<"最终模式"<< st_TrainReportTwoThree.bodyIndex;

    ui->trainPart_Label->setText(bodyStr);
    //图标的训练部位
    ui->trainPartIcon_Label->setText(bodyStr);

   // ("yyyy-MM-dd hh:mm:ss")截取年月日输出;
    ui->reportDate_Label->setText(st_TrainReportTwoThree.startTimeStr.mid(0,10));

    ui->msg_Label->setText(st_TrainReportTwoThree.markMsg);

    //实际训练总时间、主被动时间
    // qDebug() <<"Time"<< st_TrainReportTwoThree.trainTime;
    int trainTimeMin = st_TrainReportTwoThree.trainTime/60;
    int trainTimeSec = st_TrainReportTwoThree.trainTime%60;
    /*
    int leftBalanceActiveTime = st_TrainReportTwoThree.activeTime/60;
    int rightBalancePassiveTime = st_TrainReportTwoThree.passiveTime/60;
    //主被动模式:多出30秒主被动选择加1min

    if(st_TrainReportTwoThree.trainMode == 7 || st_TrainReportTwoThree.trainMode == 10 )
    {
        if(st_TrainReportTwoThree.trainTime % 60 >= 30)
        {
            leftBalanceActiveTime++;
        }
        else if(st_TrainReportTwoThree.passiveTime % 60 >= 30)
            rightBalancePassiveTime++;
        else if(trainTimeMin==0) //这种是小于1min且在
        {
            trainTimeMin = 1;
            rightBalancePassiveTime++;
        }
        //用户不玩,产生空的数据空的图像
        if(st_TrainReportTwoThree.activeTime ==0 && st_TrainReportTwoThree.passiveTime==0)
        {

        }
    }

     //非主被动同时训练总时间小于1min,设置1min
     if(trainTimeMin == 0 && !(st_TrainReportTwoThree.trainMode == 7 || st_TrainReportTwoThree.trainMode == 10))
    {
        trainTimeMin = 1;
        switch(st_TrainReportTwoThree.trainMode)
        {
            case 0:
                leftBalanceActiveTime = 0;
                rightBalancePassiveTime = 1;
            break;

            case 1:
                leftBalanceActiveTime = 1;
                rightBalancePassiveTime = 0;
                break;
            case 2:
                leftBalanceActiveTime = 0;
                rightBalancePassiveTime = 1;
                break;
            case 3:
                leftBalanceActiveTime = 0;
                rightBalancePassiveTime = 1;
            break;
            default :
                leftBalanceActiveTime = 0;
                rightBalancePassiveTime = 1;
            break;
        }
    }
    */
     //训练时间和主被动时间
       ui->trainTime_Label->setText(QString::number(trainTimeMin)+":"+QString::number(trainTimeSec) );
    //ui->leftBalance_Label->setText(QString::number(leftBalanceActiveTime));
   // ui->rightBalance_Label->setText(QString::number(rightBalancePassiveTime));


    //int leftBalance = st_TrainReportTwoThree.leftBalance;
    //if(leftBalance > 100 || leftBalance < 0)
    //    leftBalance = 50;

   // int rightBalance = st_TrainReportTwoThree.rightBalance;
    //if(rightBalance > 100 || rightBalance < 0)
    //    rightBalance = 50;


   // int trainTimeSec = st_TrainReportTwoThree.trainTime%60;
  //  ui->trainTime_Label->setText(QString::number(trainTimeMin) + "min " + QString::number(trainTimeSec)+"s");
    //训练总距离、左右距离
    ui->trainLength_Label->setText(QString::number(st_TrainReportTwoThree.upLimpLength + st_TrainReportTwoThree.downLimpLength,'f',0));
   // ui->upLimpLength_Label->setText(QString::number(st_TrainReportTwoThree.upLimpLength,'f',0) );
    // ui->downLimpLength_Label->setText(QString::number(st_TrainReportTwoThree.downLimpLength,'f',0));



     //痉挛
    ui->spasmTimes_Label->setText(QString::number(st_TrainReportTwoThree.spasmTimes)/*+"次"*/);
    //档位
    //ui->avgResistance_Label->setText(QString::number(st_TrainReportTwoThree.averangeResistance) );
   // ui->maxResistance_Label->setText(QString::number(st_TrainReportTwoThree.maxResistance) );
  //  ui->minResistance_Label->setText(QString::number(st_TrainReportTwoThree.minResistance) );

    drawPieChart(st_TrainReportTwoThree);

    ui->maxSpeed_Label->setText(QString::number(st_TrainReportTwoThree.maxSpeed));
    ui->averageSpeed_Label->setText(QString::number(st_TrainReportTwoThree.averageSpeed));
    this->exec();

}

void TrainReportTwoThree::drawPieChart(const ST_TrainReport& st_TrainReportTwoThree)
{

    //绘制第1个饼状图
    m_chart1->removeAllSeries();
    ui->graphicsView_1->setChart(m_chart1);
    QPieSeries *series1 = new QPieSeries(m_chart1);//创建QPieSeries

    if(st_TrainReportTwoThree.bodyIndex == 1)
    {
        series1->append(tr("左平衡"),st_TrainReportTwoThree.leftBalance); //添加个部分
        series1->append(tr("右平衡"),st_TrainReportTwoThree.rightBalance);
    }
    else
    {
        series1->append(tr("左平衡"),st_TrainReportTwoThree.rightBalance); //添加个部分
        series1->append(tr("右平衡"),st_TrainReportTwoThree.leftBalance);

    }

    //设置缩放因子
    series1->setPieSize(1);

    //添加每个饼状部分
    QPieSlice *slice1_1 = series1->slices().at(0); //第一个扇形
    QPieSlice *slice1_2 = series1->slices().at(1);

    slice1_1->setColor(QColor(85, 173, 249));
    slice1_2->setColor(QColor(180, 226, 254));

    //图注可见
    slice1_1->setLabelVisible(true);
    slice1_2->setLabelVisible(true);


    //饼状每个部分标签位置
    slice1_1->setLabelPosition(QPieSlice::LabelInsideNormal);
    slice1_2->setLabelPosition(QPieSlice::LabelInsideNormal);


    //图注位置
    m_chart1->addSeries(series1);
    m_chart1->legend()->setAlignment(Qt::AlignBottom);
    m_chart1->legend()->hide();


    //每个饼快占得比例(0-1)
    qreal slice_1_Percentage = slice1_1->percentage();
    qreal slice_2_Percentage=  slice1_2->percentage();

    slice1_1->setLabel(QString::number(qRound(slice_1_Percentage*100))+"%");
    slice1_2->setLabel(QString::number(qRound(slice_2_Percentage*100))+"%");
    //四舍五入取整
   // ui->slice1_1Percentage_Label->setText(QString::number(qRound(slice_1_Percentage*100))+"%");
   // ui->slice1_2Percentage_Label->setText(QString::number(qRound(slice_2_Percentage*100))+"%");

   // ui->slice1_1Percentage_Label->hide();
   // ui->slice1_2Percentage_Label->hide();

    //slice1_1->setLabel(slice1_1->label()+":"+QString::number(qRound(slice_1_Percentage*100))+"%");
    //slice1_2->setLabel(slice1_2->label()+":"+QString::number(qRound(slice_2_Percentage*100))+"%");



    //绘制第2个饼状图
    m_chart2->removeAllSeries();
    ui->graphicsView_2->setChart(m_chart2);
    QPieSeries *series2 = new QPieSeries(m_chart2);//创建QPieSeries

    int activeTime,passiveTime;
    //主动模式和单主动只有主动时间和距离
    if(st_TrainReportTwoThree.trainMode == 1 || st_TrainReportTwoThree.trainMode == 9)
    {
        activeTime = 1;
        passiveTime = 0;
    }
    else if(st_TrainReportTwoThree.trainMode == 0  || st_TrainReportTwoThree.trainMode == 3 || st_TrainReportTwoThree.trainMode == 4 )
    {
        activeTime = 0;
        passiveTime = 1;
    } else { //主被动切换
        if(st_TrainReportTwoThree.activeTime == 0 && st_TrainReportTwoThree.passiveTime ==0)
        {//如果用户不玩,防止空数据空表
            activeTime = 1;
            passiveTime = 1;
        }
        else
        {
            activeTime = st_TrainReportTwoThree.activeTime;
            passiveTime = st_TrainReportTwoThree.passiveTime;
        }

    }
    series2->append(tr("主动时间"),activeTime);
    series2->append(tr("被动时间"),passiveTime); //添加个部分



    //设置缩放因子
    series2->setPieSize(1);

    //添加每个饼状部分
    QPieSlice *slice2_1 = series2->slices().at(0); //第一个扇形
    QPieSlice *slice2_2 = series2->slices().at(1);

    slice2_1->setColor(QColor(146, 175, 246));
    slice2_2->setColor(QColor(147, 139, 246));


    //图注可见
    slice2_1->setLabelVisible(true);
    slice2_2->setLabelVisible(true);

    //饼状每个部分标签位置
    slice2_1->setLabelPosition(QPieSlice::LabelInsideNormal);
    slice2_2->setLabelPosition(QPieSlice::LabelInsideNormal);

    //图注位置
    m_chart2->addSeries(series2);
    m_chart2->legend()->setAlignment(Qt::AlignBottom);
    m_chart2->legend()->hide();

    //每个饼块占得比例(0-1)
    qreal slice2_1_Percentage = slice2_1->percentage();
    qreal slice2_2_Percentage=  slice2_2->percentage();

    slice2_1->setLabel(QString::number(qRound(slice2_1_Percentage*100))+"%");
    slice2_2->setLabel(QString::number(qRound(slice2_2_Percentage*100))+"%");

    //四舍五入取整
  ///  ui->slice2_1Percentage_Label->setText(QString::number(qRound(slice2_1_Percentage*100))+"%");
  //  ui->slice2_2Percentage_Label->setText(QString::number(qRound(slice2_2_Percentage*100))+"%");

 //  ui->slice2_1Percentage_Label->hide();
  //  ui->slice2_2Percentage_Label->hide();

    /****绘制第3个饼状图****/
    m_chart3->removeAllSeries();
    ui->graphicsView_3->setChart(m_chart3);
    QPieSeries *series3 = new QPieSeries(m_chart3);//创建QPieSeries

    int activeLength,passiveLength;
    if(st_TrainReportTwoThree.trainMode == 1 || st_TrainReportTwoThree.trainMode == 9)
    {
        activeLength = 1;
        passiveLength = 0;
    }
    else if(st_TrainReportTwoThree.trainMode == 0  || st_TrainReportTwoThree.trainMode == 3 || st_TrainReportTwoThree.trainMode == 4 )
    {
        activeLength = 0;
        passiveLength = 1;
    } else { //主被动切换,
        if(st_TrainReportTwoThree.upLimpLength  == 0 &&  st_TrainReportTwoThree.downLimpLength == 0 /*st_trainReport.upLimpLength == 0 && st_trainReport.downLimpLength ==0*/)
        {//如果用户不玩,防止空数据空表
            activeLength = 0;
            passiveLength = 1;
            qDebug()<<"Yes";
        }
        else
        {
            activeLength = st_TrainReportTwoThree.activeTime * 1.4;
            passiveLength = st_TrainReportTwoThree.passiveTime ;
        }
    }

    series3->append(tr("主动距离"),activeLength);
    series3->append(tr("被动距离"),passiveLength); //添加个部分

    //设置缩放因子
    series3->setPieSize(1);

    //添加每个饼状部分
    QPieSlice *slice3_1 = series3->slices().at(0); //第一个扇形
    QPieSlice *slice3_2 = series3->slices().at(1);


    slice3_1->setColor(QColor(170, 194, 4));//被动颜色
    slice3_2->setColor(QColor(210, 224, 126));//主动颜色

    //图注可见
    slice3_1->setLabelVisible(true);
    slice3_2->setLabelVisible(true);

    //饼状每个部分标签位置
    slice3_1->setLabelPosition(QPieSlice::LabelInsideNormal);
    slice3_2->setLabelPosition(QPieSlice::LabelInsideNormal);

    //图注位置
    m_chart3->addSeries(series3);
    m_chart3->legend()->setAlignment(Qt::AlignBottom);
    m_chart3->legend()->hide();

    //每个饼快占得比例(0-1)
    qreal slice3_1_Percentage = slice3_1->percentage();
    qreal slice3_2_Percentage=  slice3_2->percentage();

    slice3_1->setLabel(QString::number(qRound(slice3_1_Percentage*100))+"%");
    slice3_2->setLabel(QString::number(qRound(slice3_2_Percentage*100))+"%");

    //四舍五入取整
   // ui->slice3_1Percentage_Label->setText(QString::number(qRound(slice3_1_Percentage*100))+"%");
   // ui->slice3_2Percentage_Label->setText(QString::number(qRound(slice3_2_Percentage*100))+"%");
  //  ui->slice3_1Percentage_Label->hide();
  //  ui->slice3_2Percentage_Label->hide();
}


QString TrainReportTwoThree::getTrainMode(int8_t mode)
{

    QString modeName;
    switch(mode)
    {
    case 0:
        modeName = tr("被动");
        break;
    case 1:
        modeName = tr("主动");
        break;
    case 2:
        modeName = tr("助力");
        break;
    case 3:
        modeName = tr("等速");
        break;
    case 4: //四肢被动
        modeName = tr("被动");
        break;
    case 5:
        modeName = tr("上肢带下肢");
        break;
    case 6:
        modeName = tr("下肢带上肢");
        break;
    case 7:
        modeName = tr("主被动");
        break;
    case 8:
        modeName = tr("FES");
        break;
    case 10:
        modeName = tr("主被动");
        break;
    }

    return modeName;

}

ST_TrainReport TrainReportTwoThree::getReportDataByStartTime(QString startTimeStr)
{
    QString queryStr(QString("select * from TrainReportTable where startTimeStr = '%1'").arg(startTimeStr));
    if(CDatabaseInterface::getInstance()->exec(queryStr))
    {
        if(CDatabaseInterface::getInstance()->getValuesSize() > 0)
        {
            m_st_TrainReportTwoThree = variantMapToTrainReport(CDatabaseInterface::getInstance()->getValues(0,1).at(0));
        }
        else
            qDebug()<<"TrainReportTwoThree::getReportDataByStartTime:未查到符合要求数据";
    }
    else
        qDebug()<<"TrainReportTwoThree::getReportDataByStartTime"<<CDatabaseInterface::getInstance()->getLastError();

    return m_st_TrainReportTwoThree;
}

bool TrainReportTwoThree::deleteReportByStartTime(QString startTimeStr)
{
    QString table("TrainReportTable");
    return CDatabaseInterface::getInstance()->deleteRowTable(table,"startTimeStr",startTimeStr);
}


void TrainReportTwoThree::pixmapImportPDF(const QPixmap &pixmap, QString fileName)
{
    QString filePath;

    filePath = QFileDialog::getSaveFileName(NULL,"保存文件",fileName,tr("*.pdf"));

    QFile pdfFile(filePath);
    if(!pdfFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(NULL,tr("导出文件"),tr("文件打开失败"));
        return;
    }
    QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);
    QPainter *pic_painter = new QPainter(pdfWriter);
    pdfWriter->setPageSize(QPagedPaintDevice::A4);
    pdfWriter->setResolution(QPrinter::ScreenResolution);

    QRect rect = pic_painter->viewport();
    int factor = rect.width()/pixmap.width();
    pic_painter->scale(factor,factor);
    pic_painter->drawPixmap(10,10,pixmap);

    delete pic_painter;
    delete pdfWriter;

    pdfFile.close();

    QMessageBox::information(NULL,tr("提示"),tr("报告导出成功"));

    this->close();
}

void TrainReportTwoThree::on_close_Btn_clicked()
{
    this->close();
}


void TrainReportTwoThree::on_noSave_Btn_clicked()
{
    this->close();
}

void TrainReportTwoThree::on_save_Btn_clicked()
{
    QString table("TrainParamTable");
    ST_TrainParam st_trainParam = GameControl::getInstance()->getTrainParam();
    int ID = CurrentUserData::getInstace()->getCurrentPatientMsg().ID;
    QString queryStr(QString("select * from TrainParamTable  where ID = '%1' order by 'ID'").arg(ID));
    if(CDatabaseInterface::getInstance()->exec(queryStr))
    {
        if(CDatabaseInterface::getInstance()->getValuesSize()>0)
        {
            //st_trainParam = variantMapToTrainParam(CDatabaseInterface::getInstance()->getValues(0,1).at(0));
            CDatabaseInterface::getInstance()->deleteRowTable(table,"ID",QString::number(ID));
        }
    }

    if(!CDatabaseInterface::getInstance()->insertRowTable(table,TrainParamToVariantMap(st_trainParam)))
    {
        qDebug()<<"插入处方信息失败!"<<CDatabaseInterface::getInstance()->getLastError();
    }


    //将数据存储到数据库中
    QString tableName("TrainReportTable");
    if(!CDatabaseInterface::getInstance()->insertRowTable(tableName,trainReportToVariantMap(m_st_TrainReportTwoThree)))
        qDebug()<<"训练报告存储失败"<<CDatabaseInterface::getInstance()->getLastError();
    else
    {
        QMessageBox::warning(NULL,tr("保存"),tr("报告保存成功"));
        this->close();
    }

    //将训练保存到训练记录中
    ST_TrainRecord st_trainRecord;
    st_trainRecord.ID = m_st_TrainReportTwoThree.ID;
    st_trainRecord.trainTime = m_st_TrainReportTwoThree.trainTime/60;
    if(st_trainRecord.trainTime < 1)
        st_trainRecord.trainTime = 1;
    switch(m_st_TrainReportTwoThree.bodyIndex)
    {
    case 0:
        st_trainRecord.bodyPart = tr("水平上肢");
        break;
    case 1:
        st_trainRecord.bodyPart = tr("下肢");
        break;
    case 2:
        st_trainRecord.bodyPart = tr("上下肢");
        break;
    case 3:
        st_trainRecord.bodyPart = tr("垂直上肢");
        break;
    }
    st_trainRecord.score = (m_st_TrainReportTwoThree.upLimpLength + m_st_TrainReportTwoThree.downLimpLength)*3;
    st_trainRecord.startTime = QDateTime::fromString(m_st_TrainReportTwoThree.startTimeStr,"yyyy-MM-dd hh:mm:ss");
    st_trainRecord.startTimeStr = m_st_TrainReportTwoThree.startTimeStr;
    QString modeName;
    switch(m_st_TrainReportTwoThree.trainMode)
    {
    case 0:
        modeName = tr("被动");
        break;
    case 1:
        modeName = tr("主动");
        break;
    case 2:
        modeName = tr("助力");
        break;
    case 3:
        modeName = tr("等速");

        break;
    case 4: //四肢被动
        modeName = tr("被动");
        break;
    case 5:
        modeName = tr("上肢带下肢");
        break;
    case 6:
        modeName = tr("下肢带上肢");
        break;
    case 7:
        modeName = tr("主被动");
        break;
    case 8:
        modeName = tr("FES");
        break;
    case 9:
        modeName = tr("主动");
        break;
    case 10:
        modeName = tr("主被动");
        break;
    case 11:
        ;
        break;
    case 12:
        ;
        break;
    }
    st_trainRecord.trainMode = modeName;
    if(!CDatabaseInterface::getInstance()->insertRowTable("TrainRecordTable",trainRecordToVariantMap(st_trainRecord)))
    {
        qDebug()<<"TrainRecord::on_createData_Btn_clicked"<<CDatabaseInterface::getInstance()->getLastError();
    }
}

//导出报告
void TrainReportTwoThree::on_import_Btn_clicked()
{
    QDateTime dateTime = QDateTime::fromString(m_st_TrainReportTwoThree.startTimeStr,"yyyy-MM-dd hh:mm:ss");
    QString fileName;
    fileName.append(m_st_TrainReportTwoThree.name +"-"+ QString::number(m_st_TrainReportTwoThree.ID));
    fileName.append("-");
    fileName.append(dateTime.toString("yyyyMMddhhmmss"));
    ui->import_Btn->setVisible(false);
    ui->save_Btn->setVisible(false);
    ui->noSave_Btn->setVisible(false);
    pixmapImportPDF(ui->groupBox->grab(),fileName);
}

void TrainReportTwoThree::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.fillRect(rect(),QColor(0,0,0,100));
}

void TrainReportTwoThree::changeEvent(QEvent* event)
{
    switch (event->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        QWidget::changeEvent(event);
        break;
    }
}