package com.screenshot;
import com.screenshot.config.AppConfig;
import com.screenshot.scheduler.ScreenshotScheduler;
import com.screenshot.service.ScreenshotService;
import java.awt.*;
import java.util.Scanner;
public class ScreenshotApp {
private final AppConfig config;
private final ScreenshotService screenshotService;
private final ScreenshotScheduler scheduler;
public ScreenshotApp() throws AWTException {
this.config = new AppConfig();
this.screenshotService = new ScreenshotService();
this.scheduler = new ScreenshotScheduler(screenshotService, config);
}
public void run() {
printBanner();
scheduler.start();
Scanner scanner = new Scanner(System.in);
boolean exit = false;
while (!exit) {
printMenu();
String input = scanner.nextLine().trim();
switch (input) {
case "1" -> showSettings();
case "2" -> changeSavePath(scanner);
case "3" -> changeTargetWindow(scanner);
case "4" -> changeInterval(scanner);
case "5" -> changeCron(scanner);
case "6" -> toggleScheduleMode();
case "7" -> listWindows();
case "8" -> takeScreenshotNow();
case "9" -> toggleScheduler();
case "0" -> exit = true;
default -> System.out.println("Неизвестная команда");
}
}
shutdown();
}
private void printBanner() {
System.out.println("""
╔═══════════════════════════════════════╗
║ SCREENSHOT APP v1.0 (Java 21) ║
╚═══════════════════════════════════════╝
""");
}
private void printMenu() {
System.out.println("""
─────────────── МЕНЮ ───────────────
1. Показать текущие настройки
2. Изменить путь сохранения
3. Изменить целевое приложение
4. Изменить интервал (минуты)
5. Изменить cron-расписание
6. Переключить режим (cron/интервал)
7. Список доступных окон
8. Сделать скриншот сейчас
9. Запустить/Остановить планировщик
0. Выход
────────────────────────────────────
Введите команду:\s""");
}
private void showSettings() {
System.out.println("\n=== ТЕКУЩИЕ НАСТРОЙКИ ===");
System.out.println("Путь сохранения: " + config.getSavePath());
System.out.println("Целевое окно: " +
(config.getTargetWindow().isEmpty() ? "Весь экран" : config.getTargetWindow()));
System.out.println("Режим: " + (config.useCron() ? "Cron" : "Интервал"));
System.out.println("Интервал: " + config.getIntervalMinutes() + " мин.");
System.out.println("Cron: " + config.getCronExpression());
System.out.println("Статус: " + (scheduler.isRunning() ? "Работает" : "Остановлен"));
}
private void changeSavePath(Scanner scanner) {
System.out.print("Введите новый путь сохранения: ");
String path = scanner.nextLine().trim();
if (!path.isEmpty()) {
config.setSavePath(path);
config.saveConfig();
System.out.println("Путь изменён на: " + path);
}
}
private void changeTargetWindow(Scanner scanner) {
System.out.print("Введите название окна (пусто = весь экран): ");
String window = scanner.nextLine().trim();
config.setTargetWindow(window);
config.saveConfig();
screenshotService.resetImageComparison();
System.out.println("Целевое окно: " +
(window.isEmpty() ? "Весь экран" : window));
}
private void changeInterval(Scanner scanner) {
System.out.print("Введите интервал в минутах: ");
try {
int minutes = Integer.parseInt(scanner.nextLine().trim());
if (minutes > 0) {
config.setIntervalMinutes(minutes);
config.saveConfig();
scheduler.restart();
System.out.println("Интервал изменён на: " + minutes + " мин.");
}
} catch (NumberFormatException e) {
System.out.println("Неверный формат числа");
}
}
private void changeCron(Scanner scanner) {
System.out.println("Формат: секунды минуты часы день месяц день_недели");
System.out.println("Примеры:");
System.out.println(" 0 * * * * * - каждую минуту");
System.out.println(" 0 */5 * * * * - каждые 5 минут");
System.out.println(" 0 0 9-18 * * * - каждый час с 9 до 18");
System.out.print("Введите cron-выражение: ");
String cron = scanner.nextLine().trim();
if (!cron.isEmpty()) {
config.setCronExpression(cron);
config.saveConfig();
if (config.useCron()) {
scheduler.restart();
}
System.out.println("Cron изменён на: " + cron);
}
}
private void toggleScheduleMode() {
boolean newMode = !config.useCron();
config.setUseCron(newMode);
config.saveConfig();
scheduler.restart();
System.out.println("Режим: " + (newMode ? "Cron" : "Интервал"));
}
private void listWindows() {
System.out.println("\n=== ДОСТУПНЫЕ ОКНА ===");
var windows = screenshotService.getAvailableWindows();
int count = 0;
for (String window : windows) {
if (count++ < 20) { // Ограничиваем вывод
System.out.println("• " + window);
}
}
if (windows.size() > 20) {
System.out.println("... и ещё " + (windows.size() - 20) + " окон");
}
}
private void takeScreenshotNow() {
System.out.println("Делаем скриншот...");
screenshotService.captureAndSave(
config.getSavePath(),
config.getTargetWindow()
);
}
private void toggleScheduler() {
if (scheduler.isRunning()) {
scheduler.stop();
} else {
scheduler.start();
}
}
private void shutdown() {
System.out.println("Завершение работы...");
config.saveConfig();
scheduler.shutdown();
}
public static void main(String[] args) {
try {
ScreenshotApp app = new ScreenshotApp();
app.run();
} catch (AWTException e) {
System.err.println("Ошибка инициализации: " + e.getMessage());
}
}
}