package florent37.github.com.androidnosql.paper;

import android.content.Context;

import com.github.florent37.androidnosql.datasaver.DataSaver;

import java.util.HashSet;
import java.util.Set;

import io.paperdb.Book;
import io.paperdb.Paper;

/**
 * Created by florentchampigny on 06/06/2017.
 */

public class PaperDataSaver implements DataSaver {

    public static final String NODES = "nodes";
    public static final String VALUES = "values";

    public PaperDataSaver(Context context){
        Paper.init(context);
    }

    @Override
    public void saveNodes(String completePath, Set<String> values) {
        final Set<String> nodes = new HashSet<>();
        nodes.add(completePath);
        nodes.addAll(getNodes());
        for (String value : values) {
            nodes.add(completePath + value);
        }

        Paper.book(NODES).write(NODES, nodes);
    }

    @Override
    public void saveValue(String completePath, Object value) {

        completePath = formatPath(completePath);

        final Book book = Paper.book(VALUES);
        if(value instanceof Integer) {
            book.write(completePath, (Integer) value);
        } else if(value instanceof Float) {
            book.write(completePath, (Float) value);
        } else if(value instanceof Boolean) {
            book.write(completePath, (Boolean) value);
        } else if(value instanceof Long) {
            book.write(completePath, (Long) value);
        } else {
            book.write(completePath, String.valueOf(value));
        }
    }

    @Override
    public Set<String> getNodes() {
        return Paper.book(NODES).read(NODES, new HashSet<String>());
    }

    @Override
    public Object getValue(String completePath) {
        return Paper.book(VALUES).read(formatPath(completePath));
    }

    private String formatPath(String path){
        return path.replace("/", "_%-");
    }

    @Override
    public void remove(String startingPath) {
        final Book bookNodes = Paper.book(NODES);
        final Book bookValues = Paper.book(VALUES);
        final Set<String> nodes = getNodes();
        final Set<String> nodesToKeep = new HashSet<>();
        //update values
        for (String node : nodes) {
            if(node.startsWith(startingPath)) {
                bookValues.delete(formatPath(node));
            } else {
                nodesToKeep.add(node);
            }
        }
        bookNodes.write(NODES, nodesToKeep);
    }
}