package filesystem

import (
	"fmt"
	"os/exec"
	"path/filepath"
	"runtime"
	"time"
)

// ========== 辅助函数 ==========

// OpenPath 打开文件或目录（使用系统默认程序）
func OpenPath(path string) error {
	// 使用 path.validator 进行验证
	validator := NewPathValidator(DefaultConfig())
	if err := validator.Validate(path); err != nil && err.IsError {
		return fmt.Errorf("路径不安全: %w", err)
	}

	path = filepath.Clean(path)

	var cmd *exec.Cmd

	switch runtime.GOOS {
	case "windows":
		// Windows: 使用 rundll32 打开文件（更可靠）
		// 这种方式比 cmd start 更稳定，支持所有文件类型
		cmd = exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", path)
	case "darwin":
		// macOS: 使用 open 命令
		cmd = exec.Command("open", path)
	case "linux":
		// Linux: 使用 xdg-open 命令
		cmd = exec.Command("xdg-open", path)
	default:
		return fmt.Errorf("不支持的操作系统")
	}

	// 启动命令（不等待完成）
	if err := cmd.Start(); err != nil {
		return fmt.Errorf("打开文件失败: %v", err)
	}

	// 给进程一点时间启动
	go func() {
		time.Sleep(100 * time.Millisecond)
		cmd.Process.Release()
	}()

	return nil
}

// ========== 工具函数 ==========

// FormatBytes 格式化字节大小为人类可读格式（导出供 sftp 等外部包使用）
func FormatBytes(bytes int64) string {
	const unit = 1024
	if bytes < unit {
		return fmt.Sprintf("%d B", bytes)
	}
	div, exp := int64(unit), 0
	for n := bytes / unit; n >= unit; n /= unit {
		div *= unit
		exp++
	}
	return fmt.Sprintf("%.2f %cB", float64(bytes)/float64(div), "KMGTPE"[exp])
}
