package topology

import (
	"github.com/seaweedfs/seaweedfs/weed/glog"
	"github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding"
)

// CalculateTaskStorageImpact calculates storage impact for different task types
func CalculateTaskStorageImpact(taskType TaskType, volumeSize int64) (sourceChange, targetChange StorageSlotChange) {
	switch taskType {
	case TaskTypeErasureCoding:
		// EC task: distributes shards to MULTIPLE targets, source reserves with zero impact
		// Source reserves capacity but with zero StorageSlotChange (no actual capacity consumption during planning)
		// WARNING: EC has multiple targets! Use AddPendingTask with multiple destinations for proper multi-target handling
		// This simplified function returns zero impact; real EC requires specialized multi-destination calculation
		return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}

	case TaskTypeBalance:
		// Balance task: moves volume from source to target
		// Source loses 1 volume, target gains 1 volume
		return StorageSlotChange{VolumeSlots: -1, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}

	case TaskTypeVacuum:
		// Vacuum task: frees space by removing deleted entries, no slot change
		return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}

	case TaskTypeReplication:
		// Replication task: creates new replica on target
		return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}

	case TaskTypeECBalance:
		// EC balance task: moves individual shard from source to target
		// Source frees 1 shard slot, target gains 1 shard slot
		return StorageSlotChange{VolumeSlots: 0, ShardSlots: -1}, StorageSlotChange{VolumeSlots: 0, ShardSlots: 1}

	default:
		// Unknown task type, assume minimal impact
		glog.Warningf("unhandled task type %s in CalculateTaskStorageImpact, assuming default impact", taskType)
		return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}
	}
}

// CalculateECShardStorageImpact calculates storage impact for EC shards specifically
func CalculateECShardStorageImpact(shardCount int32, expectedShardSize int64) StorageSlotChange {
	// EC shards are typically much smaller than full volumes
	// Use shard-level tracking for granular capacity planning
	return StorageSlotChange{VolumeSlots: 0, ShardSlots: shardCount}
}

// CalculateECShardCleanupImpact calculates storage impact for cleaning up existing EC shards
func CalculateECShardCleanupImpact(originalVolumeSize int64) StorageSlotChange {
	// Cleaning up existing EC shards frees shard slots
	// Use the actual EC configuration constants for accurate shard count
	return StorageSlotChange{VolumeSlots: 0, ShardSlots: -int32(erasure_coding.TotalShardsCount)} // Negative = freed capacity
}
