
package savers

import (
	"fmt"
	"strings"

	"service-operation/types"
)

// Helper function to format bytes in a readable way
func FormatBytes(bytes int64) string {
	if bytes < 1024 {
		return fmt.Sprintf("%d B", bytes)
	} else if bytes < 1024*1024 {
		return fmt.Sprintf("%.1f KB", float64(bytes)/1024)
	} else {
		return fmt.Sprintf("%.1f MB", float64(bytes)/(1024*1024))
	}
}

// Helper function to create short error messages
func GetShortErrorMessage(errorMessage string) string {
	if errorMessage == "" {
		return "Unknown error"
	}
	
	errorLower := strings.ToLower(errorMessage)
	
	if strings.Contains(errorLower, "timeout") {
		return "Request timeout"
	} else if strings.Contains(errorLower, "connection refused") {
		return "Connection refused"
	} else if strings.Contains(errorLower, "dns") || strings.Contains(errorLower, "no such host") {
		return "DNS resolution failed"
	} else if strings.Contains(errorLower, "certificate") || strings.Contains(errorLower, "ssl") || strings.Contains(errorLower, "tls") {
		return "SSL certificate error"
	} else if strings.Contains(errorLower, "server error") || strings.Contains(errorLower, "internal server error") {
		return "Internal server error"
	} else if strings.Contains(errorLower, "not found") {
		return "Page not found"
	} else if strings.Contains(errorLower, "unauthorized") {
		return "Unauthorized access"
	} else if strings.Contains(errorLower, "forbidden") {
		return "Access forbidden"
	}
	
	// For other errors, take first 50 characters and clean it up
	shortMsg := errorMessage
	if len(shortMsg) > 50 {
		shortMsg = shortMsg[:50] + "..."
	}
	
	return shortMsg
}

func GetStatusString(success bool) string {
	if success {
		return "up"
	}
	return "down"
}

func FormatResultDetails(result *types.OperationResult) string {
	// This can be expanded based on operation type
	if result.Details != "" {
		return result.Details
	}
	
	switch result.Type {
	case types.OperationPing:
		if result.Success {
			return fmt.Sprintf("Ping successful - %d packets sent, %d received", result.PacketsSent, result.PacketsRecv)
		}
		return fmt.Sprintf("Ping failed - %s", result.Error)
	case types.OperationHTTP:
		if result.Success {
			return fmt.Sprintf("HTTP %d - Response time: %.2fms", result.HTTPStatusCode, float64(result.ResponseTime.Nanoseconds())/1000000)
		}
		return fmt.Sprintf("HTTP failed - %s", result.Error)
	case types.OperationDNS:
		if result.Success {
			return fmt.Sprintf("DNS %s query successful - %d records found", result.DNSType, len(result.DNSRecords))
		}
		return fmt.Sprintf("DNS query failed - %s", result.Error)
	default:
		return "Operation completed"
	}
}