import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;

public class TodoCli {
    public static void main(String[] args) {
        Path saveFile = Path.of("todo-java.txt");
        Store store = new Store(saveFile);
        store.load();

        Scanner scanner = new Scanner(System.in);
        System.out.println("Commands: add, list, done, remove, quit");

        while (true) {
            System.out.print("> ");
            String command = scanner.nextLine().trim().toLowerCase(Locale.ROOT);

            switch (command) {
                case "add":
                    System.out.print("Task: ");
                    String text = scanner.nextLine().trim();
                    if (!text.isEmpty()) {
                        store.add(text);
                        store.save();
                    }
                    break;
                case "list":
                    store.print();
                    break;
                case "done":
                    System.out.print("Task id: ");
                    int doneId = parseId(scanner.nextLine());
                    if (store.markDone(doneId)) {
                        store.save();
                    }
                    break;
                case "remove":
                    System.out.print("Task id: ");
                    int removeId = parseId(scanner.nextLine());
                    if (store.remove(removeId)) {
                        store.save();
                    }
                    break;
                case "quit":
                    System.out.println("Saved to " + saveFile);
                    return;
                default:
                    System.out.println("Use: add, list, done, remove, quit");
            }
        }
    }

    private static int parseId(String raw) {
        try {
            return Integer.parseInt(raw.trim());
        } catch (NumberFormatException e) {
            return -1;
        }
    }

    private static class Store {
        private final Path saveFile;
        private final List<Task> tasks = new ArrayList<>();
        private int nextId = 1;

        private Store(Path saveFile) {
            this.saveFile = saveFile;
        }

        private void add(String text) {
            tasks.add(new Task(nextId++, text, false));
            System.out.println("Added.");
        }

        private boolean markDone(int id) {
            for (Task task : tasks) {
                if (task.id == id) {
                    task.done = true;
                    System.out.println("Marked done.");
                    return true;
                }
            }
            System.out.println("Task not found.");
            return false;
        }

        private boolean remove(int id) {
            boolean removed = tasks.removeIf(task -> task.id == id);
            System.out.println(removed ? "Removed." : "Task not found.");
            return removed;
        }

        private void print() {
            if (tasks.isEmpty()) {
                System.out.println("No tasks yet.");
                return;
            }
            for (Task task : tasks) {
                String box = task.done ? "[x]" : "[ ]";
                System.out.println(task.id + ". " + box + " " + task.text);
            }
        }

        private void load() {
            if (!Files.exists(saveFile)) {
                return;
            }
            try {
                for (String line : Files.readAllLines(saveFile)) {
                    String[] parts = line.split("\\|", 3);
                    if (parts.length < 3) {
                        continue;
                    }
                    int id = Integer.parseInt(parts[0]);
                    boolean done = Boolean.parseBoolean(parts[1]);
                    String text = parts[2];
                    tasks.add(new Task(id, text, done));
                    nextId = Math.max(nextId, id + 1);
                }
            } catch (IOException | NumberFormatException e) {
                System.out.println("Starting with empty list.");
                tasks.clear();
                nextId = 1;
            }
        }

        private void save() {
            List<String> lines = new ArrayList<>();
            for (Task task : tasks) {
                lines.add(task.id + "|" + task.done + "|" + task.text);
            }
            try {
                Files.write(saveFile, lines);
            } catch (IOException e) {
                System.out.println("Could not save tasks.");
            }
        }
    }

    private static class Task {
        private final int id;
        private final String text;
        private boolean done;

        private Task(int id, String text, boolean done) {
            this.id = id;
            this.text = text;
            this.done = done;
        }
    }
}
