package rest

import (
	"fmt"
	"reflect"
	"time"
)

// Time используется для формирования объекта времени из формата UnixMilli, а так же выгрузки в этот формат в результирующем объекте
type Time time.Time

// RestFields выгружает объект в результирующий объект в формат UnixMilli
func (s *Time) RestFields(fieldName string, names ...any) (any, IErrorArgs) {
	if len(names) > 0 {
		return nil, ErrorFiled(fmt.Sprintf("%v.%v", fieldName, names[0]), "field is not exists")
	}
	return time.Time(*s).UnixMilli(), nil
}

// RestFrom формирует из поля типа int64 объект времени
func (s *Time) RestFrom(source any) (err IErrorArgs) {
	defer func() {
		if r := recover(); r != nil {
			err = ErrorMessage("ErrParse", fmt.Sprintf("time: expected millisecond timestamp, given: %v", source))
		}
	}()
	rVal := reflect.ValueOf(source)
	*s = Time(time.UnixMilli(rVal.Int()))
	return
}

// Time возвращает объект времени типа time.Time
func (s *Time) Time() time.Time {
	return time.Time(*s)
}