package com.virtual.pollentia.WalkingTour.modelo;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.AsyncTask;
import android.util.Log;

import com.virtual.pollentia.WalkingTour.controlador.Controlador;

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

/**
 * Created by Roger Gomez
 */
public class CopyFilesToAssets extends AsyncTask<Context, String, String> {

    private Context contexto;
    private AssetManager assetManager;
    private Controlador controlador;
    private ProgressDialog pDialog;

    /**
     * Constructor de la classe
     *
     * @param con,     contexto de la activity
     * @param control, controlador de la app
     */
    public CopyFilesToAssets(Context con, Controlador control) {
        this.contexto = con;
        this.controlador = control;
    }

    /**
     * Recoge la ruta de la memòria interna y llama a la funcion que copia los assets de la app.
     *
     * @throws IOException
     */
    public void doCopyAssets() throws IOException {
        assetManager = contexto.getAssets();
        File directory = new File(
                android.os.Environment.getExternalStorageDirectory()
                        + File.separator);
        copyFileOrDir(directory.getAbsolutePath().toString(), "pollentia_files");


    }

    /**
     * Función recursiva que recorre la estructura de ficheros de assets para comprobar si existen en la memòria interna y llamar a las funciones que
     * los copian en caso de que no existan.
     *
     * @param TARGET_BASE_PATH path de la memória interna.
     * @param path             path de la ruta que actual que vamos recorriendo.
     */
    private void copyFileOrDir(String TARGET_BASE_PATH, String path) {
        AssetManager assetManager = contexto.getAssets();
        String assets[] = null;
        try {
            assets = assetManager.list(path);
            String fullPath = TARGET_BASE_PATH + "/" + path;
            File dir = new File(fullPath);
            if (assets.length == 0) {
                //String fullPath =  TARGET_BASE_PATH + "/" + path;
                //File dir = new File(fullPath);
                if (!dir.exists()) {
                   /* new Thread(new Runnable() {
                        public void run() {
                            copyFile(TARGET_BASE_PATH, path);
                        }
                    }).start();*/
                    copyFile(TARGET_BASE_PATH, path);
                } else{}
            } else {

                if (!dir.exists())
                    if (!dir.mkdirs())
                        Log.i("tag", "could not create dir " + fullPath);
                for (int i = 0; i < assets.length; ++i) {
                    String p;
                    if (path.equals(""))
                        p = "";
                    else
                        p = path + "/";

                    copyFileOrDir(TARGET_BASE_PATH, p + assets[i]);
                }
            }
        } catch (IOException ex) {
            Log.e("tag", "I/O Exception", ex);
        }
        Log.i("tag", "saliendo de copiar files");
    }

    /**
     * copia un fichero de assets a la memòria interna.
     *
     * @param TARGET_BASE_PATH
     * @param filename
     */

    private void copyFile(String TARGET_BASE_PATH, String filename) {
        AssetManager assetManager = contexto.getAssets();

        InputStream in = null;
        OutputStream out = null;
        String newFileName = null;
        try {
            in = assetManager.open(filename);
            newFileName = TARGET_BASE_PATH + "/" + filename;
            out = new FileOutputStream(newFileName);

            byte[] buffer = new byte[1024];
            int read;
            while ((read = in.read(buffer)) != -1) {
                out.write(buffer, 0, read);
            }
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch (Exception e) {
            Log.e("tag", "Exception in copyFile() of " + newFileName);
            Log.e("tag", "Exception in copyFile() " + e.toString());
        }
    }

    /**
     * llama a la función que inicia el proceso de copia en background
     *
     * @param params
     * @return mensaje de finalización en caso correctp
     */

    @Override
    protected String doInBackground(Context... params) {
        try {
            doCopyAssets();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "Done";
    }

    /**
     * Función que es llamada al finalizar el proceso de verificación y copia
     *
     * @param result
     */

    @Override
    protected void onPostExecute(String result) {
        pDialog.dismiss();
        pDialog.hide();
        controlador.cargafinalizada();
    }

    /**
     * Antes de ejecutar el proceso de verifación y copia creamos un progressdialog
     */

    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(contexto);
        pDialog.setMessage("Comprobando datos necesarios");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
        super.onPreExecute();
    }
}

