package datetime

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

func ExampleAddDay() {
	now := time.Now()

	tomorrow := AddDay(now, 1)
	diff1 := tomorrow.Sub(now)

	yesterday := AddDay(now, -1)
	diff2 := yesterday.Sub(now)

	fmt.Println(diff1)
	fmt.Println(diff2)

	// Output:
	// 24h0m0s
	// -24h0m0s
}

func ExampleAddHour() {
	now := time.Now()

	after2Hours := AddHour(now, 2)
	diff1 := after2Hours.Sub(now)

	before2Hours := AddHour(now, -2)
	diff2 := before2Hours.Sub(now)

	fmt.Println(diff1)
	fmt.Println(diff2)

	// Output:
	// 2h0m0s
	// -2h0m0s
}

func ExampleAddMinute() {
	now := time.Now()

	after2Minutes := AddMinute(now, 2)
	diff1 := after2Minutes.Sub(now)

	before2Minutes := AddMinute(now, -2)
	diff2 := before2Minutes.Sub(now)

	fmt.Println(diff1)
	fmt.Println(diff2)

	// Output:
	// 2m0s
	// -2m0s
}

func ExampleAddYear() {
	now := time.Now()

	after1Year := AddYear(now, 1)
	diff1 := after1Year.Sub(now)

	before1Year := AddYear(now, -1)
	diff2 := before1Year.Sub(now)

	fmt.Println(diff1)
	fmt.Println(diff2)

	// Output:
	// 8760h0m0s
	// -8760h0m0s
}

func ExampleGetNowDate() {
	result := GetNowDate()

	expected := time.Now().Format("2006-01-02")

	fmt.Println(result == expected)

	// Output:
	// true
}

func ExampleGetNowTime() {
	result := GetNowTime()

	expected := time.Now().Format("15:04:05")

	fmt.Println(result == expected)

	// Output:
	// true
}

func ExampleGetNowDateTime() {
	result := GetNowDateTime()

	expected := time.Now().Format("2006-01-02 15:04:05")

	fmt.Println(result == expected)

	// Output:
	// true
}

// func ExampleGetZeroHourTimestamp() {
// 	ts := GetZeroHourTimestamp()

// 	fmt.Println(ts)

// 	// Output:
// 	// 1673107200
// }

// func ExampleGetNightTimestamp() {
// 	ts := GetNightTimestamp()

// 	fmt.Println(ts)

// 	// Output:
// 	// 1673193599
// }

func ExampleFormatTimeToStr() {
	datetime, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")

	result1 := FormatTimeToStr(datetime, "yyyy-mm-dd hh:mm:ss")
	result2 := FormatTimeToStr(datetime, "yyyy-mm-dd")
	result3 := FormatTimeToStr(datetime, "dd-mm-yy hh:mm:ss")
	result4 := FormatTimeToStr(datetime, "yyyy-mm-dd hh")

	fmt.Println(result1)
	fmt.Println(result2)
	fmt.Println(result3)
	fmt.Println(result4)

	// Output:
	// 2021-01-02 16:04:08
	// 2021-01-02
	// 02-01-21 16:04:08
	// 2021-01-02 16
}

func ExampleFormatStrToTime() {
	result1, _ := FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
	result2, _ := FormatStrToTime("2021-01-02", "yyyy-mm-dd")
	result3, _ := FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")

	fmt.Println(result1)
	fmt.Println(result2)
	fmt.Println(result3)

	// Output:
	// 2021-01-02 16:04:08 +0000 UTC
	// 2021-01-02 00:00:00 +0000 UTC
	// 2021-01-02 16:04:08 +0000 UTC
}

func ExampleBeginOfMinute() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfMinute(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 18:50:00 +0000 UTC
}

func ExampleEndOfMinute() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfMinute(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 18:50:59.999999999 +0000 UTC
}

func ExampleBeginOfHour() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfHour(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 18:00:00 +0000 UTC
}

func ExampleEndOfHour() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfHour(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 18:59:59.999999999 +0000 UTC
}

func ExampleBeginOfDay() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfDay(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 00:00:00 +0000 UTC
}

func ExampleEndOfDay() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfDay(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 23:59:59.999999999 +0000 UTC
}

func ExampleBeginOfWeek() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfWeek(input)

	fmt.Println(result)

	// Output:
	// 2023-01-08 00:00:00 +0000 UTC
}

func ExampleEndOfWeek() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfWeek(input)

	fmt.Println(result)

	// Output:
	// 2023-01-14 23:59:59.999999999 +0000 UTC
}

func ExampleBeginOfMonth() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfMonth(input)

	fmt.Println(result)

	// Output:
	// 2023-01-01 00:00:00 +0000 UTC
}

func ExampleEndOfMonth() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfMonth(input)

	fmt.Println(result)

	// Output:
	// 2023-01-31 23:59:59.999999999 +0000 UTC
}

func ExampleBeginOfYear() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := BeginOfYear(input)

	fmt.Println(result)

	// Output:
	// 2023-01-01 00:00:00 +0000 UTC
}

func ExampleEndOfYear() {
	input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)

	result := EndOfYear(input)

	fmt.Println(result)

	// Output:
	// 2023-12-31 23:59:59.999999999 +0000 UTC
}

func ExampleNewUnix() {
	result := NewUnix(1647597438)

	fmt.Println(result)

	// Output:
	// &{1647597438}
}

func ExampleNewUnixNow() {
	tm1 := NewUnixNow()

	unixTimestamp := tm1.ToUnix()

	tm2 := NewUnix(unixTimestamp)

	fmt.Println(reflect.DeepEqual(tm1, tm2))

	// Output:
	// true
}

// func ExampleNewFormat() {
// 	tm, err := NewFormat("2022-03-18 17:04:05")
// 	if err != nil {
// 		return
// 	}

// 	result := tm.ToFormat()

// 	fmt.Println(result)

// 	// Output:
// 	// 2022-03-18 17:04:05
// }

// func ExampleNewISO8601() {
// 	tm, err := NewISO8601("2006-01-02T15:04:05.999Z")
// 	if err != nil {
// 		return
// 	}

// 	result := tm.ToIso8601()

// 	fmt.Println(result)

// 	// Output:
// 	// 2006-01-02T23:04:05+08:00
// }

func ExampleIsLeapYear() {
	result1 := IsLeapYear(2000)
	result2 := IsLeapYear(2001)

	fmt.Println(result1)
	fmt.Println(result2)

	// Output:
	// true
	// false
}

func ExampleBetweenSeconds() {
	today := time.Now()
	tomorrow := AddDay(today, 1)
	yesterday := AddDay(today, -1)

	result1 := BetweenSeconds(today, tomorrow)
	result2 := BetweenSeconds(today, yesterday)

	fmt.Println(result1)
	fmt.Println(result2)

	// Output:
	// 86400
	// -86400
}

func ExampleDayOfYear() {
	date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
	result1 := DayOfYear(date1)

	date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
	result2 := DayOfYear(date2)

	date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
	result3 := DayOfYear(date3)

	fmt.Println(result1)
	fmt.Println(result2)
	fmt.Println(result3)

	// Output:
	// 31
	// 1
	// 0
}

func ExampleIsWeekend() {
	date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
	date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
	date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)

	result1 := IsWeekend(date1)
	result2 := IsWeekend(date2)
	result3 := IsWeekend(date3)

	fmt.Println(result1)
	fmt.Println(result2)
	fmt.Println(result3)

	// Output:
	// true
	// true
	// false
}
