package date

import (
	"strconv"
	"strings"
	"time"
)

type Date struct {
}

const (
	year            = "2006"
	month           = "01"
	day             = "02"
	hour            = "15"
	minute          = "04"
	second          = "05"
	complete        = "2006-01-02 15:05:05"
	stringToTimeOne = "2006-01-02 15:04:05"
	stringToTimeTow = "2006-01-02"
)

// FormatToString 时间格式化成字符串  Time forms a string
func (d *Date) FormatToString(t time.Time, s string) string {
	replace, b := d.replace(s)
	if !b {
		return t.Format(complete)
	}
	if d.IsZero(t) {
		return d.Now().Format(complete)
	}
	return t.Format(replace)
}

//字符串替换
func (d *Date) replace(s string) (string, bool) {
	flag := false
	if strings.Contains(s, "YYYY") {
		s = strings.Replace(s, "YYYY", year, 1)
		flag = true
	}
	if strings.Contains(s, "MM") {
		s = strings.Replace(s, "MM", month, 1)
		flag = true
	}
	if strings.Contains(s, "DD") {
		s = strings.Replace(s, "DD", day, 1)
		flag = true
	}
	if strings.Contains(s, "hh") {
		s = strings.Replace(s, "hh", hour, 1)
		flag = true
	}
	if strings.Contains(s, "mm") {
		s = strings.Replace(s, "mm", minute, 1)
		flag = true
	}
	if strings.Contains(s, "ss") {
		s = strings.Replace(s, "ss", second, 1)
		flag = true
	}
	return s, flag
}

// IsZero 判断时间是否为零 Determine whether the time is zero
func (d *Date) IsZero(t time.Time) bool {
	return t.IsZero()
}

// Now 获取当前时间  Get the current time
func (d *Date) Now() time.Time {
	return time.Now()
}

// InterpretStringToTimestamp String to timestamp 字符串转时间戳
func (d *Date) InterpretStringToTimestamp(time_str string, strFormat string) (int64, error) {
	var t int64
	loc, _ := time.LoadLocation("Local")
	replace, _ := d.replace(strFormat)
	t1, err := time.ParseInLocation(replace, time_str, loc)
	if err != nil {
		return 0, err
	}
	t = t1.Unix()
	return t, err
}

// UnixToTime 时间戳转时间
// UnixToTime timestamp to time
func (d *Date) UnixToTime(unix int64) time.Time {
	return time.Unix(unix, 0)
}

// GetWeekDay 获取周几方法
//How to get the day of the week
func (d *Date) GetWeekDay(t time.Time) int {
	return int(t.Weekday())
}

// MinuteAddOrSub 时间分钟加减计算
func (d *Date) MinuteAddOrSub(t time.Time, num int64) time.Time {
	s := strconv.FormatInt(num, 10)
	var m time.Duration
	m, _ = time.ParseDuration(s + "m")
	return t.Add(m)
}

// HourAddOrSub 时间小时加减计算
func (d *Date) HourAddOrSub(t time.Time, num int64) time.Time {
	s := strconv.FormatInt(num, 10)
	var m time.Duration
	m, _ = time.ParseDuration(s + "h")
	return t.Add(m)
}

// DayAddOrSub 时间天加减计算
func (d *Date) DayAddOrSub(t time.Time, num int64) time.Time {
	num = num * 24
	s := strconv.FormatInt(num, 10)
	var m time.Duration
	m, _ = time.ParseDuration(s + "h")
	return t.Add(m)
}