package org.wordpress.android.datasets;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import org.wordpress.android.WordPress;
import org.wordpress.android.models.Account;
import org.wordpress.android.util.DateTimeUtils;
import org.wordpress.android.util.SqlUtils;

public class AccountTable {
    // Warning: the "accounts" table in WordPressDB is actually where blogs are stored.
    private static final String ACCOUNT_TABLE = "tbl_accounts";

    private static SQLiteDatabase getReadableDb() {
        return WordPress.wpDB.getDatabase();
    }
    private static SQLiteDatabase getWritableDb() {
        return WordPress.wpDB.getDatabase();
    }

    public static void createTables(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + ACCOUNT_TABLE + " ("
                + "local_id                INTEGER PRIMARY KEY DEFAULT 0,"
                + "user_name               TEXT,"
                + "user_id                 INTEGER DEFAULT 0,"
                + "display_name            TEXT,"
                + "profile_url             TEXT,"
                + "avatar_url              TEXT,"
                + "primary_blog_id         INTEGER DEFAULT 0,"
                + "site_count              INTEGER DEFAULT 0,"
                + "visible_site_count      INTEGER DEFAULT 0,"
                + "access_token            TEXT)");
    }

    public static void migrationAddEmailAddressField(SQLiteDatabase db) {
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD email TEXT DEFAULT '';");
    }

    public static void migrationAddFirstNameLastNameAboutMeFields(SQLiteDatabase db) {
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD first_name TEXT DEFAULT '';");
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD last_name TEXT DEFAULT '';");
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD about_me TEXT DEFAULT '';");
    }

    public static void migrationAddDateFields(SQLiteDatabase db) {
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD date TEXT DEFAULT '';");
    }

    public static void migrationAddAccountSettingsFields(SQLiteDatabase db) {
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD new_email TEXT DEFAULT '';");
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD pending_email_change BOOLEAN DEFAULT false;");
        db.execSQL("ALTER TABLE " + ACCOUNT_TABLE + " ADD web_address TEXT DEFAULT '';");
    }

    private static void dropTables(SQLiteDatabase db) {
        db.execSQL("DROP TABLE IF EXISTS " + ACCOUNT_TABLE);
    }

    public static void save(Account account) {
        save(account, getWritableDb());
    }

    public static void save(Account account, SQLiteDatabase database) {
        ContentValues values = new ContentValues();
        // we only support one wpcom user at the moment: local_id is always 0
        values.put("local_id", 0);
        values.put("user_name", account.getUserName());
        values.put("user_id", account.getUserId());
        values.put("display_name", account.getDisplayName());
        values.put("profile_url", account.getProfileUrl());
        values.put("avatar_url", account.getAvatarUrl());
        values.put("primary_blog_id", account.getPrimaryBlogId());
        values.put("site_count", account.getSiteCount());
        values.put("visible_site_count", account.getVisibleSiteCount());
        values.put("access_token", account.getAccessToken());
        values.put("email", account.getEmail());
        values.put("first_name", account.getFirstName());
        values.put("last_name", account.getLastName());
        values.put("about_me", account.getAboutMe());
        values.put("date", DateTimeUtils.iso8601FromDate(account.getDateCreated()));
        values.put("new_email", account.getNewEmail());
        values.put("pending_email_change", account.getPendingEmailChange());
        values.put("web_address", account.getWebAddress());
        database.insertWithOnConflict(ACCOUNT_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
    }

    public static Account getDefaultAccount() {
        return getAccountByLocalId(0);
    }

    private static Account getAccountByLocalId(long localId) {
        Account account = new Account();

        String[] args = {Long.toString(localId)};
        Cursor c = getReadableDb().rawQuery("SELECT * FROM " + ACCOUNT_TABLE + " WHERE local_id=?", args);

        try {
            if (c.moveToFirst()) {
                account.setUserName(c.getString(c.getColumnIndex("user_name")));
                account.setUserId(c.getLong(c.getColumnIndex("user_id")));
                account.setDisplayName(c.getString(c.getColumnIndex("display_name")));
                account.setProfileUrl(c.getString(c.getColumnIndex("profile_url")));
                account.setAvatarUrl(c.getString(c.getColumnIndex("avatar_url")));
                account.setPrimaryBlogId(c.getLong(c.getColumnIndex("primary_blog_id")));
                account.setSiteCount(c.getInt(c.getColumnIndex("site_count")));
                account.setVisibleSiteCount(c.getInt(c.getColumnIndex("visible_site_count")));
                account.setAccessToken(c.getString(c.getColumnIndex("access_token")));
                account.setEmail(c.getString(c.getColumnIndex("email")));
                account.setFirstName(c.getString(c.getColumnIndex("first_name")));
                account.setLastName(c.getString(c.getColumnIndex("last_name")));
                account.setAboutMe(c.getString(c.getColumnIndex("about_me")));
                account.setDateCreated(DateTimeUtils.dateFromIso8601(c.getString(c.getColumnIndex("date"))));
                account.setNewEmail(c.getString(c.getColumnIndex("new_email")));
                account.setPendingEmailChange(c.getInt(c.getColumnIndex("pending_email_change")) > 0);
                account.setWebAddress(c.getString(c.getColumnIndex("web_address")));
            }
            return account;
        } finally {
            SqlUtils.closeCursor(c);
        }
    }
}
