package utils

import (
	"database/sql/driver"
	"time"
)

// FormatTime format time
type FormatTime string

// NewFormatTime net formatTime
func NewFormatTime(t time.Time) FormatTime {
	ft := new(FormatTime)
	ft.Scan(t)
	return *ft
}

// Scan scan time.
func (jt *FormatTime) Scan(src interface{}) (err error) {
	switch sc := src.(type) {
	case time.Time:
		*jt = FormatTime(sc.Format("2006-01-02 15:04:05"))
	case string:
		*jt = FormatTime(sc)
	}
	return
}

// Value get string value.
func (jt FormatTime) Value() (driver.Value, error) {
	return string(jt), nil
}

// TimeValue get time value.
func (jt FormatTime) TimeValue() time.Time {
	t, _ := time.ParseInLocation("2006-01-02 15:04:05", string(jt), time.Local)
	if t.Unix() <= 0 {
		t, _ = time.ParseInLocation("2006-01-02 15:04:05", "0000-00-00 00:00:00", time.Local)
	}
	return t
}

// UnmarshalJSON implement Unmarshaler
func (jt *FormatTime) UnmarshalJSON(data []byte) error {
	if data == nil || len(data) <= 1 {
		*jt = FormatTime("0000-00-00 00:00:00")
		return nil
	}
	str := string(data[1 : len(data)-1])
	st, err := time.Parse(time.RFC3339, str)
	if err == nil {
		*jt = FormatTime(st.Format("2006-01-02 15:04:05"))
	} else {
		*jt = FormatTime(str)
	}

	return nil
}
