#include "sqliteadapter.h"
#include <QSqlDatabase>
#include <QPair>
#include <QStringList>
#include <QUuid>

#include "id.h"
#include "reference.h"
#include "timestamp.h"

SQLiteAdapter::SQLiteAdapter(  const QUrl &uri, const Database *db  ) :
        BaseAdaptor( db )
{
    QSqlDatabase conn = QSqlDatabase::addDatabase("QSQLITE", connectionName() );
    conn.setDatabaseName( uri.encodedPath() );
    QString connectionOptions;
    typedef QPair<QString,QString> Opt;
    foreach(  Opt option,  uri.queryItems() )
        connectionOptions = option.first + "=" + option.second + ";";
    conn.setConnectOptions(connectionOptions);
    //self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract)

}

SQLiteAdapter::~SQLiteAdapter()
{
    close();
}

QString SQLiteAdapter::mapFieldType( const QVariant::Type &type ) const
{
    switch( type )
    {
        case QVariant::Bool:
            return "CHAR(1)";
            break;
        case QVariant::String:
            return "TEXT";
            break;
        case QVariant::ByteArray:
            return "BLOB";
            break;
        case QVariant::Int:
            return "INTEGER";
            break;
        case QVariant::Double:
            return "DOUBLE";
            break;
        case QVariant::Date:
            return "DATE";
            break;
        case QVariant::Time:
            return "TIME";
            break;
        case QVariant::DateTime:
            return "TIMESTAMP";
            break;
        default:
            break;
    }

    if ( type == qMetaTypeId<Id>() )
        return "INTEGER";
    else if ( type == qMetaTypeId<Reference>() )
    {
        return "REFERENCE";
    }
    else if ( type == qMetaTypeId<Timestamp>() )
    {
        return "TIMESTAMP";
    }
    else
        return "TEXT";
}


QSqlDatabase SQLiteAdapter::connection( ) const
{
    return QSqlDatabase::database( connectionName() );
}

/*
      def web2py_extract(lookup, s):
        table = {
            'year': (0, 4),
            'month': (5, 7),
            'day': (8, 10),
            'hour': (11, 13),
            'minute': (14, 16),
            'second': (17, 19),
            }
        try:
            (i, j) = table[lookup]
            return int(s[i:j])
        except:
            return None
*/

QString SQLiteAdapter::EXTRACT( const QVariantList &args ) const
{
    return QString();
}

QStringList SQLiteAdapter::TRUNCATE( const QString &table ) const
{
    return QStringList() << "DELETE FROM " + table + ";"
           << "DELETE FROM sqlite_sequence WHERE name='" + table + ";";
}

QString SQLiteAdapter::lastrowid( const QString &table ) const
{
    return QString();
}


