#include <QListWidget>
#include <QBrush>
#include <QKeyEvent>
#include <QAbstractScrollArea>
#include <QMessageBox>
#include <QLabel>
#include "messangerwidget.h"
#include "ui_messangerwidget.h"


MessangerWidget::MessangerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MessangerWidget),
    currLogin("")
{
    ui->setupUi(this);

    ui->tabWidget->removeTab(1);
    ui->tabWidget->removeTab(0);

    ui->btnSend->setObjectName("btnSend");
}

MessangerWidget::~MessangerWidget()
{
    delete ui;
}

void MessangerWidget::addMsgFromClient(Trainee trainee, QString text)
{
    //Пробуем добавить вкладку диалога с клиентом (если вдруг еще нет)
    addTabDialogMessenger(trainee);

    //Ищем нужный диалог
    QString login = trainee.getLogin();
    foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
    {//Есть такой
        if(tabDialog->getLogin() == login)
        {
            //Добавляем в существующую вкладку
            ui->tabWidget->setCurrentIndex(getIndexTab(login));
            tabDialog->addMsgWidgetRemote(text);
            //Делаем ее текущей
            ui->tabWidget->setCurrentIndex(getIndexTab(login));

            currLogin = login;
            return;
        }
    }
}

void MessangerWidget::addTabDialogMessenger(Trainee trainee)
{
    if(listTabDialogMessenger.count() == 0)
    {//Самая первая вкладка, делаем ее активной
        currLogin = trainee.getLogin();
        emit signal_tabMessengerChanged(currLogin);
    }

    //Проверяем наличие диалога с этим клиентом
    foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger)
    {
        if(dialogMsg->getLogin() == trainee.getLogin())
        {//Диалог для этого клиента уже существует
            //Обновляем статус залогинивания
            if(trainee.getLoggedIn())
                ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGreen.png"));
            else
                ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGray.png"));
            return;
        }
    }    

    //Диалога для этого клиента еще не существует

    //Помещаем новый диалог в список диалогов
    TabDialogMessenger* tabDialog = new TabDialogMessenger(0 /*TODO доделать передачу реального ID*/, trainee.getLogin(), this);
    listTabDialogMessenger.append(tabDialog);

    //Добавляем новую вкладку диалога
    int index = ui->tabWidget->addTab(tabDialog, /*login + ": " +*/ trainee.getName());

    //Обновляем статус залогинивания
    if(trainee.getLoggedIn())
        ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGreen.png"));
    else
        ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGray.png"));
}

void MessangerWidget::actualizationTabsDialogMessenger()
{
    foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
    {
        QString login = tabDialog->getLogin();
        bool exist = false;

        for(Trainee trainee : listTrainees)
        {
            if(trainee.getLogin() == login)
            {
                if(trainee.getArchived())
                {//Стал архивным
                    //Удаляем диалог с клиентом
                    ui->tabWidget->removeTab(getIndexTab(login));
                    listTabDialogMessenger.removeOne(tabDialog);
                }
                else
                    exist = true;

                break;
            }
        }
        if(!exist)
        {//Нет такого логина
            //Удаляем диалог с клиентом
            ui->tabWidget->removeTab(getIndexTab(login));
            listTabDialogMessenger.removeOne(tabDialog);
        }
    }
}

int MessangerWidget::getIndexTab(QString login)
{
    for(int index = 0; index < ui->tabWidget->count(); index++)
    {
        TabDialogMessenger* tabDialogMessenger = static_cast<TabDialogMessenger*>(ui->tabWidget->widget(index));
        if(tabDialogMessenger->getLogin() == login)
            return index;
    }
    return -1;
}

void MessangerWidget::clear()
{
    listTrainees.clear();
    actualizationTabsDialogMessenger();
}

void MessangerWidget::on_btnSend_clicked()
{
    QString text = ui->editMsg->toPlainText();

    emit signal_msgToClientReady(currLogin, text);

    ui->editMsg->clear();

    //Ищем нужный диалог
    foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
    {
        if(tabDialog->getLogin() == currLogin)
        {
            //Добавляем в существующую вкладку
            tabDialog->addMsgWidgetLocal(text);
            //Делаем ее активной
            ui->tabWidget->setCurrentIndex(getIndexTab(currLogin));

            return;
        }
    }
}

void MessangerWidget::on_tabWidget_currentChanged(int index)
{
    //Ищем нужный диалог
    foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
    {
        if(getIndexTab(tabDialog->getLogin()) == index)
        {
            currLogin = tabDialog->getLogin();
            emit signal_tabMessengerChanged(currLogin);
            return;
        }
    }
}

void MessangerWidget::slot_traineeSelected(QString login)
{
    //Ищем нужный диалог
    foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
    {
        if(tabDialog->getLogin() == login)
        {
            //Активируем нужную вкладку
            ui->tabWidget->setCurrentIndex(getIndexTab(login));
            return;
        }
    }
}

void MessangerWidget::slot_LanguageChanged(QString language)
{
    qtLanguageTranslator.load(QString("translationsMy/ServerLMS_") + language, ".");
    qApp->installTranslator(&qtLanguageTranslator);
}

void MessangerWidget::slot_InitMessanger(QList<Trainee> listTrainees)
{
    this->listTrainees = listTrainees;

    actualizationTabsDialogMessenger();

    for(Trainee trainee: listTrainees)
    {
        if(! trainee.getArchived())
            addTabDialogMessenger(trainee);
    }
}

void MessangerWidget::slot_msgFromClientReady(QString login, QString text)
{
    for(Trainee trainee: listTrainees)
    {
        if(trainee.getLogin() == login)
            addMsgFromClient(trainee, text);
    }
}

void MessangerWidget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
    {
        ui->btnSend->click();
    }
}

void MessangerWidget::changeEvent(QEvent *event)
{
    // В случае получения события изменения языка приложения
    if (event->type() == QEvent::LanguageChange)
    {
        ui->retranslateUi(this);    // переведём окно заново
    }
}
