namespace DevExpress.DevAV.ViewModels {
    using System;
    using DevExpress.Mvvm.DataAnnotations;
    using DevExpress.Mvvm.POCO;

    public class CollectionUIViewModel {
        #region ViewKind
        public virtual CollectionViewKind ViewKind { get; set; }
        [Command]
        public void ShowCard() {
            ViewKind = CollectionViewKind.CardView;
        }
        public bool CanShowCard() {
            return ViewKind != CollectionViewKind.CardView;
        }
        [Command]
        public void ShowList() {
            ViewKind = CollectionViewKind.ListView;
        }
        public bool CanShowList() {
            return ViewKind != CollectionViewKind.ListView;
        }
        [Command]
        public void ShowCarousel() {
            ViewKind = CollectionViewKind.Carousel;
        }
        public bool CanShowCarousel() {
            return ViewKind != CollectionViewKind.Carousel;
        }
        [Command]
        public void ShowMasterDetail() {
            ViewKind = CollectionViewKind.MasterDetailView;
        }
        public bool CanShowMasterDetail() {
            return ViewKind != CollectionViewKind.MasterDetailView;
        }
        protected virtual void OnViewKindChanged() {
            this.RaiseCanExecuteChanged(x => x.ShowList());
            this.RaiseCanExecuteChanged(x => x.ShowCard());
            this.RaiseCanExecuteChanged(x => x.ShowCarousel());
            this.RaiseCanExecuteChanged(x => x.ShowMasterDetail());
            this.RaiseCanExecuteChanged(x => x.ResetView());
            RaiseViewKindChanged();
        }
        #endregion
        #region ViewLayout
        public virtual CollectionViewMasterDetailLayout ViewLayout { get; set; }
        public bool IsDetailHidden {
            get { return ViewLayout == CollectionViewMasterDetailLayout.DetailHidden; }
        }
        public bool IsHorizontalLayout {
            get { return ViewLayout == CollectionViewMasterDetailLayout.Horizontal; }
        }
        [Command]
        public void ShowHorizontalLayout() {
            ViewLayout = CollectionViewMasterDetailLayout.Horizontal;
        }
        public bool CanShowHorizontalLayout() {
            return ViewLayout != CollectionViewMasterDetailLayout.Horizontal;
        }
        [Command]
        public void ShowVerticalLayout() {
            ViewLayout = CollectionViewMasterDetailLayout.Vertical;
        }
        public bool CanShowVerticalLayout() {
            return ViewLayout != CollectionViewMasterDetailLayout.Vertical;
        }
        [Command]
        public void HideDetail() {
            ViewLayout = CollectionViewMasterDetailLayout.DetailHidden;
        }
        public bool CanHideDetail() {
            return ViewLayout != CollectionViewMasterDetailLayout.DetailHidden;
        }
        protected virtual void OnViewLayoutChanged() {
            this.RaiseCanExecuteChanged(x => x.ShowHorizontalLayout());
            this.RaiseCanExecuteChanged(x => x.ShowVerticalLayout());
            this.RaiseCanExecuteChanged(x => x.HideDetail());
            this.RaiseCanExecuteChanged(x => x.ResetView());
            RaiseViewLayoutChanged();
        }
        #endregion
        #region Reset
        public CollectionViewKind DefaultViewKind { get; set; }
        public CollectionViewMasterDetailLayout DefaultViewLayout { get; set; }
        [Command]
        public void ResetView() {
            ViewKind = DefaultViewKind;
            ViewLayout = DefaultViewLayout;
        }
        public bool CanResetView() {
            return 
                (ViewKind != DefaultViewKind) || 
                (ViewLayout != DefaultViewLayout);
        }
        #endregion
        public event EventHandler ViewKindChanged;
        public event EventHandler ViewLayoutChanged;
        void RaiseViewKindChanged() {
            EventHandler handler = ViewKindChanged;
            if(handler != null)
                handler(this, EventArgs.Empty);
        }
        void RaiseViewLayoutChanged() {
            EventHandler handler = ViewLayoutChanged;
            if(handler != null)
                handler(this, EventArgs.Empty);
        }
    }
}