#include "mywidget.h"
#include "ui_mywidget.h"

#include <QMessageBox>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) {
    ui->setupUi(this);
    connTimeoutTimer->setSingleShot(true);

    connect(ui->conectBtn, &QPushButton::clicked, this, &MyWidget::connectBtnHit);
    connect(ui->hostLineEdit, &QLineEdit::returnPressed, ui->conectBtn, &QPushButton::click);

    connect(ui->sendBtn, &QPushButton::clicked, this, &MyWidget::sendBtnHit);
    connect(ui->msgLineEdit, &QLineEdit::returnPressed, ui->sendBtn, &QPushButton::click);
}

MyWidget::~MyWidget() {
    /* TODO: upewnić się, że gniazda sieciowe są prawidłowo zamknięte */
    delete ui;
}

void MyWidget::connectBtnHit() {
    ui->connectGroup->setEnabled(false);
    ui->msgsTextEdit->append("<b>Connecting to " + ui->hostLineEdit->text() + ":" + QString::number(ui->portSpinBox->value()) + "</b>");

    /* TODO:
     *  - stworzyć gniazdo
     *  - połączyć zdarzenia z funkcjami je obsługującymi:
     *     • zdarzenie połączenia     (do funkcji socketConnected)
     *     • zdarzenie odbioru danych (stworzyć własną funkcję)
     *     • zdarzenie rozłączenia    (stworzyć własną funkcję)
     *     • zdarzenie błędu          (stworzyć własną funkcję)
     *  - zażądać (asynchronicznego) nawiązania połączenia
     */

    connect(connTimeoutTimer, &QTimer::timeout, this, &MyWidget::connTimedOut);
    connTimeoutTimer->start(3000);
}

void MyWidget::connTimedOut() {
    /* TODO: przerwać próbę łączenia się do gniazda */
    connTimeoutTimer->disconnect();
    ui->connectGroup->setEnabled(true);
    ui->msgsTextEdit->append("<b>Connect timed out</b>");
    QMessageBox::critical(this, "Error", "Connect timed out");
}

void MyWidget::socketConnected() {
    connTimeoutTimer->stop();
    connTimeoutTimer->disconnect();
    ui->msgsTextEdit->append("<b>Connected</b>");
    ui->talkGroup->setEnabled(true);
}

void MyWidget::sendBtnHit() {
    QString txt = ui->msgLineEdit->text().trimmed();
    QByteArray txtAsUtf8 = (txt + '\n').toUtf8();

    /* TODO: wysłać dane w sieć */

    ui->msgsTextEdit->append("<span style=\"color: blue\">" + txt + "</span>");
    ui->msgsTextEdit->setAlignment(Qt::AlignRight);

    ui->msgLineEdit->clear();
    ui->msgLineEdit->setFocus();
}

/*
 * TODO: odczytane z sieci dane można wstawić na pole tekstowe np. za pomocą:
 *
 * QByteArray ba = …
 * ui->msgsTextEdit->append(QString::fromUtf8(ba).trimmed());
 * ui->msgsTextEdit->setAlignment(Qt::AlignLeft);
 */
