using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media.TextFormatting;
using ColorTextBlock.Avalonia;
using MsBox.Avalonia;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.Intrinsics.Arm;
using System.Xml.Linq;
using Tmds.DBus.Protocol;
namespace task4_styles_second
{
public partial class MainWindow : Window
{
public MainWindow()
{
try
{
InitializeComponent();
dpBirthday.MaxYear = maxDate;
checkBD.IsVisible = false;
sign.IsVisible = false;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
public DateTime maxDate = System.DateTime.Now;
///
/// Вычисление знака зодиака и животного по восточному гороскопу (вызов функций и вывод на экран)
///
///
///
private void DoHoroskope(object sender, RoutedEventArgs e)
{
sign.Text = ""; //каждый раз при выборе одного из вариантов гороскопа поле со значением гороскопа очищается
if ((rb1.IsChecked == true || rb2.IsChecked == true) && dpBirthday.SelectedDate is null) checkBD.IsVisible = true; //вывод предупреждения если дата рождения не заполнена
else if (rb1.IsChecked == true)
{
sign.Text = ZodiakSign(DateTime.Parse(dpBirthday.SelectedDate.ToString()));
sign.IsVisible = true;
}
else
{
sign.Text = ChineseHoroskope(DateTime.Parse(dpBirthday.SelectedDate.ToString()));
sign.IsVisible = true;
}
}
///
/// Метод с вычислением части 1 задания
///
///
///
private void TimeCount(object sender, RoutedEventArgs e)
{
rb1.IsChecked = false;
rb2.IsChecked = false;
sign.Text = "";
tbLeapYears.Text = "";
checkBD.IsVisible = false;
string date = dpBirthday.SelectedDate.ToString();
int days = 1, months = 1, years = 1;
DateTime birthdayDate = DateTime.MinValue;
if (date != "")
{
birthdayDate = Convert.ToDateTime(date);
years = DateTime.Now.Year - birthdayDate.Year;
months = DateTime.Now.Month - birthdayDate.Month;
days = DateTime.Now.Day - birthdayDate.Day;
}
else
{
checkBD.IsVisible = true;
return;
}
if (days < 0)
{
months--;
if (DateTime.Now.Month > 1) days += DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month - 1);
else days += DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
}
if (months < 0)
{
years--;
months += 12;
}
tbCount.Text = years + " лет, " + months + " месяцев, " + days + " дней";
tbDayWeek.Text = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[Convert.ToInt32(birthdayDate.DayOfWeek)]
+ ", \nтакие же дни недели выпадали\n " + CountDaysWeek(birthdayDate) + " раз";
tbLeapYearsCount.Text = " " + LeapYears(birthdayDate).Count;
if (LeapYears(birthdayDate).Count == 0) tbLeapYears.Text += "Високосные года отсутствуют";
else
{
for (int i = 0; i < LeapYears(birthdayDate).Count; i++)
{
if (i != 0 && i % 5 == 0)
{
tbLeapYears.Text += "\n";
}
tbLeapYears.Text += LeapYears(birthdayDate)[i] + " ";
}
}
Console.WriteLine();
}
///
/// Метод определения животного (и стихии) по восточному гороскопу
///
/// Дата рождения
/// Животное определенной стихии
string ChineseHoroskope(DateTime birthdayDate)
{
string[] animals =
{
"Крыса", // 0
"Бык", // 1
"Тигр", // 2
"Кролик", // 3
"Дракон", // 4
"Змея", // 5
"Лошадь", // 6
"Коза", // 7
"Обезьяна", // 8
"Петух", // 9
"Собака", // 10
"Свинья" // 11
};
string[] elements =
{
" стихии металл", // 0 или 1
" стихии вода", // 2 или 3
" стихии дерево", // 4 или 5
" стихии огонь", // 6 или 7
" стихии земля" // 8 или 9
};
int indexAnimal = (birthdayDate.Year - 4) % 12;
int indexElement = (birthdayDate.Year % 10) / 2;
return animals[indexAnimal] + elements[indexElement];
}
///
/// Определение знака зодиака
///
/// Дата рождения
/// Знак зодиака
string ZodiakSign(DateTime birthdayDate)
{
int month = birthdayDate.Month;
int day = birthdayDate.Day;
if ((month == 3 && day >= 21) || (month == 4 && day <= 19))
return "Овен";
else if ((month == 4 && day >= 20) || (month == 5 && day <= 20))
return "Телец";
else if ((month == 5 && day >= 21) || (month == 6 && day <= 20))
return "Близнецы";
else if ((month == 6 && day >= 21) || (month == 7 && day <= 22))
return "Рак";
else if ((month == 7 && day >= 23) || (month == 8 && day <= 22))
return "Лев";
else if ((month == 8 && day >= 23) || (month == 9 && day <= 22))
return "Дева";
else if ((month == 9 && day >= 23) || (month == 10 && day <= 22))
return "Весы";
else if ((month == 10 && day >= 23) || (month == 11 && day <= 21))
return "Скорпион";
else if ((month == 11 && day >= 22) || (month == 12 && day <= 21))
return "Стрелец";
else if ((month == 12 && day >= 22) || (month == 1 && day <= 19))
return "Козерог";
else if ((month == 1 && day >= 20) || (month == 2 && day <= 18))
return "Водолей";
else if ((month == 2 && day >= 19) || (month == 3 && day <= 20))
return "Рыбы";
else
return "Неверная дата";
}
///
/// Метод определения количества дня рождений, которые человек отпраздновал в тот же день недели за всю жизнь
///
/// Дата рождения
/// Количество дней
int CountDaysWeek(DateTime birthdayDate)
{
int numDays = 0;
for (int i = birthdayDate.Year + 1; i <= DateTime.Now.Year; i++)
{
if (new DateTime(i, birthdayDate.Month, birthdayDate.Day).DayOfWeek == birthdayDate.DayOfWeek) numDays++;
}
return numDays;
}
///
/// Метод определения списка високосных лет, прошедших со дня рождения человека
///
/// Дата рождения
/// Лист с високосными годами
List LeapYears(DateTime birthdayDate)
{
int numYears = 0;
List listYears = new();
listYears.Clear();
for (int i = birthdayDate.Year + 1; i <= DateTime.Now.Year; i++)
{
if (DateTime.IsLeapYear(i))
{
numYears++;
listYears.Add(i);
}
}
return listYears;
}
}
}