// Package with the mostly static content (models) of this microservice
package models

import (
	"fmt"
	"strconv"
	"time"
)

// Duration is a TOML datatype
// A duration string is a possibly signed sequence of decimal numbers  and a unit suffix,
// such as "300s", "1.5h" or "5d". Valid time units are "s", "m", "h", "d", "w".
type Duration struct {
	time.Duration
}

// Function UnmarshalTOML parses a duration string
func (d *Duration) UnmarshalTOML(dataInterface interface{}) error {
	var data string
	switch dataInterface.(type) {
	case string:
		data = dataInterface.(string)
	default:
		return fmt.Errorf("invalid duration: \"%s\"", dataInterface)
	}
	// " + int + unit + "
	if len(data) < 2 {
		return fmt.Errorf("invalid duration: \"%s\"", data)
	}

	unit := data[len(data)-1]
	value, err := strconv.Atoi(string(data[:len(data)-1]))
	if err != nil {
		return fmt.Errorf("unable to parse duration %s: %s", data, err)
	}

	switch unit {
	case 's':
		d.Duration = time.Duration(value) * time.Second
	case 'm':
		d.Duration = time.Duration(value) * time.Minute
	case 'h':
		d.Duration = time.Duration(value) * time.Hour
	case 'd':
		d.Duration = time.Duration(value) * time.Hour * 24
	case 'w':
		d.Duration = time.Duration(value) * time.Hour * 24 * 7
	case 'y':
		d.Duration = time.Duration(value) * time.Hour * 24 * 365
	default:
		return fmt.Errorf("invalid duration unit: %s", string(unit))
	}

	return nil
}
