#include <kjs/interpreter.h>
#include <kjs/ustring.h>
#include <kjs/types.h>

#include "jsbinding.h"

namespace KJSEmbed {

KJS::Value convertToValue( const QVariant &val )
{
    if ( !val.isValid() )
	return KJS::Null();
    
    if ( val.type() == QVariant::String || val.type() == QVariant::CString ||
	 val.type() == QVariant::Date   || val.type() == QVariant::Time    ||
	 val.type() == QVariant::DateTime )
	return KJS::String( val.toString() );
    else if ( val.type() == QVariant::Int )
	return KJS::Number( val.toInt() );
    else if ( val.type() == QVariant::UInt )
	return KJS::Number( val.toUInt() );
    else if ( val.type() == QVariant::Double )
	return KJS::Number( val.toDouble() );
    else if ( val.type() == QVariant::Bool )
	return KJS::Boolean( val.toBool() );
    else {
	QString vs( val.toString() );
	if ( !vs.isNull() )
	    return KJS::String( val.toString() );
    }

    return KJS::Null();
}

QVariant convertToVariant( KJS::ExecState *state, const KJS::Value &v )
{
    QVariant val;

    if ( v.isA( KJS::StringType ) )
	val = v.toString(state).qstring();
    else if ( v.isA( KJS::NumberType ) )
	val = v.toInteger(state);
    else if ( v.isA( KJS::BooleanType ) )
	val = v.toBoolean(state);
    else if ( v.isA( KJS::ObjectType ) ) {
	KJS::Object obj = v.toObject(state);
	QString s("Object, class '%1', constructor='%2', function='%3'");
	s = s.arg( obj.className().qstring() );
	s = s.arg( obj.implementsConstruct() );
	s = s.arg( obj.implementsCall() );
	val = s;
	
    }
    else {
	QString s( "Unsupported value type, %1" );
	val = s.arg( (int) v.type() );
    }

    return val;
}

QString dumpObject(  KJS::ExecState *state, KJS::Object &obj )
{
    QString s;

    if ( !obj.isValid() )
	return QString( "Invalid object\n" );

    s = QString("Class:\t\t%1\n").arg(obj.className().qstring());
	
    KJS::List l = obj.propList( state );
    s += QString("Property Count:\t%1\n").arg(l.size());

    KJS::ListIterator propIt = l.begin();
    while ( propIt != l.end() ) {
	
	KJS::UString name = propIt->getPropertyName( state );
	if ( obj.hasProperty( state, name ) ) {
	    KJS::Value v = obj.get( state, name );
	    QVariant val = convertToVariant( state, v );

	    s += QString( "   %1 = %2\n" ).arg(name.qstring()).arg(val.toString());
	}
	
	++propIt;
    }

    return s;
}

} // namespace KJSEmbed
