package dateinterval

import (
	"testing"
	"time"

	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/utils/timeutils"
	"github.com/stretchr/testify/suite"
)

type TestSuite struct {
	suite.Suite
}

func TestDateInterval(t *testing.T) {
	suite.Run(t, new(TestSuite))
}

func (s *TestSuite) TestIsDisjoint() {
	assert := s.Assert()
	assert.False(IsDisjoint(
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 1, 31, 0, 0, 0, 0, time.UTC)),
		},
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 2, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 2, 28, 0, 0, 0, 0, time.UTC)),
		},
	))
	assert.True(IsDisjoint(
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 2, 2, 0, 0, 0, 0, time.UTC)),
		},
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 2, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 2, 28, 0, 0, 0, 0, time.UTC)),
		},
	))
	assert.True(IsDisjoint(
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   nil,
		},
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 2, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 2, 28, 0, 0, 0, 0, time.UTC)),
		},
	))
	assert.True(IsDisjoint(
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 2, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   timeutils.GetTimeAddr(time.Date(2023, 2, 28, 0, 0, 0, 0, time.UTC)),
		},
		forms.DateInterval{
			StartDate: timeutils.GetTimeAddr(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)),
			EndDate:   nil,
		},
	))
}
