package util

import (
	"strconv"
	"time"
)

// Duration is a wrapper around time.Duration that supports
// marshalling stringified duration on JSON.
type Duration struct {
	time.Duration
}

// UnmarshalJSON unmarshals duration string into its value.
func (d *Duration) UnmarshalJSON(b []byte) error {
	if len(b) == 0 {
		d.Duration = time.Duration(0)
		return nil
	}

	rawDuration, err := strconv.Unquote(string(b))
	if err != nil {
		return err
	}

	duration, err := time.ParseDuration(rawDuration)
	if err != nil {
		return err
	}

	d.Duration = duration
	return nil
}

// MarshalJSON returns the JSON representation of the duration.
func (d *Duration) MarshalJSON() ([]byte, error) {
	return []byte(strconv.Quote(d.String())), nil
}

// FormatJiraTime formats the time for jira
func FormatJiraTime(t time.Time) string {
	return t.Format("2006-01-02T15:04:05.0-0700")
}
