#include "OscRouter.h"
#include <boost/function.hpp>
#include <iostream>
#include <QtCore/QObject>
#include <QtCore/QString>
#include <QtCore/QLatin1String>

#include "SimpleListener.h"

#include <QtGui/QApplication>
#include <QtGui/QTextEdit>
#include <QtGui/QHBoxLayout>
#include <QtCore/QMutex>
#include <QtCore/QMutexLocker>
#include <QtCore>

SimpleListener::SimpleListener(QWidget* parent) : QWidget(parent)
{
    _oscm = new OscMethod(this);
    _oscm->accept(QLatin1String("T"));
    _oscm->accept(QLatin1String("Tifs"));
    _hbl = new QHBoxLayout(this);
    _text = new QTextEdit(this);
    _text->setAcceptRichText(false);
    _text->setReadOnly(true);
    _hbl->addWidget(_text);
    setLayout(_hbl);
    connect(_oscm, SIGNAL(messageReceived(const OscMessage*)),
            this, SLOT(oscMessage(const OscMessage*)));
}


void SimpleListener::oscMessage(const OscMessage* m)
{
    qDebug("oscMessage() called");

    QString s("Received a message:\n");
    if(m->message() == 0 || m->senderAddress() == 0) {
        qDebug("NULL pointer to data in message");
        return;
    }
    s.append(m->message()->AddressPattern());
    s.append(" ");
    s.append(m->message()->TypeTags());
    s.append("\n");

    qDebug("Starting argument loop");
    if(m->message()->ArgumentCount() > 0) {
        s.append(QString::number(m->message()->ArgumentCount()));
        s.append(" arguments: ");
        osc::ReceivedMessageArgumentIterator it(m->message()->ArgumentsBegin());
        int i = m->message()->ArgumentCount();
        qDebug("%d arguments", i);
        for(; i > 0; i--) {
            char c = it->TypeTag();
            switch(c) {
                case osc::TRUE_TYPE_TAG:
                    s.append("True");
                    break;
                case osc::STRING_TYPE_TAG:
                    s.append(it->AsStringUnchecked());
                    break;
                case osc::INT32_TYPE_TAG:
                    s.append(QString::number(it->AsInt32Unchecked()));
                    break;
                default:
                    qDebug("Unknown type tag");
            }
            s.append(" ");
        }
    } else {
        qDebug("no arguments");
        s.append("No arguments");
    }
    
    
    _text->append(s);
    //qDebug(s.toLocal8Bit().constData());

    delete m;
    qDebug("exiting oscMessage()");
}



int main(int argc, char** argv)
{
    QApplication app(argc, argv);


    qRegisterMetaType<OscMessage>("OscMessage");
    qRegisterMetaType<OscMessage*>("OscMessage*");
    
    OscRouter r;
    QObject::connect(&app, SIGNAL(aboutToQuit()), &r, SLOT(quit()));
    SimpleListener* s = new SimpleListener();


    r.addMethod(QLatin1String("/test1"), s->oscMethod());
    s->show();

    r.start();
    app.exec();
}