package utility

import (
	"gadmin/config"
	"strings"
	"time"

	"github.com/jinzhu/now"
)

func GetBeginAndEndOfDay(date string) (begin, end int64, err error) {
	t, err := now.Parse(date) // 2017-10-13 00:00:00, nil
	if err != nil {
		return
	}
	begin = now.With(t).BeginningOfDay().Unix()
	end = now.With(t).EndOfDay().Unix()
	return
}

func GetBeginAndEndOfDay2(day, endDay string) (begin, end int64, err error) {
	t, err := now.Parse(day) // 2017-10-13 00:00:00, nil
	if err != nil {
		return
	}

	t2, err := now.Parse(endDay) // 2017-10-13 00:00:00, nil
	if err != nil {
		return
	}
	begin = now.With(t).BeginningOfDay().Unix()
	end = now.With(t2).EndOfDay().Unix()
	return
}

func Format(date time.Time) string {
	return date.In(config.DefaultZone).Format("2006-01-02")
}

func FormatSecond(date time.Time) string {
	return date.In(config.DefaultZone).Format("2006-01-02 15:04:05")
}

func ParseDate(date string) string {
	if i := strings.Index(date, "T"); i > 0 {
		return date[:i]
	}
	return date
}

func ParseDateToTime(date string) time.Time {
	return now.MustParse(ParseDate(date))
}

func ParseUnixStamp(date string) int64 {
	if i := strings.Index(date, "T"); i > 0 {
		return now.MustParse(date[:i]).Unix()
	}
	return 0
}

func WeekByDate(t time.Time) (week int) {
	yearDay := t.YearDay()
	yearFirstDay := t.AddDate(0, 0, -yearDay+1)
	firstDayInWeek := int(yearFirstDay.Weekday())

	//今年第一周有几天
	firstWeekDays := 1
	if firstDayInWeek != 0 {
		firstWeekDays = 7 - firstDayInWeek + 1
	}

	if yearDay <= firstWeekDays {
		week = 1
	} else {
		week = (yearDay-firstWeekDays)/7 + 2
	}
	return week
}

func CurrentWeek() (week int) {
	_, week = time.Now().ISOWeek()
	return week
}

func WeekIndexDate() string {
	n := time.Now()
	offset := int(time.Monday - n.Weekday())
	if offset > 0 {
		offset = -6
	}

	weekStart := time.Date(n.Year(), n.Month(), n.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset)
	return weekStart.Format("20060102")
}

func GetYearDay2(tm *time.Time) int {
	return tm.Year()*1000 + tm.YearDay()
}

func GetDaysBetween2Date(format, date1Str, date2Str string) (int, error) {
	// 将字符串转化为Time格式
	date1, err := time.ParseInLocation(format, date1Str, time.Local)
	if err != nil {
		return 0, err
	}
	// 将字符串转化为Time格式
	date2, err := time.ParseInLocation(format, date2Str, time.Local)
	if err != nil {
		return 0, err
	}

	//计算相差天数
	if date1.Unix() > date2.Unix() {
		return int(date1.Sub(date2).Hours() / 24), nil
	} else {
		return int(date2.Sub(date1).Hours() / 24), nil
	}
}

func MaxTime(time1, time2 time.Time) time.Time {
	if time1.After(time2) {
		return time1
	}
	return time2
}
