import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Locale;

public class Main {
	public static void main(String[] args) {
		// Test
		System.out.println(getWeeks(2021, 7, new Locale("pt", "BR")));

		System.out.println("---------------------------------------------------------");

		System.out.println(getWeeks(2021, 2, new Locale("pt", "BR")));

		System.out.println("---------------------------------------------------------");

		System.out.println(getWeeks(2021, 7, new Locale("en", "GB")));

		System.out.println("---------------------------------------------------------");

		System.out.println(getWeeks(2021, 2, new Locale("en", "GB")));
	}

	static String getWeeks(int year, int month, Locale locale) {
		DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
		LocalDate firstDateOfMonth = LocalDate.of(year, month, 1);
		String monthName = Month.of(month).getDisplayName(TextStyle.FULL, Locale.ENGLISH);
		int lastDayOfMonth = firstDateOfMonth.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();

		int firstDay = 1;
		int lastDayOfFirstWeek = LocalDate.of(year, month, 1).with(TemporalAdjusters.nextOrSame(firstDayOfWeek))
				.getDayOfMonth();
		int lastDay = lastDayOfFirstWeek == 1 ? 7 : lastDayOfFirstWeek - 1;

		int i;
		StringBuilder sb = new StringBuilder();

		for (i = 1; i <= lastDayOfMonth / 7; i++) {
			sb.append(String.format("Year %d - Month %d (%s) - Week %d - First day: %d - Last Day: %d%n", year, month,
					monthName, i, firstDay, lastDay));
			firstDay = lastDay + 1;
			lastDay += 7;
		}

		if (lastDayOfFirstWeek != 1 && lastDayOfMonth >= 28)
			sb.append(String.format("Year %d - Month %d (%s) - Week %d - First day: %d - Last Day: %d%n", year, month,
					monthName, i, firstDay, lastDayOfMonth));

		return sb.toString();
	}
}