package CHAPTER12;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

// 로그 파일에 스레드 안전하게 기록하는 Logger 클래스
class Logger1 {
    private static final String LOG_FILE = "temperature_log.txt"; // 로그 파일 경로

    // synchronized → 여러 스레드가 동시에 호출해도 충돌 없이 처리
    public static synchronized void log(String message) {
        try (PrintWriter out = new PrintWriter(new FileWriter(LOG_FILE, true))) {
            out.println(message); // 로그 메시지 한 줄 기록
        } catch (IOException e) {
            System.err.println("로그 파일 쓰기 실패: " + e.getMessage());
        }
    }
}

// 온도 센서 클래스 (Thread 상속)
class TemperatureSensor1 extends Thread {
    private String sensorName; // 센서 이름

    public TemperatureSensor1(String sensorName) {
        this.sensorName = sensorName;
    }
    public void run() {
        // 로그에 찍을 시간 포맷 정의
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 5회 측정 반복
        for (int i = 0; i < 5; i++) {
            // 20~35도 사이 난수 생성
            double temp = 20 + Math.random() * 15;

            // 현재 시간 문자열 생성
            String timestamp = LocalDateTime.now().format(dtf);

            // 로그 및 출력 메시지 포맷팅
            String message = String.format("[%s][%s] 현재 온도: %.2f°C", timestamp, sensorName, temp);

            System.out.println(message);  // 콘솔 출력
            Logger1.log(message);         // 파일에 로그 기록

            // 1~2초 랜덤 대기 후 다음 측정
            try {
                Thread.sleep(1000 + (int)(Math.random() * 1000));
            } 
            catch (InterruptedException e) {
                break; // 인터럽트 발생 시 종료
            }
        }
    }
}
public class LAB03_TemperatureMonitoringLog {
    public static void main(String[] args) {        
        new TemperatureSensor1("센서 A").start();
        new TemperatureSensor1("센서 B").start();
        new TemperatureSensor1("센서 C").start();
    }
}
