package domain

import (
	"encoding/json"
	"fmt"
	"time"
)

// Duration is a wrapper around time.Duration that can unmarshal from both
// string duration formats (like "168h") and nanosecond integers
type Duration struct {
	time.Duration
}

// UnmarshalJSON implements json.Unmarshaler interface
func (d *Duration) UnmarshalJSON(data []byte) error {
	// Try to unmarshal as string first (e.g., "168h", "24h", "30m")
	var str string
	if err := json.Unmarshal(data, &str); err == nil {
		duration, err := time.ParseDuration(str)
		if err != nil {
			return fmt.Errorf("invalid duration format: %s", str)
		}
		d.Duration = duration
		return nil
	}

	// Try to unmarshal as integer (nanoseconds)
	var ns int64
	if err := json.Unmarshal(data, &ns); err == nil {
		d.Duration = time.Duration(ns)
		return nil
	}

	return fmt.Errorf("duration must be either a string (e.g., '168h') or integer nanoseconds")
}

// MarshalJSON implements json.Marshaler interface
func (d Duration) MarshalJSON() ([]byte, error) {
	// Always marshal as nanoseconds for consistency
	return json.Marshal(int64(d.Duration))
}

// String returns the string representation of the duration
func (d Duration) String() string {
	return d.Duration.String()
}
