package maisi.M365.power.util;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import maisi.M365.power.main.LogDTO;
import maisi.M365.power.main.Statistics;

public class LogWriter {

    private final char DEFAULT_SEPARATOR = ',';
    private Context context;
    private List<LogDTO> dtoList;
    private StringBuilder allBuilder;
    private String path;

    public LogWriter(Context context) {
        this.context = context;
        this.dtoList = new ArrayList<>();
        allBuilder = new StringBuilder();
    }

    public void writeLog(boolean all) {
        dtoList.add(Statistics.getLogStats());
        SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm");

        Date resultdate = new Date();
        sdf.format(resultdate);
        StringBuilder sb = new StringBuilder();
        sb.append(writeLine(dtoList.get(0).getHeader()));
        if (allBuilder.length() == 0) {
            allBuilder.append(writeLine(dtoList.get(0).getHeader()));
        }
        List<LogDTO> sublist;
        if (!all && dtoList.size() >= 30) {
            sublist = dtoList;
            for (LogDTO e : sublist) {
                if (e.getAverageCurrent() != 0.0) {
                    String temp = writeLine(e.toList());
                    sb.append(temp);
                    allBuilder.append(temp);
                }
            }
            writeFileOnInternalStorage("LOG " + sdf.format(resultdate) + ".csv", sb.toString());
            dtoList.clear();
        } else if(all){
            Log.d("Log", "write ALL");
            writeFileOnInternalStorage("LOG " + sdf.format(resultdate) + "ALL.csv", allBuilder.toString());
        }


    }


    private void writeFileOnInternalStorage(String sFileName, String sBody) {
        //Log.d("CSV","Write to file");
        File file = new File(Environment.getExternalStorageDirectory(), "M365Log");
        this.path = file.getAbsolutePath();
        if (!file.exists()) {
            file.mkdir();
        }

        try {
            File gpxfile = new File(file, sFileName);
            //Log.d("CSV","Path: "+file.getAbsolutePath());
            FileWriter writer = new FileWriter(gpxfile);
            writer.append(sBody);
            writer.flush();
            writer.close();

        } catch (Exception e) {
            e.printStackTrace();

        }
    }


    private String writeLine(List<String> values) {
        return writeLine(values, DEFAULT_SEPARATOR, ' ');
    }

    //https://tools.ietf.org/html/rfc4180
    private String followCVSformat(String value) {

        String result = value;
        if (result.contains("\"")) {
            result = result.replace("\"", "\"\"");
        }
        return result;

    }

    private String writeLine(List<String> values, char separators, char customQuote) {

        boolean first = true;

        //default customQuote is empty

        if (separators == ' ') {
            separators = DEFAULT_SEPARATOR;
        }

        StringBuilder sb = new StringBuilder();
        for (String value : values) {
            if (!first) {
                sb.append(separators);
            }
            if (customQuote == ' ') {
                sb.append(followCVSformat(value));
            } else {
                sb.append(customQuote).append(followCVSformat(value)).append(customQuote);
            }

            first = false;
        }
        sb.append("\n");

        return sb.toString();

    }


    public String getPath() {
        return path;
    }
}