#include "cmainwindow.h"
#include "ui_cmainwindow.h"
#include "mainwindowpagecontrol.h"
#include "currentuserdata.h"
#include <QDebug>
#include <QTimer>
#include <windows.h>
#include <QHBoxLayout>
#include <QProcess>
#include "gamecontrol.h"
#include "fescontroldialog.h"
CMainWindow::CMainWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CMainWindow),
    m_gameDisplayPage(NULL),
    gamedialog(NULL),
    grabWindowTimer(NULL)
{
    ui->setupUi(this);

    ui->title_Widget->hide();
    ui->stackedWidget->setGeometry(0,0,1920,1080);



    this->setWindowFlags(Qt::FramelessWindowHint);      //设置无边框
    qRegisterMetaType<E_PAGENAME>("E_PAGENAME");
    connect(MainWindowPageControl::getInstance(),SIGNAL(signalSwitchPage(E_PAGENAME)),this,SLOT(slotSwitchPage(E_PAGENAME)));
    connect(CurrentUserData::getInstace(),SIGNAL(signalUserChanged()),this,SLOT(slotCurrentUserChanged()));
    //默认为主界面
    //    setAttribute(Qt::WA_DeleteOnClose,false);
    ui->stackedWidget->setCurrentIndex(0);
    m_gameDisplayPage = new GameDisplayPage();

    connect(m_gameDisplayPage,SIGNAL(signalGameStateChanged(int8_t)),this,SLOT(slotGameStateChanged(int8_t)));

    m_Process = new QProcess();

    connect(ui->title_Widget,SIGNAL(signalCloseWindow()),this,SLOT(closeWindow()));

    gamedialog = new QDialog;
    m_loginWidget = new LoginWidget();
    gamedialog->stackUnder(m_gameDisplayPage);
    grabWindowTimer = new QTimer();
    connect(grabWindowTimer,SIGNAL(timeout()),this,SLOT(slotGrabWindow()));

    connect(ui->FES_Page,SIGNAL(signalStartGame()),ui->FESCar_Page,SLOT(slotStartGame()));
    //从参数界面传递到训练界面
    connect(ui->trainParam_Page,&TrainingParamSetting::signalTrainParamChanged,ui->FESCar_Page,&ArmOrLeg::slotRecvTrainParamChanged);
    //训练页面发消息,让tittle页面保存截图
    connect(ui->FESCar_Page,&ArmOrLeg::saveUpPictureSignal,ui->title_Widget,&TitleWidget::slotSaveUpPicture);
    //从训练界面传递到参数界面
    connect(ui->FESCar_Page,&ArmOrLeg::signalBicycleParamChanged,ui->trainParam_Page,&TrainingParamSetting::slotBicycleParamChanged);
    //训练界面打开,跟新游戏配置默认参数
    connect(ui->Main_Page,&TrainManager::signalOpenTrainManagerPage,ui->trainParam_Page,&TrainingParamSetting::slotResetParam);

   // connect(m_loginWidget,SIGNAL(signalCloseApp),this,SLOT(closeWindow()));
}

CMainWindow::~CMainWindow()
{
    if(gamedialog)
        delete gamedialog;
    if(m_gameDisplayPage)
        delete m_gameDisplayPage;
    if(grabWindowTimer)
        delete grabWindowTimer;
    delete ui;
}

void CMainWindow::switchPage(E_PAGENAME E_Page)
{
    switch(E_Page)
    {
    case MainPage_E:
        gamedialog->close();
        ui->stackedWidget->setGeometry(0,0,1920,1080);
        ui->stackedWidget->setCurrentWidget(ui->Main_Page);
        ui->title_Widget->hide();
        qDebug() <<"来到了主页";
        emit ui->Main_Page->signalOpenTrainManagerPage();

        break;
    case TrainingPage_E://游戏训练界面
//        ui->stackedWidget->setCurrentWidget(ui->game_Page);
        startGame_Btn_clicked();
//        QTimer::singleShot(1000,this,SLOT(slot_Timerout()));//同上,就是参数不同
        break;
    case UserPage_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        ui->stackedWidget->setCurrentWidget(ui->userMsg_Page);
        ui->title_Widget->show();
        break;
    case SettingPage_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        ui->stackedWidget->setCurrentWidget(ui->setting_Page);
        ui->title_Widget->show();
        break;
    case BicycleParamSet_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        //qDebug() <<"普通单车";
        ui->FESCar_Page->setTrainType(0);
        ui->title_Widget->setTrainType(0);
        ui->trainParam_Page->setTrainType(0);
        ui->stackedWidget->setCurrentWidget(ui->FESCar_Page);
        ui->title_Widget->show();
        break;
    case FesBicycleParamSet_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        //qDebug() <<"FES单车";
        ui->FESCar_Page->setTrainType(1);
        ui->title_Widget->setTrainType(1);
        ui->trainParam_Page->setTrainType(1);
        ui->stackedWidget->setCurrentWidget(ui->FESCar_Page);
        ui->title_Widget->show();
        break;
    case FesParamSet_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        ui->title_Widget->setTrainType(0);
        ui->FES_Page->switchPage(ONLY_FES_E);
        ui->stackedWidget->setCurrentWidget(ui->FES_Page);
        ui->title_Widget->show();
        break;
    case BicycleToFes_E:
        ui->stackedWidget->setGeometry(0,100,1920,980);
        ui->FES_Page->switchPage(BICYCLE_FES_E);
        ui->stackedWidget->setCurrentWidget(ui->FES_Page);
        ui->title_Widget->show();
        break;
    case TrainingParamSetting_E: //训练参数设置页
        ui->stackedWidget->setGeometry(0,100,1920,980);
          ui->stackedWidget->setCurrentWidget(ui->trainParam_Page);
          ui->title_Widget->show();
        break;
    case BrainTraining: //训练参数设置页
        ui->stackedWidget->setGeometry(0,100,1920,980);
          ui->stackedWidget->setCurrentWidget(ui->Brain_Page);
          ui->title_Widget->show();
        break;
    case visionTrain: //训练参数设置页
        ui->stackedWidget->setGeometry(0,100,1920,980);
          ui->stackedWidget->setCurrentWidget(ui->Vision_Page);
          ui->title_Widget->show();
        break;


    default:
        break;
    }
}

