package carbon

import (
	"testing"

	"github.com/stretchr/testify/suite"
)

type SeasonSuite struct {
	suite.Suite
}

func TestSeasonSuite(t *testing.T) {
	suite.Run(t, new(SeasonSuite))
}

func (s *SeasonSuite) TestSeason() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.Empty(c.Season())
	})

	s.Run("zero carbon", func() {
		s.Equal(Winter, NewCarbon().Season())
	})

	s.Run("empty carbon", func() {
		s.Empty(Parse("").Season())
	})

	s.Run("error carbon", func() {
		s.Empty(Parse("xxx").Season())
	})

	s.Run("error resources", func() {
		lang := NewLanguage()
		lang.SetResources(map[string]string{
			"seasons": "xxx",
		})
		c := Now().SetLanguage(lang)
		s.Empty(c.Season())
	})

	s.Run("valid carbon", func() {
		s.Equal(Winter, Parse("2020-01-05").Season())
		s.Equal(Winter, Parse("2020-02-05").Season())
		s.Equal(Spring, Parse("2020-03-05").Season())
		s.Equal(Spring, Parse("2020-04-05").Season())
		s.Equal(Spring, Parse("2020-05-05").Season())
		s.Equal(Summer, Parse("2020-06-05").Season())
		s.Equal(Summer, Parse("2020-07-05").Season())
		s.Equal(Summer, Parse("2020-08-05").Season())
		s.Equal(Autumn, Parse("2020-09-05").Season())
		s.Equal(Autumn, Parse("2020-10-05").Season())
		s.Equal(Autumn, Parse("2020-11-05").Season())
		s.Equal(Winter, Parse("2020-12-05").Season())
	})
}

func (s *SeasonSuite) TestStartOfSeason() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.Nil(c.StartOfSeason())
	})

	s.Run("zero carbon", func() {
		s.Equal("0000-12-01 00:00:00 +0000 UTC", NewCarbon().StartOfSeason().ToString())
	})

	s.Run("empty carbon", func() {
		s.Empty(Parse("").StartOfSeason().ToString())
	})

	s.Run("error carbon", func() {
		s.Error(Parse("xxx").StartOfSeason().Error)
	})

	s.Run("valid carbon", func() {
		s.Equal("2019-12-01 00:00:00 +0000 UTC", Parse("2020-01-15").StartOfSeason().ToString())
		s.Equal("2019-12-01 00:00:00 +0000 UTC", Parse("2020-02-15").StartOfSeason().ToString())
		s.Equal("2020-03-01 00:00:00 +0000 UTC", Parse("2020-03-15").StartOfSeason().ToString())
		s.Equal("2020-03-01 00:00:00 +0000 UTC", Parse("2020-04-15").StartOfSeason().ToString())
		s.Equal("2020-03-01 00:00:00 +0000 UTC", Parse("2020-05-15").StartOfSeason().ToString())
		s.Equal("2020-06-01 00:00:00 +0000 UTC", Parse("2020-06-15").StartOfSeason().ToString())
		s.Equal("2020-06-01 00:00:00 +0000 UTC", Parse("2020-07-15").StartOfSeason().ToString())
		s.Equal("2020-06-01 00:00:00 +0000 UTC", Parse("2020-08-15").StartOfSeason().ToString())
		s.Equal("2020-09-01 00:00:00 +0000 UTC", Parse("2020-09-15").StartOfSeason().ToString())
		s.Equal("2020-09-01 00:00:00 +0000 UTC", Parse("2020-10-15").StartOfSeason().ToString())
		s.Equal("2020-09-01 00:00:00 +0000 UTC", Parse("2020-11-15").StartOfSeason().ToString())
		s.Equal("2020-12-01 00:00:00 +0000 UTC", Parse("2020-12-15").StartOfSeason().ToString())
	})
}

