#include "database.h"
#include "table.h"
#include "set.h"
#include "field.h"
#include "sqliteadapter.h"
#include <QUrl>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

Database::Database( const QUrl &uri )
{
    m_db = new SQLiteAdapter(uri, this);
}

Database::~Database()
{
    delete m_db;
}

bool Database::open()
{
    return m_db->open();
}

void Database::close()
{
    m_db->close();
}

#include <qdebug.h>
Table Database::defineTable( const QString &tableName,
                   const QList<Field> &fields,
                   const QMap<QString,QVariant> &properties )
{
    Table result( this, tableName, fields, properties);
    if( tables().contains( tableName ) )
    {

    }
    else
    {
        QSqlQuery query = m_db->connection().exec( result.create(true,false) );
        m_isValid = query.isValid();

        qDebug() << query.lastError();
    }
/*
'migrate',
'primarykey',
'fake_migrate',
'format',
'trigger_name',
'sequence_name'
*/
    return result;
}

QStringList Database::drivers()
{

}

BaseAdaptor *Database::db() const
{
    return m_db;
}

QStringList Database::tables() const
{
    QStringList result;
    foreach( Table table, m_tables )
        result << table.name();
    return result;
}

void Database::begin()
{

}

void Database::commit()
{

}

void Database::rollback()
{

}

Set Database::operator() ( const Query &query ) const
{

}

Table Database::table( const QString &table ) const
{
    return m_tables[table];
}

void Database::registerDriver( const QString &key, FactoryMethod )
{

}

Set Database::select( const QList<Field> &fields, const Query &query ) const
{
    QMap<QString,QVariant> options;
    return Set(this, fields, query, options);
}

bool Database::isValid() const
{
    return m_isValid;
}

QSqlError Database::lastError() const
{
    return m_db->connection().lastError();
}

