#include "proxyserver.h"
#include <QTextStream>
#include <QTcpSocket>

ProxyServer::ProxyServer(int localPort, int remotePort, const QString &remoteHost, const QString &serverName)
{
    listen(QHostAddress::LocalHost, localPort);
    p_remotePort = remotePort;
    p_remoteHost = remoteHost;
    p_serverName = serverName;
}

void ProxyServer::incomingConnection(qintptr socketDescriptor)
{
    QTcpSocket *motherSocket = new QTcpSocket(this);
    motherSocket->setSocketDescriptor(socketDescriptor);
    motherSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
    motherSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);

    QTextStream(stderr) << p_serverName << ": " << motherSocket->peerAddress().toString() << " incoming connected!" << Qt::endl;

    QTcpSocket *childSocket = new QTcpSocket(this);
    childSocket->connectToHost(p_remoteHost, p_remotePort);
    childSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
    childSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
    QTextStream(stderr) << p_serverName << ": " << p_remoteHost << " outgoing connecting..." << Qt::endl;

    QObject::connect(motherSocket, &QTcpSocket::readyRead, this, [=](){
        childSocket->write(motherSocket->readAll());
    });
    QObject::connect(motherSocket, &QTcpSocket::disconnected, this, [=](){
        QTextStream(stderr) << p_serverName << ": " << motherSocket->peerAddress().toString() << " incoming disconnected!" << Qt::endl;
        childSocket->disconnectFromHost();
        motherSocket->deleteLater();
    });
    QObject::connect(childSocket, &QTcpSocket::connected, this, [=](){
        QTextStream(stderr) << p_serverName << ": " << childSocket->peerAddress().toString() << " outgoing connected!" << Qt::endl;
    });
    QObject::connect(childSocket, &QTcpSocket::readyRead, this, [=](){
        motherSocket->write(childSocket->readAll());
    });
    QObject::connect(childSocket, &QTcpSocket::disconnected, this, [=](){
        QTextStream(stderr) << p_serverName << ": " << childSocket->peerAddress().toString() << " outgoing disconnected!" << Qt::endl;
        motherSocket->disconnectFromHost();
        childSocket->deleteLater();
    });
}