package meetup

import "time"

const testVersion = 3

type WeekSchedule int

const (
	First WeekSchedule = iota
	Second
	Third
	Fourth
	Last
	Teenth
)

// Day calculates which day of the month the requested day falls on
func Day(week WeekSchedule, weekday time.Weekday, month time.Month, year int) int {
	var t time.Time
	switch week {
	case First:
		t = time.Date(year, month, 1, 0, 0, 0, 0, time.UTC)
		if t.Weekday() == weekday {
			return t.Day()
		}
	case Second:
		t = time.Date(year, month, 8, 0, 0, 0, 0, time.UTC)
		if t.Weekday() == weekday {
			return t.Day()
		}
	case Third:
		t = time.Date(year, month, 15, 0, 0, 0, 0, time.UTC)
		if t.Weekday() == weekday {
			return t.Day()
		}
	case Fourth:
		t = time.Date(year, month, 22, 0, 0, 0, 0, time.UTC)
		if t.Weekday() == weekday {
			return t.Day()
		}
	case Last:
		t = time.Date(year, month+1, 1, 0, 0, 0, 0, time.UTC)
		t = t.AddDate(0, 0, -1)
		if t.Weekday() == weekday {
			return t.Day()
		}
		return findPrevDay(weekday, t).Day()
	case Teenth:
		t = time.Date(year, month, 13, 0, 0, 0, 0, time.UTC)
		if t.Weekday() == weekday {
			return t.Day()
		}
	}
	return findNextDay(weekday, t).Day()
}

// findNextDay finds the next 'weekday' after t
func findNextDay(weekday time.Weekday, t time.Time) time.Time {
	t = t.AddDate(0, 0, 1)
	dow := t.Weekday()
	for ; dow != weekday; dow = t.Weekday() {
		t = t.AddDate(0, 0, 1)
	}
	return t
}

// findPrevDay finds the previous 'weekday' before t
func findPrevDay(weekday time.Weekday, t time.Time) time.Time {
	t = t.AddDate(0, 0, -1)
	dow := t.Weekday()
	for ; dow != weekday; dow = t.Weekday() {
		t = t.AddDate(0, 0, -1)
	}
	return t
}
