package com.badlogic.gdx.lang;

import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.files.TextFileUtils;
import com.badlogic.gdx.function.Supplier;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;

import java.io.IOException;
import java.io.Writer;

public class ClassFinderCache {

	private final ObjectMap<String, Array<String>> classNames = new ObjectMap<>();

	public ClassFinderCache() {

	}

	public ClassFinderCache(FileHandle file) throws IOException {
		readFromFile(file);
	}

	public Array<String> get(String groupName) {
		return classNames.get(groupName);
	}

	public void add(String groupName, Supplier<Array<String>> supplier) {
		classNames.put(groupName, new Array<>());
		classNames.get(groupName).addAll(supplier.get());
	}

	public void writeToFile(FileHandle file) throws IOException {

		try (Writer writer = file.writer(false, "UTF-8")) {

			for (ObjectMap.Entry<String, Array<String>> group : classNames) {

				writer.append(':').append(group.key).append('\n');

				for (String name : group.value) {
					writer.append(name).append('\n');
				}
			}

			writer.flush();
		}
	}

	private void readFromFile(FileHandle file) throws IOException {

		if (!file.exists()) {
			return;
		}

		Box.Reference<String> groupName = new Box.Reference<>(null);

		TextFileUtils.readLines(file, line -> {
			if (line.startsWith(":")) {
				groupName.set(line.substring(1));
				classNames.put(groupName.get(), new Array<>());
			} else if (!groupName.isNull()) {
				classNames.get(groupName.get()).add(line);
			}
		});
	}

}