package me.rahul.plugins.sqlDB;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * This class echoes a string called from JavaScript.
 */
public class sqlDB extends CordovaPlugin {

    public static String dbname = "dbname";
    PluginResult plresult = new PluginResult(PluginResult.Status.NO_RESULT);

    private void sendPluginResponse(int code, String msg, boolean error, CallbackContext callbackContext) {
        JSONObject response = new JSONObject();
        try {
            response.put("message", msg);
            response.put("code", code);
            if (error) {
                plresult = new PluginResult(PluginResult.Status.ERROR,
                        response);
            } else {
                plresult = new PluginResult(PluginResult.Status.OK, response);
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            plresult = new PluginResult(PluginResult.Status.ERROR,
                    e.getMessage());
        }
        callbackContext.sendPluginResult(plresult);
    }

    @Override
    public boolean execute(String action, JSONArray args,
                           CallbackContext callbackContext) throws JSONException {

        if (action.equalsIgnoreCase("copy")) {
            this.copyDB(args.getString(0), "www", callbackContext);
            return true;
        } else if (action.equalsIgnoreCase("remove")) {
            String db = args.getString(0);
            File path = cordova.getActivity().getDatabasePath(db);
            Boolean fileExists = path.exists();
            if (fileExists) {
                boolean deleted = path.delete();
                if (deleted) {
                    sendPluginResponse(200, "Database Deleted", false, callbackContext);
                } else {
                    sendPluginResponse(400, "Unable to Delete", true, callbackContext);
                }
            } else {
                sendPluginResponse(404, "Invalid DB Location or DB Doesn't Exists", true, callbackContext);
            }
            return true;
        } else if (action.equalsIgnoreCase("copyDbToStorage")) {
            String db = args.getString(0);
            String dest = args.getString(2);
            this.copyDbToStorage(db, dest, callbackContext);
            return true;
        } else if (action.equalsIgnoreCase("copyDbFromStorage")) {
            String db = args.getString(0);
            String src = args.getString(2);
            boolean deleteolddb = args.getBoolean(3);
            this.copyDbFromStorage(db, src, deleteolddb, callbackContext);
            return true;
        } else if (action.equalsIgnoreCase("checkDbOnStorage")) {
            String db = args.getString(0);
            String src = args.getString(2);
            this.checkDbOnStorage(db, src, callbackContext);
            return true;
        } else {
            plresult = new PluginResult(PluginResult.Status.INVALID_ACTION);
            callbackContext.sendPluginResult(plresult);
            return false;
        }
    }

    private void copyDB(String dbName, final String src, final CallbackContext callbackContext) {

        final File dbpath;
        dbname = dbName;
        JSONObject response = new JSONObject();
        final DatabaseHelper dbhelper = new DatabaseHelper(this.cordova
                .getActivity().getApplicationContext());
        dbpath = this.cordova.getActivity().getDatabasePath(dbname);
        Boolean dbexists = dbpath.exists();
        //Log.d("CordovaLog", "DatabasePath = " + dbpath + "&&&& dbname = " + dbname + "&&&&DB Exists =" + dbexists);

        if (dbexists) {
            sendPluginResponse(516, "DB Already Exists", true, callbackContext);
        } else {
            cordova.getThreadPool().execute(new Runnable() {

                @Override
                public void run() {
                    PluginResult plResult;
                    // TODO Auto-generated method stub
                    try {
                        dbhelper.createdatabase(dbpath, src, callbackContext);
//						plResult = new PluginResult(PluginResult.Status.OK);
//						callbackContext.sendPluginResult(plResult);
                        //sendPluginResponse(200,"Db Copied", false, callbackContext);
                    } catch (Exception e) {

//						plResult = new PluginResult(PluginResult.Status.ERROR,
//								e.getMessage());
//						callbackContext.sendPluginResult(plResult);
                        sendPluginResponse(400, e.getMessage(), true, callbackContext);
                    }
                }

            });
        }
    }


    private void newCopyDB(File source, File destination, CallbackContext callbackContext) {
        try {
            InputStream myInput = new FileInputStream(source);
            OutputStream myOutput = new FileOutputStream(destination);
            byte[] buffer = new byte[1024];
            while ((myInput.read(buffer)) > -1) {
                myOutput.write(buffer);
            }

            myOutput.flush();
            myOutput.close();
            myInput.close();
            sendPluginResponse(200, "DB Copied Successfully", false, callbackContext);
        } catch (IOException e) {
            sendPluginResponse(400, e.getMessage(), true, callbackContext);
        }
    }

    private void copyDbFromStorage(String db, String src, boolean deleteolddb, final CallbackContext callbackContext) {
        File source;
        if (src.indexOf("file://") != -1) {
            source = new File(src.replace("file://", ""));
        } else {
            source = new File(src);
        }

        if (source.exists()) {
            if (deleteolddb) {
                File path = cordova.getActivity().getDatabasePath(db);
                Boolean fileExists = path.exists();
                if (fileExists) {
                    boolean deleted = path.delete();
                    if (deleted) {
                        this.copyDB(db, source.getAbsolutePath(), callbackContext);
                    } else {
                        sendPluginResponse(400, "Unable to Delete", true, callbackContext);
                    }
                } else {
                    sendPluginResponse(404, "Old DB Doesn't Exists", true, callbackContext);
                }
            } else {
                this.copyDB(db, source.getAbsolutePath(), callbackContext);
            }
        } else {
            sendPluginResponse(404, "Invalid DB Source Location", true, callbackContext);
        }
    }

    private void checkDbOnStorage(String db, String src, final CallbackContext callbackContext) {
        File source;
        if (src.indexOf("file://") != -1) {
            source = new File(src.replace("file://", ""));
        } else {
            source = new File(src);
        }
        if (source.exists()) {
            sendPluginResponse(200, "DB File Exists At Source Location", false, callbackContext);
        } else {
            sendPluginResponse(404, "Invalid DB Source Location", true, callbackContext);
        }

    }

    private void copyDbToStorage(String dbname, String dest, final CallbackContext callbackContext) {

        File source = cordova.getActivity().getDatabasePath(dbname);
        File destFolder;
        File destination;

        if (dest.indexOf("file://") != -1) {
            destination = new File(dest.replace("file://", "") + dbname);
            destFolder = new File(dest.replace("file://", ""));
        } else {
            destination = new File(dest + dbname);
            destFolder = new File(dest);
        }


        if (!destFolder.exists()) {
            destFolder.mkdirs();
        }

        if (!destFolder.exists()) {
            sendPluginResponse(404, "Invalid output DB Location", true, callbackContext);
            return;
        }

        if (source.exists()) {
            this.newCopyDB(source, destination, callbackContext);
        } else {
            sendPluginResponse(404, "Invalid DB Location or DB Doesn't Exists", true, callbackContext);
        }
    }
}

@@ -7086,32 +7086,35 @@
 e(%22file://%22, %22%22)
++db
 );%0A        %7D els
@@ -7142,32 +7142,35 @@
 e = new File(src
++db
 );%0A        %7D%0A   

Update sqlDB.java