using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Microsoft.WindowsMobile.Forms;
using Microsoft.WindowsMobile.PocketOutlook;


namespace Contacts_CS
{
    

    public partial class Form1 : Form
    {
        //private OutlookSession session;

        public Form1()
        {
            InitializeComponent();
            #if DEBUG
                MinimizeBox = false;
            #else       
                MinimizeBox = true;
            #endif

            //session = new OutlookSession();
        }

        private void butAddContact_Click(object sender, EventArgs e)
        {
            Contact contact = new Contact();

            // Открываем сессию PocketOutlook
            using (OutlookSession session = new OutlookSession())
            {
                // Заводим необходимую информацию о контакте
                contact.FirstName = "Билл";  // Имя контакта
                contact.LastName = "Гейтс";  // Фамилия контакта
                contact.Email1Address = "billgates@microsoft.com";  // электронный адрес контакта
                contact.Birthday = new DateTime(1955, 10, 28);  // дата рождения контакта
                contact.CompanyName = "Microsoft";  // место работы
                contact.WebPage = new Uri("http://www.microsoft.com");  // веб-страница
                // Добавляем в список контактов
                session.Contacts.Items.Add(contact);
            }
        }

        private void butGetInfo_Click(object sender, EventArgs e)
        {
            using (OutlookSession session = new OutlookSession())
            {
                // Получим информацию о выбранном контакте
                session.Contacts.Items[lstContacts.SelectedIndex].ShowDialog();
            }
        }
                

        private void butDelContact_Click(object sender, EventArgs e)
        {
            using (OutlookSession session = new OutlookSession())
            {
                // Удаляем выбранный контакт
                session.Contacts.Items[lstContacts.SelectedIndex].Delete();
            }
        }


        private void menuItemExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void menuItemWebPage_Click(object sender, EventArgs e)
        {
            using (OutlookSession session = new OutlookSession())
            {
                // Показываем отдельное свойство
                string webPage = session.Contacts.Items[0].Properties[ContactProperty.WebPage].ToString();
                MessageBox.Show(webPage);
            }
        }

        private void menuItemContactList_Click(object sender, EventArgs e)
        {
            Contact contact = new Contact();
            // Открываем сессию PocketOutlook
            using (OutlookSession session = new OutlookSession())
            {
                // Если в списке контактов нет записей, то создадим тестовую запись
                if (session.Contacts.Items.Count <= 0)
                {
                    contact.FirstName = "Кот";
                    contact.LastName = "Матроскин";
                    session.Contacts.Items.Add(contact);
                }

                // Получаем список контактов и заполняем список
                lstContacts.DataSource = session.Contacts.Items;
            }
        }

        private void menuItemShowContacts_Click(object sender, EventArgs e)
        {
            ChooseContactDialog contactDialog = new ChooseContactDialog();
            // Прячем пункт меню Новый контакт
            contactDialog.HideNew = true;

            // Показываем контакты, содержащие электронный адрес
            ContactProperty[] filter = new ContactProperty[] { ContactProperty.Email1Address };
            contactDialog.RequiredProperties = filter; 
            
            // Выводим диалоговое окна на экран
            if (DialogResult.OK == contactDialog.ShowDialog())
            // Показываем выбранный контакт
            MessageBox.Show(contactDialog.SelectedContactName, "Выбранный контакт");
        }

        private void butAddPicture_Click(object sender, EventArgs e)
        {
            ChooseContactDialog chooseContactDialog = new ChooseContactDialog();
            SelectPictureDialog selectPictureDialog = new SelectPictureDialog();
            Contact contact = new Contact();

            // Отрываем сессию PocketOutlook
            using (OutlookSession session = new OutlookSession())
            {
                contact = session.Contacts.Items[0];
                // Открываем диалоговые окна ChooseContactDialog и SelectPictureDialog.
                // И добавляем выбранную картинку в выбранный контакт
                if ((DialogResult.OK == chooseContactDialog.ShowDialog()) 
                    && (DialogResult.OK == selectPictureDialog.ShowDialog()))
                {
                    contact.SetPicture(selectPictureDialog.FileName);
                    contact.Update();
                }
            }
        }

        
        private void menuItemBirthDay_Click(object sender, EventArgs e)
        {
            // Добавляем Дни рождения в Календарь
            bool added = false;
            using (OutlookSession session = new OutlookSession())
            {
                // An invalid date is represented as 0 on the FileTime format.
                DateTime invalidDate = DateTime.FromFileTimeUtc(0);
                string invalidDateStr = invalidDate.Date.ToString("d", System.Globalization.DateTimeFormatInfo.CurrentInfo) +
                                                                  " " + invalidDate.TimeOfDay.ToString();
                string query = "[Birthday] <> " + invalidDateStr;
                ContactCollection contacts = session.Contacts.Items.Restrict(query);

                if (contacts.Count == 0)
                {
                    MessageBox.Show("У вас нет контактов в Списке контактов!");
                    return;
                }

                // Проходим по всему списку контактов
                foreach (Contact person in contacts)
                {
                    if (AddToCalendar(session, person.FirstName + ' ' + person.LastName, person.Birthday, "День Рождения"))
                        added = true;
                 }
                if (added)
                {
                    MessageBox.Show("Дни рождения добавлены в Календарь");
                }
                else
                {
                    MessageBox.Show("Нечего добавлять. Возможно, даты дни рождений уже добавлены в календарь.");
                }
            }
        }

        // Добавляем дату дня рождения в календарь
        private bool AddToCalendar(OutlookSession outlooksession, string name, DateTime bDay, string occasion)
        {
            string apptSubject = name + occasion;

            // Если дата дня рождения уже добавлена в календарь, то выходим
            AppointmentCollection appts = 
                outlooksession.Appointments.Items.Restrict(String.Format("[Subject] = \"{0}\"", apptSubject));

            if (appts.Count != 0)
            {
                return false;
            }

            Appointment appointment = new Appointment();
            appointment.Subject = apptSubject;
            appointment.AllDayEvent = true;

            
            appointment.RecurrencePattern.RecurrenceType = RecurrenceType.Yearly;
            appointment.RecurrencePattern.MonthOfYear = (Month)bDay.Month;
            appointment.RecurrencePattern.DayOfMonth = bDay.Day;

            
            appointment.Start = DateTime.Today;
            appointment.ReminderMinutesBeforeStart = 120;
            outlooksession.Appointments.Items.Add(appointment);
            return true;
        }
    }
}