package com.kamco.cd.training.common.service;

import java.nio.file.FileStore;
import java.nio.file.Files;
import java.nio.file.Path;

public class FormatStorage {

  private FormatStorage() {}

  /** 디스크 사용량 조회 */
  public static DiskUsage getDiskUsage(Path path) throws Exception {
    FileStore store = Files.getFileStore(path);

    long total = store.getTotalSpace();
    long usable = store.getUsableSpace();

    return new DiskUsage(path.toString(), total, usable);
  }

  /** 디스크 사용량 DTO */
  public record DiskUsage(String path, long totalBytes, long usableBytes) {

    public long usedBytes() {
      return totalBytes - usableBytes;
    }

    public double usedPercent() {
      return totalBytes == 0 ? 0.0 : (usedBytes() * 100.0) / totalBytes;
    }

    public String totalText() {
      return formatStorageSize(totalBytes);
    }

    public String usableText() {
      return formatStorageSize(usableBytes);
    }

    /** 저장공간을 사람이 읽기 좋은 단위로 변환 (GB / MB) */
    private static String formatStorageSize(long bytes) {
      double gb = bytes / 1024.0 / 1024 / 1024;
      if (gb >= 1) {
        return String.format("%.1f GB", gb);
      }
      double mb = bytes / 1024.0 / 1024;
      return String.format("%.0f MB", mb);
    }
  }
}