void CMainWindow::slotSwitchPage(E_PAGENAME page)
{
    switchPage(page);
    ui->title_Widget->setTitleByPage(page);
}


void CMainWindow::slotCurrentUserChanged()
{
    ui->title_Widget->setUser(CurrentUserData::getInstace()->getCurrentPatientMsg());
}

void CMainWindow::startGame_Btn_clicked()
{
    connect(m_Process,&QProcess::errorOccurred,[=](QProcess::ProcessError error){qDebug()<<error;});
//    connect(m_Process,QOverload<int,QProcess::ExitStatus>::of(&QProcess::finished),[this]
//            (int exitCode,QProcess::ExitStatus exitStatus){
//        m_exitCode = exitCode;
//        m_exitStatus = exitStatus;
//        qDebug()<<"m_exitCode"<<m_exitCode<<"m_exitStatus"<<m_exitStatus;
//    });

    QString destPath = GameControl::getInstance()->getCurrentGameMsg().gamePath + GameControl::getInstance()->getCurrentGameMsg().gameName;

    startGame(destPath);

    grabWindowTimer->start(300);

}

void CMainWindow::slotGrabWindow()
{
    WId hwnd = 0;
    if(1 == GameControl::getInstance()->getCurrentGameMsg().gameID)
        hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ001_SingleplayerBicycleRace");
    else if(2 == GameControl::getInstance()->getCurrentGameMsg().gameID)
        hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ002_MultiplayerBicycleRace_LBY");
    else if(3 == GameControl::getInstance()->getCurrentGameMsg().gameID)
        hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ003_MultiplayerRaceSciFi");
    else if(4 == GameControl::getInstance()->getCurrentGameMsg().gameID)
        hwnd = (WId)FindWindow(L"UnityWndClass",L"TJ_SXZ004_CatchFish");


    if(IsHungAppWindow(HWND(hwnd)))
    {
        qDebug()<<"正在运行";
    }

    if(hwnd > 0)
    {
        grabWindowTimer->stop();
        m_window = QWindow::fromWinId(hwnd);
        container = createWindowContainer(m_window,this);

        gamedialog->setWindowFlags(Qt::FramelessWindowHint);

        QGridLayout *hLayout = new QGridLayout(this);
        hLayout->setMargin(0);
        hLayout->addWidget(container);

        if(gamedialog->layout() != NULL)
            delete gamedialog->layout();
        gamedialog->setLayout(hLayout);
        gamedialog->show();

        gamedialog->resize(1920,980);
        gamedialog->move(0,100);

//        m_gameDisplayPage->show();
    }


}

void CMainWindow::slotGameStateChanged(int8_t state)
{
    switch(state)
    {
    case 0: //停止游戏
    {
        m_gameDisplayPage->close();
        gamedialog->close();
        slotSwitchPage(MainPage_E);
    }
        break;
    case 1: //开始游戏
        m_gameDisplayPage->show();
        break;
    }
}

void CMainWindow::closeWindow()
{
    //关闭所有设备
    qDebug()<<"运行了";
    FesControlDialog::getInstance()->turnoffDevice(1,1);
    this->close();

}

void CMainWindow::startGame(QString path)
{
    //1.开启游戏进程
    if(path.isEmpty())
        return;
    QString hardDisk = path.mid(0,2);
    hardDisk.append("\n\r");

    QString gameName = path.mid(path.lastIndexOf('/')+1);
    gameName.prepend("start ");
    gameName.append("\n\r");
    QString gamePath = path.mid(0,path.lastIndexOf('/'));
    gamePath.prepend("cd ");
    gamePath.append("\n\r");
    m_Process->start("cmd.exe");
    //切换盘符
    m_Process->write(hardDisk.toLatin1());
    //进入文件夹
    m_Process->write(gamePath.toLatin1());
    //开启进程
    m_Process->write(gameName.toLatin1());
    m_Process->write("exit\n\r");
    m_Process->waitForFinished();
    m_Process->close();
    //2.关闭设备复位中的界面
}

void CMainWindow::slot_Timerout()
{
//    m_gameDisplayPage->show();
}

void CMainWindow::showEvent(QShowEvent *event)
{
    Q_UNUSED(event)
    signalShowCompleted();
}

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