using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;

[DataContract(Name = "Appointment", Namespace = "http://www.componentone.com")]
public class Appointment : INotifyPropertyChanged
{
    public Appointment()
    {
        Id = Guid.NewGuid();
    }
    [DataMember]
    public Guid Id { get; private set; }

    private string _subject = "";
    [DataMember]
    public string Subject
    {
        get { return _subject; }
        set
        {
            if (_subject != value)
            {
                _subject = value;
                OnPropertyChanged("Subject");
            }
        }
    }

    private string _location = "";
    [DataMember]
    public string Location
    {
        get { return _location; }
        set
        {
            if (_location != value)
            {
                _location = value;
                OnPropertyChanged("Location");
            }
        }
    }

    private DateTime _start;
    [DataMember]
    public DateTime Start
    {
        get { return _start; }
        set
        {
            if (_start != value)
            {
                _start = value;
                OnPropertyChanged("Start");
            }
        }
    }

    [DataMember]
    public DateTime End
    {
        get { return _start.Add(_duration); }
        set
        {
            if (value >= _start)
            {
                Duration = (value.Subtract(_start));
                OnPropertyChanged("End");
            }
        }
    }

    private TimeSpan _duration;
    public TimeSpan Duration
    {
        get { return _duration; }
        set
        {
            if (_duration != value)
            {
                _duration = value;
                OnPropertyChanged("Duration");
            }
        }
    }

    private string _description = "";
    [DataMember]
    public string Description
    {
        get { return _description; }
        set {
            if (_description != value)
            {
                _description = value;
                OnPropertyChanged("Description");
            }
        }
    }
    
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

// inherit from ObservableCollection to allow autorefresh in calendar
public class AppointmentCollection : ObservableCollection<Appointment>
{
    public AppointmentCollection()
    {
    }
}