package CHAPTER13;

import java.io.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LAB03_LogAnalyzer {   
    private static final Scanner scanner = new Scanner(System.in);
    private static final String path = "/Volumes/MSJ_SSD/JOBS/03. Book Job(Major)/자바/JavaWorkspace/JavaMaster/src/CHAP14/";
    public static void main(String[] args) {
        while (true) {
            System.out.println("\n로그 분석기");
            System.out.println("1. 특정 패턴 검색 (예: ERROR, WARNING)");
            System.out.println("2. 특정 시간대 로그 필터링");
            System.out.println("3. 종료");
            System.out.print("선택: ");
            int choice = scanner.nextInt();
            scanner.nextLine(); 
            
            switch (choice) {
                case 1 -> searchPatternInLogs(); // 특정 패턴 검색
                case 2 -> filterLogsByTime();    // 특정 시간대 로그 필터링
                case 3 -> {
                    System.out.println("프로그램 종료");
                    return;  
                }
                default -> System.out.println(" 올바른 번호를 입력하세요.");
            }
        }
    }

    // 특정 패턴 검색 (예: ERROR, WARNING)
    private static void searchPatternInLogs() {
        System.out.print("분석할 로그 파일명 입력 (*.txt 포함): ");
        String logFileName = scanner.nextLine();
        System.out.print("검색할 패턴 입력 (예: ERROR, WARNING): ");
        String searchPattern = scanner.nextLine();        
        logFileName = path + logFileName;
        
        try (BufferedReader reader = new BufferedReader(new FileReader(logFileName))) {
            String line;
            boolean found = false;

            System.out.println("\n검색 결과:");
            // 파일의 각 줄을 읽으며 특정 패턴이 포함된 줄 출력
            while ((line = reader.readLine()) != null) {
                if (line.contains(searchPattern)) {
                    System.out.println(line);
                    found = true;
                }
            }

            // 패턴이 포함된 로그가 없을 경우 메시지 출력
            if (!found) {
                System.out.println("'" + searchPattern + "' 패턴이 포함된 로그가 없습니다.");
            }
        } catch (IOException e) {
            System.out.println("로그 파일을 읽는 중 오류 발생: " + e.getMessage());
        }
    }

    // 특정 시간대 로그 필터링
    private static void filterLogsByTime() {
        System.out.print("분석할 로그 파일명 입력 (*.txt 포함): ");
        String logFileName = scanner.nextLine();
        System.out.print("시작 시간 입력 (예: 2025-03-04 14:00:00): ");
        String startTime = scanner.nextLine();
        System.out.print("종료 시간 입력 (예: 2025-03-04 15:00:00): ");
        String endTime = scanner.nextLine();
        String outputFileName = "filtered_logs.txt"; // 필터링된 로그 저장 파일

        logFileName = path + logFileName;
        
        // 로그 파일에서 시간 정보 추출을 위한 정규 표현식 패턴
        Pattern logPattern = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})");

        try (BufferedReader reader = new BufferedReader(new FileReader(logFileName));
             BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) {

            String line;
            boolean found = false;

            while ((line = reader.readLine()) != null) {
                Matcher matcher = logPattern.matcher(line);
                // 로그에서 시간 정보 추출
                if (matcher.find()) {
                    String logTime = matcher.group(1);
                    // 로그 시간이 주어진 시간 범위 안에 있는지 확인
                    if (logTime.compareTo(startTime) >= 0 && logTime.compareTo(endTime) <= 0) {
                        writer.write(line);  // 필터링된 로그를 저장
                        writer.newLine();
                        found = true;
                    }
                }
            }

            if (found) 
                System.out.println("특정 시간대 로그가 '" + outputFileName + "' 파일에 저장되었습니다.");
            else
                System.out.println("해당 시간대의 로그가 없습니다.");  
        } catch (IOException e) {
            System.out.println("로그 필터링 중 오류 발생: " + e.getMessage());
        }
    }
}
