package com.tsi.common.utils;


import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ApplicationUtils {

    private ApplicationUtils() {
    }

    /**
     * Returns the path to the PID file for the application.
     *
     * @param applicationClass The class of the application.
     * @param appName      The name of the application.
     * @return The path to the PID file.
     */
    public static Path getApplicationPidPath(Class<?> applicationClass, String appName) {
        String pidFileName = appName + ".pid";
        try {
            File appDir = new File(applicationClass
                    .getProtectionDomain()
                    .getCodeSource()
                    .getLocation()
                    .toURI())
                    .getParentFile();

            return appDir.toPath()
                    .resolve("conf")
                    .resolve(pidFileName);
        } catch (Exception e) {
            return Paths.get("./conf", pidFileName);
        }
    }

//    public static boolean isAlreadyRunning(Path pidPath) {
//        if (Files.exists(pidPath)) {
//            try {
//                String pidStr = new String(Files.readAllBytes(pidPath)).trim();
//                long pid = Long.parseLong(pidStr);
//                // Java 9 이상에서는 ProcessHandle를 사용하여 프로세스 상태 확인
//                return ProcessHandle.of(pid).map(ProcessHandle::isAlive).orElse(false);
//            } catch (Exception e) {
//                // 잘못된 PID 내용이거나 파일 읽기 실패 시에는 실행 중 아님 처리
//                return false;
//            }
//        }
//        return false;
//    }

    public static boolean isRunning(Path pidPath) {
        if (Files.exists(pidPath)) {
            try {
                String pidStr = new String(Files.readAllBytes(pidPath)).trim();
                long pid = Long.parseLong(pidStr);

                String os = System.getProperty("os.name").toLowerCase();
                Process process;
                if (os.toLowerCase().contains("win")) {
                    // 윈도우: tasklist 명령어로 PID 검색
                    process = new ProcessBuilder("tasklist", "/FI", "PID eq " + pid).start();
                } else {
                    // 리눅스/유닉스: ps 명령어로 PID 검색
                    //process = new ProcessBuilder("ps", "-p", String.valueOf(pid)).start();
                    return false; // 리눅스/유닉스에서는 ps 명령어로 PID 검색을 하지 않음
                }

                try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        if (line.contains(String.valueOf(pid))) {
                            return true; // 실행 중인 프로세스 발견
                        }
                    }
                } finally {
                    process.destroy();
                }
            } catch (Exception e) {
                // 읽기 오류 또는 명령 실행 오류 → 실행 중 아님 처리
                System.out.println("Error checking if application is running: " + e.getMessage());
                return false;
            }
        }
        return false;
    }

}
