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());
        }
    }
}
