#include "IRCConn.h"
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QSslSocket>
#include <QString>

void IRCConn::SSLConnect(QString host, quint16 port, QString nick, QString username, QString realname) {
  QString tmp;
  sslsocket = new QSslSocket(this);
  sslsocket->connectToHostEncrypted(host, port);
  sslsocket->ignoreSslErrors();
  if(sslsocket->waitForEncrypted()) {
    connected = true;
    QTextStream stream(sslsocket);
    stream << "NICK " << nick.toAscii() << endl;
    stream << "USER " << username.toAscii() << " 8 * :" << realname.toAscii() << endl;
    sslsocket->flush();
    stream >> tmp;
    if(tmp.contains("PING")) {
      tmp.replace(1, 1, "O");
      stream << tmp << endl;
      sslsocket->flush();
    }
  }
}

void IRCConn::Connect(QString host, quint16 port, QString nick, QString username, QString realname) {
  socket = new QTcpSocket(this);
  socket->connectToHost(host, port);
  if(socket->waitForConnected()) {
    connected = true;
    QTextStream stream(socket);
    stream << "NICK " << nick.toAscii() << endl;
    stream << "USER " << username.toAscii() << " 8 * :" << realname.toAscii() << endl;
    socket->flush();
  }
}

void IRCConn::Send(QString msg) {
  if(socket != NULL) {
    QTextStream stream(socket);
    stream << msg.toAscii() << endl;
    socket->flush();
  }
  if(sslsocket != NULL) {
    QTextStream stream(sslsocket);
    stream << msg.toAscii() << endl;
    sslsocket->flush();
  }
}

QString IRCConn::ReceiveLine() {
  QString msg;
  if(socket != NULL) {
    QTextStream stream(socket);
    stream >> msg;
  }
  if(sslsocket != NULL) {
    QTextStream stream(sslsocket);
    stream >> msg;
  }
  if(msg.contains("PING")) {
    msg.replace(1, 1, "O");
    if(socket != NULL) {
      QTextStream stream(socket);
      stream << msg.toAscii() << endl;
      socket->flush();
    }
    if(sslsocket != NULL) {
      QTextStream stream(sslsocket);
      stream << msg.toAscii() << endl;
      sslsocket->flush();
    }
    return ReceiveLine();
  } else {
    return msg;
  }
}

void IRCConn::Disconnect() {
  connected = false;
  if(socket != NULL) {
    socket->close();
    socket = NULL;
  }
  if(sslsocket != NULL) {
    sslsocket->close();
    sslsocket = NULL;
  }
}

bool IRCConn::Connected() {
  return connected;
}
