package org.ethack.orwall.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


/**
 * Simple DB helper in order to manage SQLite for NAT rules.
 * This also prepare the way for more features.
 */
public class natDBHelper extends SQLiteOpenHelper {

    public static final String NAT_TABLE_NAME = "rules";
    public static final String COLUMN_APPUID = "appUID";
    public static final String COLUMN_APPNAME = "appName";
    public static final String COLUMN_ONIONTYPE = "onionType";
    public static final String COLUMN_LOCALHOST = "localhost";
    public static final String COLUMN_LOCALNETWORK = "localnetwork";

/*
    @Deprecated
    private static final String COLUMN_ONIONPORT = "onionPort";
    @Deprecated
    private static final String DB_PORT_TYPE_FENCED = "Fenced";
    @Deprecated
    private static final String COLUMN_PORTTYPE = "portType";

    private static final String NAT_TABLE_CREATE_V1 =
            String.format(
                    "CREATE TABLE %s (" +
                            "%s INTEGER PRIMARY KEY," +
                            "%s TEXT NOT NULL," +
                            "%s TEXT NOT NULL DEFAULT \"%s\"," +
                            "%s INTEGER NOT NULL DEFAULT '%d'," +
                            "%s TEXT NOT NULL DEFAULT \"TransProxy\")",
                    NAT_TABLE_NAME,
                    COLUMN_APPUID,
                    COLUMN_APPNAME,
                    COLUMN_ONIONTYPE, Constants.DB_ONION_TYPE_TOR,
                    COLUMN_ONIONPORT, Constants.ORBOT_TRANSPROXY,
                    COLUMN_PORTTYPE
            );
*/
    private static final String NAT_TABLE_CREATE_V2 =
            String.format(
                    "CREATE TABLE %s (" +
                            "%s INTEGER PRIMARY KEY," +
                            "%s TEXT NOT NULL," +
                            "%s TEXT," +
                            "%s INTEGER," +
                            "%s INTEGER)",
                    NAT_TABLE_NAME,
                    COLUMN_APPUID,
                    COLUMN_APPNAME,
                    COLUMN_ONIONTYPE,
                    COLUMN_LOCALHOST,
                    COLUMN_LOCALNETWORK
            );

    private static final int DATABASE_VERSION = 2;
    private static final String DB_NAME = "nat.s3db";

    public natDBHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(NAT_TABLE_CREATE_V2);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion == newVersion){
            return;
        }

        db.beginTransaction();
        try{
            for(int version = oldVersion; version < newVersion; version++){
                switch (version){
                    // VERSION 1 -----> 2
                    case 1:
                        db.execSQL(String.format("ALTER TABLE %s RENAME TO %s_backup;", NAT_TABLE_NAME, NAT_TABLE_NAME));
                        db.execSQL(NAT_TABLE_CREATE_V2);
                        db.execSQL(String.format(
                                "INSERT INTO %s(%s, %s, %s, %s, %s) SELECT %s, %s, %s, 0, 0 FROM %s_backup;",
                                NAT_TABLE_NAME, COLUMN_APPUID, COLUMN_APPNAME, COLUMN_ONIONTYPE, COLUMN_LOCALHOST, COLUMN_LOCALNETWORK,
                                                COLUMN_APPUID, COLUMN_APPNAME, COLUMN_ONIONTYPE, NAT_TABLE_NAME));
                        db.execSQL(String.format("DROP TABLE %s_backup;", NAT_TABLE_NAME));
                }
            }

            db.setTransactionSuccessful();
        } finally{
            db.endTransaction();
        }
    }

}