/*  ROSA Media Player
    Copyright (C) 2006-2010 Ricardo Villalba <rvm@escomposlinux.org>
    Julia Mineeva, Evgeniy Augin. Copyright (c) 2011 ROSA  <support@rosalab.ru>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include "myserver.h"
#include "version.h"
#include <QHostAddress>
#include <QRegExp>

Connection::Connection(QTcpSocket * s)
{
    socket = s;

    //connect(s, SIGNAL(disconnected()), this, SLOT(deleteLater()));
    connect(s, SIGNAL(readyRead()), this, SLOT(readData()));

    //sendText(QString("ROSA Media Player %1").arg(smplayerVersion()));
    sendText(QString("ROSA Media Player"));
    sendText("Type help for a list of commands");
}

Connection::~Connection()
{
    delete socket;
}

void Connection::sendText(QString l)
{
    qDebug("Connection::sendText: '%s'", l.toUtf8().data());

    socket->write( l.toUtf8() + "\r\n" );
    socket->flush();
}

void Connection::readData()
{
    while (socket->canReadLine())
    {
        QString l = QString::fromUtf8( socket->readLine() );
        l.remove( QRegExp("[\r\n]") );
        parseLine( l );
    }
}

void Connection::parseLine(QString str)
{
    qDebug("Connection::parseLine: '%s'", str.toUtf8().data());

    QRegExp rx_open("^open (.*)");
    QRegExp rx_open_files("(^open_files|^add_files) (.*)");
    QRegExp rx_function("^(function|f) (.*)");
    QRegExp rx_loadsub("^load_sub (.*)");


    if (str.toLower() == "hello")
    {
        //sendText(QString("Hello, this is SMPlayer %1").arg(smplayerVersion()));
        sendText(QString("Hello, this is ROSA Media Player"));
    }
    else if (str.toLower() == "help")
    {
        sendText("Available commands:");
        sendText(" help");
        sendText(" quit");
        sendText(" list functions");
        sendText(" function [function_name]");
        sendText(" f [function_name]");
        sendText(" open [file]");
    }
    else if (str.toLower() == "quit")
    {
        sendText("Goodbye");
        socket->disconnectFromHost();
    }
    else if (str.toLower() == "list functions")
    {
        for (int n=0; n < actions_list.count(); n++)
        {
            sendText( actions_list[n] );
        }
    }
    else if (rx_open.indexIn(str) > -1)
    {
        QString file = rx_open.cap(1);
        qDebug("Connection::parseLine: asked to open '%s'", file.toUtf8().data());
        sendText("OK, file sent to GUI");
        emit receivedOpen(file);
    }
    else if (rx_loadsub.indexIn(str) > -1)
    {
        QString file = rx_loadsub.cap(1);
        qDebug("Connection::parseLine: asked to load subtitle '%s'", file.toUtf8().data());
        sendText("OK, subtitle file sent to GUI");
        emit receivedLoadSubtitle(file);
    }
    else if ( (str.toLower() == "open_files_start") ||
              (str.toLower() == "add_files_start") )
    {
        files_to_open.clear();
        sendText("OK, send first file");
    }
    else if ( (str.toLower() == "open_files_end") ||
              (str.toLower() == "add_files_end") )
    {
        qDebug("Connection::parseLine: files_to_open:");
        for (int n=0; n < files_to_open.count(); n++)
            qDebug("Connection::parseLine: %d: '%s'", n, files_to_open[n].toUtf8().data());
        sendText("OK, sending files to GUI");

        if (str.toLower() == "open_files_end")
            emit receivedOpenFiles(files_to_open);
        else
            emit receivedAddFiles(files_to_open);
    }
    else if (rx_open_files.indexIn(str) > -1)
    {
        QString file = rx_open_files.cap(2);
        qDebug("Connection::parseLine: file: '%s'", file.toUtf8().data());
        files_to_open.append(file);
        sendText("OK, file received");
    }
    else if (rx_function.indexIn(str) > -1)
    {
        QString function = rx_function.cap(2).toLower();
        qDebug("Connection::parseLine: asked to process function '%s'", function.toUtf8().data());
        sendText("OK, function sent to GUI");
        emit receivedFunction(function);
    }
    else
    {
        sendText("Unknown command");
    }
}


MyServer::MyServer( QObject * parent ) : QTcpServer(parent)
{
    connect(this, SIGNAL(newConnection()), this, SLOT(newConnection_slot()));
}

bool MyServer::listen( quint16 port )
{
    return QTcpServer::listen(QHostAddress::LocalHost, port);
}

void MyServer::newConnection_slot()
{
    Connection * c = new Connection( nextPendingConnection() );
    c->setActionsList( actionsList() );

    connect(c, SIGNAL(receivedOpen(QString)),
            this, SIGNAL(receivedOpen(QString)));
    connect(c, SIGNAL(receivedOpenFiles(QStringList)),
            this, SIGNAL(receivedOpenFiles(QStringList)));
    connect(c, SIGNAL(receivedAddFiles(QStringList)),
            this, SIGNAL(receivedAddFiles(QStringList)));
    connect(c, SIGNAL(receivedFunction(QString)),
            this, SIGNAL(receivedFunction(QString)));
    connect(c, SIGNAL(receivedLoadSubtitle(QString)),
            this, SIGNAL(receivedLoadSubtitle(QString)));
}

#include "moc_myserver.cpp"
