// TODO 미사용시작
package com.kamco.cd.training.postgres.core;

import com.kamco.cd.training.postgres.entity.SystemMetricsEntity;
import com.kamco.cd.training.postgres.repository.SystemMetricsRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class SystemMetricsCoreService {

  private final SystemMetricsRepository systemMetricsRepository;

  /**
   * 현재 사용 가능한 저장공간 조회 (MB 단위)
   *
   * @return 사용 가능한 저장공간 (MB)
   */
  public long getAvailableStorageMB() {
    SystemMetricsEntity latestMetrics =
        systemMetricsRepository
            .findLatestMetrics()
            .orElseThrow(() -> new IllegalStateException("시스템 메트릭 정보를 조회할 수 없습니다"));

    Long kbmemfree = latestMetrics.getKbmemfree();
    Long kbmemused = latestMetrics.getKbmemused();

    if (kbmemfree == null || kbmemused == null) {
      log.warn("시스템 메트릭에 메모리 정보가 없습니다");
      return 0L;
    }

    // 남은 용량 = kbmemfree - kbmemused (KB 단위)
    long availableKB = kbmemfree - kbmemused;

    // KB를 MB로 변환
    long availableMB = availableKB / 1024;

    log.info(
        "사용 가능한 저장공간: {}MB (kbmemfree: {}KB, kbmemused: {}KB)", availableMB, kbmemfree, kbmemused);

    return Math.max(0L, availableMB);
  }

  /**
   * 학습 실행 가능 여부 확인 (10GB 이상 필요)
   *
   * @return 학습 실행 가능 여부
   */
  public boolean isStorageAvailableForTraining() {
    long availableMB = getAvailableStorageMB();
    long requiredMB = 10 * 1024; // 10GB = 10,240MB

    boolean isAvailable = availableMB >= requiredMB;

    if (!isAvailable) {
      log.warn("저장공간 부족: 현재 {}MB, 필요 {}MB", availableMB, requiredMB);
    }

    return isAvailable;
  }
}
// TODO 미사용 끝
