package com.diampark.test.Class;

import android.content.Context;
import android.net.Uri;

import com.diampark.test.BuildConfig;
import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Objects;

import androidx.core.content.FileProvider;

public class MyFileManager {

    public final static String directoryTremorName = "UserAccel";
    public final static String fileTremorBaseName = "sessions_tremor";

    public final static String directoryVocalName = "UserPerf";
    public final static String fileVocalBaseName = "sessions_reconnaissance_vocale";

    public final static String directoryPhonationName = "UserPhone";
    public final static String filePhonationBaseName = "sessions_phonaton";

    public final static String fileTabTremorBaseName = "tab_session_";

    private final static String fileSessionEndMark = ".txt";

    public void writePerfOnInternalStorage(Context c, String perf, String dirName, String fileBaseName) {
        File dir = new File(c.getExternalCacheDir(), dirName);
        if (!dir.exists())
            if (!dir.mkdir())
                return;
        File newFile = new File(dir, fileBaseName + fileSessionEndMark);
        boolean b = newFile.exists();
        try {
            FileWriter writer = new FileWriter(newFile, b);
            writer.append("-end_of_value-").append(perf);
            writer.flush();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ArrayList<String> readFileForWords(Context c, int res) {
        ArrayList<String> result = new ArrayList<>();

        try {
            InputStream is = c.getResources().openRawResource(res);
            BufferedReader r = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = r.readLine()) != null) {
                result.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

    public String readFileForPhoneme(Context c, int res, String word) {
        String result = "";

        try {
            InputStream is = c.getResources().openRawResource(res);
            BufferedReader r = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = r.readLine()) != null) {
                String[] stringValidTokens = line.split(",");
                if (word.equals(stringValidTokens[0]))
                    return stringValidTokens[1];
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public ArrayList<UserVocalSession> readFileForVocalSession(Context context) {
        ArrayList<UserVocalSession> res = new ArrayList<>();
        StringBuilder result = new StringBuilder();

        File dir = new File(context.getExternalCacheDir(), directoryVocalName);
        File newFile = new File(dir, fileVocalBaseName + fileSessionEndMark);

        if (newFile.exists()) {
            Gson g = new Gson();
            try {
                BufferedReader br = new BufferedReader(new FileReader(newFile));
                String line;
                while ((line = br.readLine()) != null) {
                    result.append(line);
                }
                String[] objets = String.valueOf(result).split("-end_of_value-");
                for (String s : objets) {
                    res.add(g.fromJson(s, UserVocalSession.class));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return res;
    }

    public File getCacheFileDir(Context c, String dirName) {
        File dir = new File(c.getExternalCacheDir(), dirName);
        if (!dir.exists())
            if (!dir.mkdir())
                return null;
        return dir;
    }

    public ArrayList<Uri> getSessionsUris(Context c) {
        ArrayList<Uri> uris = new ArrayList<>();

        File dirVocal = new File(c.getExternalCacheDir(), directoryVocalName);
        File vocalSession = new File(dirVocal, fileVocalBaseName + fileSessionEndMark);
        if (vocalSession.exists()) {
            uris.add(FileProvider.getUriForFile(c,
                    BuildConfig.APPLICATION_ID + ".provider", vocalSession));
        }

        File dirPhonation = new File(c.getExternalCacheDir(), directoryPhonationName);
        File phonationSession = new File(dirPhonation, filePhonationBaseName + fileSessionEndMark);
        if (phonationSession.exists()) {
            uris.add(FileProvider.getUriForFile(c,
                    BuildConfig.APPLICATION_ID + ".provider", phonationSession));
            String[] fileList = dirPhonation.list();
        }

        File dirTremor = new File(c.getExternalCacheDir(), directoryTremorName);
        String[] fileList = dirTremor.list();
        if (fileList != null)
            for (String fName : fileList) {
                File tremorFile = new File(dirTremor, fName);
                uris.add(FileProvider.getUriForFile(c,
                        BuildConfig.APPLICATION_ID + ".provider", tremorFile));
            }

        return uris;
    }

    public File getNewFileText(Context c, String dirName, String fileTextBaseName) {
        int nb = 0;

        File dir = new File(c.getExternalCacheDir(), dirName);
        if (!dir.exists())
            if (!dir.mkdir())
                return null;

        if (dir.list() != null)
            nb = Objects.requireNonNull(dir.list()).length;

        if (nb == 0)
            nb = 1;
        return new File(dir, fileTextBaseName + nb + fileSessionEndMark);
    }

    public void removeAllFile(Context c) {
        File dirVocal = new File(c.getExternalCacheDir(), directoryVocalName);
        File dirPhonation = new File(c.getExternalCacheDir(), directoryPhonationName);
        File dirTremor = new File(c.getExternalCacheDir(), directoryTremorName);

        try {
            deleteDirectoryRecursion(dirPhonation);
            deleteDirectoryRecursion(dirVocal);
            deleteDirectoryRecursion(dirTremor);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void deleteDirectoryRecursion(File file) throws IOException {
        if (file.isDirectory()) {
            File[] entries = file.listFiles();
            if (entries != null) {
                for (File entry : entries) {
                    deleteDirectoryRecursion(entry);
                }
            }
        }
        if (!file.delete()) {
            throw new IOException("Failed to delete " + file);
        }
    }

}
