/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	// Перечесление месяцев
	enum Month
	{
	 	January,
	 	February,
	 	March,
	 	April,
	 	May,
	 	June,
	 	July,
	 	August,
	 	September,
	 	October,
	 	November,
	 	December
	}
	
	private static Month _month = Month.January;
	private static float[][] _monthTemp = new float[12][31];
	private static boolean _firstRun = false;
	
	public static void main (String[] args) throws java.lang.Exception
	{
		GenerateTemp();
		Scanner in = new Scanner(System.in);
		String input;
		String[] command;
		while(true)
		{
			System.out.println("Доступные команды:");
			System.out.println("all - получить информацию о всех месяцах");
			System.out.println("generate - выполнить генерацию новых значений для дней и месяцев");
			
			System.out.println("month - переключить режим на ввод месяцев");
			System.out.println("exit - выйти из программы");
			input = in.nextLine(); // получаем текст
			command = input.split(" "); // разбиваем его на подстроки
			// Определяем, что будем делать с коммандами
			switch (command[0])
			{
				case "all":
				{
					InfoAllTemp(); // получаем информацию за все месяца сразу
				}
				break;
				case "generate":
				{
					GenerateTemp(); // генерируем данные по темературе по новому
				}
				break;
				case "month":
				{
				
					try
					{
						Month _temp = _month.valueOf(command[1]);
						GetMonthInfo(_temp.ordinal()); // получаем информацию только об одном месяце
				 	
					}
					catch(RuntimeException e)
					{
						System.out.println("Название месяца введено некорректно!\nПожалуйста, повторите ввод!");
					}
				}
				break;
				case "exit":
				{
					System.exit(0); // выходим из программы
				}
				break;
				default:
				{
					System.out.println("Введенной команды не существует\nПовторите ввод снова!");
				}
				break;
			}
		}
		
	}
	
	public static void GetMonthInfo(int month)
	{
		Month temp[] = Month.values();
		System.out.println("-----------------------------------------");
        System.out.println("Месяц: " + temp[month].toString());
        System.out.println("Количество дней: " + GetDayCount(month));
        System.out.println("Средняя температура: " + GetMediumTemp(month));
        System.out.println("Дневная температура, ниже среднемесячной:");
		for (int countDay = 0; countDay < GetDayCount(month); countDay++)
        {
        	if (_monthTemp[month][countDay] < GetMediumTemp(month))
        	{
				System.out.println(countDay+1 + " числа" + ": " + _monthTemp[month][countDay]);
        	} 
        }
        System.out.println("\nДневная температура, выше среднемесячной:");
        for (int countDay = 0; countDay < GetDayCount(month); countDay++)
        {
        	
        	if (_monthTemp[month][countDay] > GetMediumTemp(month))
        	{
				System.out.println(countDay+1 + " числа" + ": " + _monthTemp[month][countDay]);
        	} 
        }
        System.out.println("-----------------------------------------");
	}
	
	public static void GenerateTemp()
	{
        for (int countMonth = 0; countMonth < _monthTemp.length; countMonth++)
        {
        	for (int countDay = 0; countDay < GetDayCount(countMonth); countDay++)
        	{
        		// Генерируем температуру по дням для всех дней каждого месяца
        		// При необходимости, достаточно будет поменять эту строчку на пользовательский ввод
        		_monthTemp[countMonth][countDay] = 10 + (float)(Math.random() * ((30 - 10)));
        		
        	}
        }
        // Блок не допускает вывода строки при первом запуске 
        if (!_firstRun)
        {
        	_firstRun = true;
        } else
        {
        	System.out.println("Генерация новых значений завершена!\n");
        	
        }
	}
	
	public static void InfoAllTemp()
	{
			Month temp[] = Month.values();
			for (int countMonth = 0; countMonth < _monthTemp.length; countMonth++)
        	{
        		System.out.println("-----------------------------------------");
        		System.out.println("Месяц: " + temp[countMonth].toString());
        		System.out.println("Количество дней: " + GetDayCount(countMonth));
        		System.out.println("Средняя температура: " + GetMediumTemp(countMonth));
        		System.out.println("-----------------------------------------");
        	}
	}
	
	public static float GetMediumTemp(int month)
	{
		float mediumTemp = 0;
        for (int countDay = 0; countDay < GetDayCount(month); countDay++)
        {
        	// Суммируем температуры всех дней заданного месяца
        	mediumTemp += _monthTemp[month][countDay] + 1; 
        }
        // Возвращаем среднее значение
        return mediumTemp / GetDayCount(month);
	}
	
	public static int GetDayCount(int month)
	{
		int day = 0;
		Month temp[] = Month.values();
		// Получаем число дней в месяце
		switch(temp[month].toString())
        	{
        		case "April":
        		case "June":
        		case "September":
        		case "November":
        		day = 30;
        		break;
        		case "February":
        		day = 28;
        		break;
        		default:
        		day = 31;
        		break;
        	}
        	
        return day;
	}
}


