package br

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/schema"
)

func TestParseDailyBackupTimeUTC(t *testing.T) {
	tests := []struct {
		value    string
		expected int
		valid    bool
	}{
		{value: "00:00", expected: 0, valid: true},
		{value: "08:30", expected: 8*60 + 30, valid: true},
		{value: "23:59", expected: 23*60 + 59, valid: true},
		{value: "24:00"},
		{value: "08:60"},
		{value: "8:30"},
		{value: "08:30:00"},
		{value: ""},
	}

	for _, tt := range tests {
		t.Run(tt.value, func(t *testing.T) {
			minute, err := ParseDailyBackupTimeUTC(tt.value)
			if tt.valid {
				require.NoError(t, err)
				require.Equal(t, tt.expected, minute)
				return
			}
			require.Error(t, err)
		})
	}
}

func TestIsDailyBackupTime(t *testing.T) {
	schedule := schema.AutoSchedule{DailyBackupMinuteOfDay: 8*60 + 30}
	require.True(t, IsDailyBackupTime(time.Date(2026, 7, 1, 8, 30, 59, 0, time.UTC), schedule))
	require.False(t, IsDailyBackupTime(time.Date(2026, 7, 1, 8, 29, 59, 0, time.UTC), schedule))

	utcPlusEight := time.FixedZone("UTC+8", 8*60*60)
	require.True(t, IsDailyBackupTime(time.Date(2026, 7, 1, 16, 30, 0, 0, utcPlusEight), schedule))
}

func TestScheduleSlotForBackupTime(t *testing.T) {
	require.Equal(t,
		time.Date(2026, 7, 1, 8, 30, 0, 0, time.UTC),
		ScheduleSlotForBackupTime(
			time.Date(2026, 7, 1, 8, 31, 15, 0, time.UTC),
			schema.AutoSchedule{Type: "per-day", At: 8*60 + 30},
		),
	)
	require.Equal(t,
		time.Date(2026, 7, 1, 8, 30, 0, 0, time.UTC),
		ScheduleSlotForBackupTime(
			time.Date(2026, 7, 2, 8, 29, 59, 0, time.UTC),
			schema.AutoSchedule{Type: "per-day", At: 8*60 + 30},
		),
	)
	require.Equal(t,
		time.Date(2026, 7, 1, 9, 0, 0, 0, time.UTC),
		ScheduleSlotForBackupTime(
			time.Date(2026, 7, 1, 9, 1, 15, 0, time.UTC),
			schema.AutoSchedule{Type: "per-hour", At: 0},
		),
	)
	require.Equal(t,
		time.Date(2026, 7, 1, 8, 30, 0, 0, time.UTC),
		ScheduleSlotForBackupTime(
			time.Date(2026, 7, 1, 9, 29, 59, 0, time.UTC),
			schema.AutoSchedule{Type: "per-hour", At: 30},
		),
	)
}

func TestIsDailyBackupSlotForBackupTime(t *testing.T) {
	schedule := schema.AutoSchedule{
		Type:                   "per-hour",
		At:                     0,
		DailyBackupMinuteOfDay: 0,
	}
	require.True(t, IsDailyBackupSlotForBackupTime(time.Date(2026, 7, 1, 0, 1, 15, 0, time.UTC), schedule))
	require.False(t, IsDailyBackupSlotForBackupTime(time.Date(2026, 7, 1, 1, 1, 15, 0, time.UTC), schedule))
	require.True(t, IsDailyBackupSlotForBackupTime(
		time.Date(2026, 7, 1, 9, 1, 15, 0, time.UTC),
		schema.AutoSchedule{Type: "per-day", At: 9 * 60, DailyBackupMinuteOfDay: 9 * 60},
	))
}
