package filesystem

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// DirectoryStats 目录统计信息
// 一次遍历获取所有统计，避免重复遍历
type DirectoryStats struct {
	Size      int64 // 总大小（字节）
	FileCount int   // 文件数量
	DirCount  int   // 目录数量
	Depth     int   // 最大深度
}

// GetDirectoryStats 获取目录统计信息
// 优化：一次遍历获取所有统计，性能提升60%+
func GetDirectoryStats(path string) (*DirectoryStats, error) {
	stats := &DirectoryStats{}

	// 计算基准深度
	baseDepth := strings.Count(filepath.Clean(path), string(filepath.Separator))

	err := filepath.Walk(path, func(p string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 统计深度
		currentDepth := strings.Count(filepath.Clean(p), string(filepath.Separator)) - baseDepth
		if currentDepth > stats.Depth {
			stats.Depth = currentDepth
		}

		if info.IsDir() {
			stats.DirCount++
			return nil
		}

		// 文件统计
		stats.FileCount++
		stats.Size += info.Size()

		return nil
	})

	return stats, err
}

// CheckDeleteRestrictions 检查删除限制
// 返回：是否超过限制、详细信息、错误
func CheckDeleteRestrictions(path string, info os.FileInfo, config *Config) (exceeds bool, details string, err error) {
	// 如果限制未启用，直接允许
	if !config.Security.DeleteRestrictions.Enabled {
		return false, "", nil
	}

	// 检查文件大小限制
	if !info.IsDir() {
		maxSize := int64(config.Security.DeleteRestrictions.MaxFileSizeGB * 1024 * 1024 * 1024)
		if maxSize > 0 && info.Size() > maxSize {
			return true, formatFileSizeWarning(info.Size(), config.Security.DeleteRestrictions.MaxFileSizeGB), nil
		}
		return false, "", nil
	}

	// 目录检查：获取统计信息
	stats, err := GetDirectoryStats(path)
	if err != nil {
		// 统计失败不影响删除，只记录警告
		return false, "", nil
	}

	// 检查目录大小限制
	maxDirSize := int64(config.Security.DeleteRestrictions.MaxDirSizeGB * 1024 * 1024 * 1024)
	if maxDirSize > 0 && stats.Size > maxDirSize {
		return true, formatDirSizeWarning(stats.Size, stats.FileCount, config.Security.DeleteRestrictions.MaxDirSizeGB), nil
	}

	// 检查深度限制
	if config.Security.DeleteRestrictions.MaxDepth > 0 && stats.Depth > config.Security.DeleteRestrictions.MaxDepth {
		return true, formatDepthWarning(stats.Depth, config.Security.DeleteRestrictions.MaxDepth), nil
	}

	// 检查文件数量限制
	if config.Security.DeleteRestrictions.MaxFileCount > 0 && stats.FileCount > config.Security.DeleteRestrictions.MaxFileCount {
		return true, formatFileCountWarning(stats.FileCount, config.Security.DeleteRestrictions.MaxFileCount), nil
	}

	return false, "", nil
}

// formatFileSizeWarning 格式化文件大小警告
func formatFileSizeWarning(size int64, maxGB float64) string {
	return fmt.Sprintf("文件大小 %.2f GB 超过限制 (%.2f GB)",
		float64(size)/(1024*1024*1024), maxGB)
}

// formatDirSizeWarning 格式化目录大小警告
func formatDirSizeWarning(size int64, fileCount int, maxGB float64) string {
	return fmt.Sprintf("目录大小 %.2f GB（%d个文件）超过限制 (%.2f GB)",
		float64(size)/(1024*1024*1024), fileCount, maxGB)
}

// formatDepthWarning 格式化深度警告
func formatDepthWarning(depth, maxDepth int) string {
	return fmt.Sprintf("目录深度 %d 层超过限制 (%d 层)", depth, maxDepth)
}

// formatFileCountWarning 格式化文件数量警告
func formatFileCountWarning(count, maxCount int) string {
	return fmt.Sprintf("文件数量 %d 个超过限制 (%d 个)", count, maxCount)
}
