#include "widget.h"
#include "ui_widget.h"
#include <QSqlQuery>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    port = 8000;
    sendport = 8001;
    socket = new QUdpSocket();
    socket->bind(port,QUdpSocket::ShareAddress
                 | QUdpSocket::ReuseAddressHint);
    connect(socket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
    ui->tableWidget->setColumnCount(2);
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    ui->tableWidget->verticalHeader()->setHidden(true);
    QStringList header;
    header << tr("username") <<tr("ipAddress");
    ui->tableWidget->setHorizontalHeaderLabels(header);
    ui->tableWidget->setSortingEnabled(true);
}
Widget::~Widget()
{
    qDebug()<<"finish";
    delete ui;
}
void Widget::processPendingDatagrams()
{
    while(socket->hasPendingDatagrams())
        {
            QByteArray datagram;
            datagram.resize(socket->pendingDatagramSize());
            socket->readDatagram(datagram.data(),datagram.size());
            QDataStream in(&datagram,QIODevice::ReadOnly);
            int messageType;
            in >> messageType;
            switch(messageType)
            {
                case Message:
                {
                    QString send_user,rec_ip,send_msg;
                    in >> send_user >>rec_ip >>send_msg;
                    qDebug()<<send_user <<rec_ip<<send_msg;
                    sendMessage(Message,rec_ip,tr("%1/%2").arg(send_user).arg(send_msg));
                    break;
                }
                case NewParticipant:
                {
                    QString username,address;
                    in >>username >>address;
                    update_online_user(username,address);
                    break;
                }
                case ParticipantLeft:
                {
                    QString username;
                    in >> username;
                    del_online_user(username);
                    break;
                }
                case Load:
                {
                    QString username,pwd,ipAddress;
                    in >> username >> pwd >> ipAddress;
//                    qDebug()<<username<<pwd<<ipAddress;
                    QSqlQuery query;
                    query.prepare("select * from user where username="+tr("'%1'").arg(username));
//                    qDebug()<<"select * from user where username="+tr("%1").arg(username);
                    query.exec();
                    if(query.next())
                    {
                        if(pwd==query.value(1).toString())//用户名密码正确
                        {
                            //验证用户是否已经登录
                            if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
                                sendMessage(Load,ipAddress,tr("succ"));
                            else
                                sendMessage(Load,ipAddress,tr("online"));
                        }
                        else//密码错误
                        {
                            sendMessage(Load,ipAddress,tr("pwdErro"));
                        }
                    }
                    else//用户名不存在
                    {
                        sendMessage(Load,ipAddress,tr("userErro"));
                    }
                    break;
                }
            case Reg_User:
            {
                QString username,pwd,address;
                in >>username >>pwd >> address;
//                qDebug()<<username<<pwd<<address;
                QSqlQuery query;
                query.prepare("select * from user where username="+tr("'%1'").arg(username));
                query.exec();
                if(query.next())
                {
                    sendMessage(Reg_User,address,tr("false"));
                    return;
                }
                 query.prepare("insert into user values("+tr("'%1','%2')").arg(username).arg(pwd));
//                 qDebug()<<"insert into user values("+tr("'%1','%2')").arg(username).arg(pwd);
                 if(query.exec())
                    sendMessage(Reg_User,address,tr("succ"));
                 else
                    sendMessage(Reg_User,address,tr("overtime"));
                 break;
            }
            case Send_File:
            {
                QString username,rec_ip,filename,lisport;
                in >>username >>rec_ip >>filename >>lisport;
                sendMessage(Send_File,rec_ip,tr("%1/%2/%3").arg(username).arg(filename).arg(lisport));
                break;
            }
            case Refuse:
            {
                QString send_name,ipaddress;
                in >>send_name>>ipaddress;
                sendMessage(Refuse,ipaddress,send_name);
                break;
            }
            default:
            {
                break;
            }
            }
        }
}
void Widget::sendMessage(MessageType type, QString ipAddress, QString state)
{
    qDebug()<<type<<ipAddress<<state;
    qDebug()<<state;
    QByteArray data;
    QDataStream out(&data,QIODevice::WriteOnly);
    out << type;
    switch(type)
    {
        case Message:
        {
            out << state.split("/").at(0);
            out << state.right(state.length()-state.indexOf("/")-1);
            break;
        }
        case NewParticipant:
        {
            out << state.split("/").at(0) << state.split("/").at(1);
            break;
        }
        case ParticipantLeft:
        {
            out << state;
            break;
        }
        case Load:
        {
            out << state;            
            break;
        }
        case Reg_User:
        {
            out << state;
            break;
        }
        case Send_File:
        {
            out <<state.split("/").at(0)<<state.split("/").at(1)<< state.split("/").at(2);
            break;
        }
        case Refuse:
        {
            out <<state;
            break;
        }
        default:
        {
            break;
        }
    }
    socket->writeDatagram(data.data(),data.length(),QHostAddress(ipAddress),sendport);
}
 void Widget::update_online_user(QString username, QString ipaddress)
{
   if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
   {
       int row = ui->tableWidget->rowCount();
       ui->tableWidget->insertRow(row);
       ui->tableWidget->setItem(row,0,(new QTableWidgetItem(username)));
       ui->tableWidget->setItem(row,1,(new QTableWidgetItem(ipaddress)));
       sendMessage(NewParticipant,tr("192.168.0.255"),tr("%1/%2").arg(username).arg(ipaddress));
   }
}
void Widget::del_online_user(QString username)
{
    qDebug()<<"delete "<<username;
    if(!ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
    {
        int row = ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();
        ui->tableWidget->removeRow(row);
        sendMessage(ParticipantLeft,tr("192.168.0.255"),username);
    }
}