func (s *SeasonSuite) TestEndOfSeason() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.Nil(c.EndOfSeason())
	})

	s.Run("zero carbon", func() {
		s.Equal("0001-02-28 23:59:59.999999999 +0000 UTC", NewCarbon().EndOfSeason().ToString())
	})

	s.Run("empty carbon", func() {
		s.Empty(Parse("").EndOfSeason().ToString())
	})

	s.Run("error carbon", func() {
		s.Error(Parse("xxx").EndOfSeason().Error)
	})

	s.Run("valid carbon", func() {
		s.Equal("2020-02-29 23:59:59.999999999 +0000 UTC", Parse("2020-01-15").EndOfSeason().ToString())
		s.Equal("2020-02-29 23:59:59.999999999 +0000 UTC", Parse("2020-02-15").EndOfSeason().ToString())
		s.Equal("2020-05-31 23:59:59.999999999 +0000 UTC", Parse("2020-03-15").EndOfSeason().ToString())
		s.Equal("2020-05-31 23:59:59.999999999 +0000 UTC", Parse("2020-04-15").EndOfSeason().ToString())
		s.Equal("2020-05-31 23:59:59.999999999 +0000 UTC", Parse("2020-05-15").EndOfSeason().ToString())
		s.Equal("2020-08-31 23:59:59.999999999 +0000 UTC", Parse("2020-06-15").EndOfSeason().ToString())
		s.Equal("2020-08-31 23:59:59.999999999 +0000 UTC", Parse("2020-07-15").EndOfSeason().ToString())
		s.Equal("2020-08-31 23:59:59.999999999 +0000 UTC", Parse("2020-08-15").EndOfSeason().ToString())
		s.Equal("2020-11-30 23:59:59.999999999 +0000 UTC", Parse("2020-09-15").EndOfSeason().ToString())
		s.Equal("2020-11-30 23:59:59.999999999 +0000 UTC", Parse("2020-10-15").EndOfSeason().ToString())
		s.Equal("2020-11-30 23:59:59.999999999 +0000 UTC", Parse("2020-11-15").EndOfSeason().ToString())
		s.Equal("2021-02-28 23:59:59.999999999 +0000 UTC", Parse("2020-12-15").EndOfSeason().ToString())
	})
}

func (s *SeasonSuite) TestIsSpring() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.False(c.IsSpring())
	})

	s.Run("zero carbon", func() {
		s.False(NewCarbon().IsSpring())
	})

	s.Run("empty carbon", func() {
		s.False(Parse("").IsSpring())
	})

	s.Run("error carbon", func() {
		s.False(Parse("xxx").IsSpring())
	})

	s.Run("valid carbon", func() {
		s.False(Parse("2020-01-01").IsSpring())
		s.True(Parse("2020-03-01").IsSpring())
	})
}

func (s *SeasonSuite) TestIsSummer() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.False(c.IsSummer())
	})

	s.Run("zero carbon", func() {
		s.False(NewCarbon().IsSummer())
	})

	s.Run("empty carbon", func() {
		s.False(Parse("").IsSummer())
	})

	s.Run("error carbon", func() {
		s.False(Parse("xxx").IsSummer())
	})

	s.Run("valid carbon", func() {
		s.False(Parse("2020-01-01").IsSummer())
		s.True(Parse("2020-06-01").IsSummer())
	})
}

func (s *SeasonSuite) TestIsAutumn() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.False(c.IsAutumn())
	})

	s.Run("zero carbon", func() {
		s.False(NewCarbon().IsAutumn())
	})

	s.Run("empty carbon", func() {
		s.False(Parse("").IsAutumn())
	})

	s.Run("error carbon", func() {
		s.False(Parse("xxx").IsAutumn())
	})

	s.Run("valid carbon", func() {
		s.False(Parse("2020-01-01").IsAutumn())
		s.True(Parse("2020-09-01").IsAutumn())
	})
}

func (s *SeasonSuite) TestIsWinter() {
	s.Run("nil carbon", func() {
		var c *Carbon
		c = nil
		s.False(c.IsWinter())
	})

	s.Run("zero carbon", func() {
		s.True(NewCarbon().IsWinter())
	})

	s.Run("empty carbon", func() {
		s.False(Parse("").IsWinter())
	})

	s.Run("error carbon", func() {
		s.False(Parse("xxx").IsWinter())
	})

	s.Run("valid carbon", func() {
		s.True(Parse("2020-01-01").IsWinter())
		s.False(Parse("2020-05-01").IsWinter())
	})
}