import java.util.Locale;
import java.util.Scanner;

public class PomodoroTimer {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Focus minutes (default 25): ");
        int focusMinutes = parsePositiveInt(scanner.nextLine(), 25);
        System.out.print("Break minutes (default 5): ");
        int breakMinutes = parsePositiveInt(scanner.nextLine(), 5);

        TimerState state = new TimerState(
                focusMinutes * 60,
                breakMinutes * 60
        );

        System.out.println(
                "Commands: start, pause, resume, reset, status, quit"
        );

        while (true) {
            if (state.running) {
                sleepMs(1000);
                state.tick();
                System.out.println(state.statusLine());
            } else {
                System.out.print("> ");
                String command = scanner.nextLine().trim().toLowerCase(
                        Locale.ROOT
                );
                if (handleCommand(command, state)) {
                    break;
                }
            }
        }
    }

    private static boolean handleCommand(String command, TimerState state) {
        switch (command) {
            case "start":
            case "resume":
                state.running = true;
                System.out.println("Timer running.");
                return false;
            case "pause":
                state.running = false;
                System.out.println("Timer paused.");
                return false;
            case "reset":
                state.resetCurrentPhase();
                state.running = false;
                System.out.println("Current phase reset.");
                return false;
            case "status":
                System.out.println(state.statusLine());
                return false;
            case "quit":
                System.out.println("Good work today.");
                return true;
            default:
                System.out.println(
                        "Unknown command. Use start, pause, resume, " +
                        "reset, status, quit"
                );
                return false;
        }
    }

    private static int parsePositiveInt(String value, int fallback) {
        try {
            int parsed = Integer.parseInt(value.trim());
            return parsed > 0 ? parsed : fallback;
        } catch (NumberFormatException e) {
            return fallback;
        }
    }

    private static void sleepMs(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    private static class TimerState {
        private final int focusSeconds;
        private final int breakSeconds;
        private int remainingSeconds;
        private boolean focusPhase = true;
        private int completedFocusSessions = 0;
        private boolean running = false;

        private TimerState(int focusSeconds, int breakSeconds) {
            this.focusSeconds = focusSeconds;
            this.breakSeconds = breakSeconds;
            this.remainingSeconds = focusSeconds;
        }

        private void tick() {
            remainingSeconds--;
            if (remainingSeconds > 0) {
                return;
            }

            if (focusPhase) {
                completedFocusSessions++;
            }

            focusPhase = !focusPhase;
            remainingSeconds = focusPhase ? focusSeconds : breakSeconds;
            System.out.print("\u0007");
            System.out.println(
                    focusPhase
                            ? "Break complete. Focus time."
                            : "Focus complete. Break time."
            );
        }

        private String statusLine() {
            int safeSeconds = Math.max(0, remainingSeconds);
            int minutes = safeSeconds / 60;
            int seconds = safeSeconds % 60;
            String phase = focusPhase ? "FOCUS" : "BREAK";
            String state = running ? "RUNNING" : "PAUSED";
            return String.format(
                    "%s %02d:%02d | sessions=%d | %s",
                    phase,
                    minutes,
                    seconds,
                    completedFocusSessions,
                    state
            );
        }

        private void resetCurrentPhase() {
            remainingSeconds = focusPhase ? focusSeconds : breakSeconds;
        }
    }
}
