#ifndef TABLE_H
#define TABLE_H
#include <QList>
#include <QMap>
#include <QString>
#include <QHash>
#include <QSharedData>
#include <QExplicitlySharedDataPointer>

class Set;
class BaseAdaptor;
class Database;
class Field;
class Query;

class TableData : public QSharedData
{
public:
    Database *m_db;
    QString m_name;
    QHash<QString,Field> m_fields;
    QMap<QString,QVariant> m_properties;
};

class Table
{
public:
    Table( Database *db = 0,
           const QString &name = QString(),
           const QList<Field> &fields = QList<Field>(),
           const QMap<QString,QVariant> &properties = QMap<QString,QVariant>() );

    Field operator[] ( const QString &fieldName ) const;
    Field &operator[] ( const QString &fieldName );
    Field operator[] ( int col ) const;
    Field &operator[] ( int col );
    Field id() const;

    bool hasColumn( const QString &colname ) const;

    int cols() const;
    QStringList fields() const;

    QString name() const;

    QString create( bool migrate=true, bool fakeMigrate=false) const;

    QStringList primaryKeys() const;

    const Database *db() const;

    QVariant insert( const QMap<QString,QVariant> &row ) const;
    bool insertInto( const QStringList &fields, const Query &source ) const;

    bool updateValues( const Query &fieldSelection, const QMap<QString,QVariant> &fieldValues );
    bool updateValue( const Query &fieldSelection, const QString &field, const QVariant &value );
    QMap<QString,QVariant> values( const Query &fieldSelection ) const;
    QVariant value( const Query &fieldSelection, const QString &field ) const;

    Set select( const Query &whereClause, const QMap<QString,QVariant> &options) const;
    Set select( const QStringList &fields, const Query &whereClause, const QMap<QString,QVariant> &options ) const;

private:
    QExplicitlySharedDataPointer<TableData> m_data;
};

#endif // TABLE_H

