/***************************************************************************
 *  PodcastFeedModel.cs
 *
 *  Copyright (C) 2007 Michael C. Urbanski
 *  Written by Mike Urbanski <michael.c.urbanski@gmail.com>
 ****************************************************************************/

/*  THIS FILE IS LICENSED UNDER THE MIT LICENSE AS OUTLINED IMMEDIATELY BELOW: 
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a
 *  copy of this software and associated documentation files (the "Software"),  
 *  to deal in the Software without restriction, including without limitation  
 *  the rights to use, copy, modify, merge, publish, distribute, sublicense,  
 *  and/or sell copies of the Software, and to permit persons to whom the  
 *  Software is furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in 
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
 *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 *  DEALINGS IN THE SOFTWARE.
 */

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

using Hyena.Data;
using Banshee.Podcasting.Data;

using Migo.Syndication;

namespace Banshee.Podcasting.Gui
{
    public static class PodcastSortKeys
    {
        public const string Title = "Title";        
    }

    public class PodcastFeedModel : ListModel<Feed>
    {
        public override int Count { 
            get { 
                lock (SyncRoot) { 
                    return List.Count + 1; 
                }
            }
        }

        public PodcastFeedModel () 
        {
        }

        public override Feed this[int index] {
            get { 
                lock (SyncRoot) {
                    if (index == 0) {
                        return Feed.All;
                    }

                    return (index <= List.Count) ? List[index-1] : null;                    
                }
            }
        }    

        public override ReadOnlyCollection<Feed> CopySelectedItems () 
        {
            List<Feed> feeds = null;
            
            lock (SyncRoot) {
                ModelSelection<Feed> selected = SelectedItems;
                
                if (selected.Count > 0) {
                    feeds = new List<Feed> (selected.Count);
                    
                    foreach (Feed feed in selected) {
                        if (feed != Feed.All) {
                            feeds.Add (feed);                            
                        }
                    }
                }
            }

            return (feeds != null) ? 
                new ReadOnlyCollection<Feed> (feeds) : null;
        }    
    
        public override void Sort ()
        {
            lock (SyncRoot) {
                if (SortColumn == null) {
                    return;
                }
                
                switch (SortColumn.SortKey) {
                case PodcastItemSortKeys.Title:
                    List.Sort (new TitleComparer (SortColumn.SortType));
                    break;                    
                }  
            }
        }
        
        private class TitleComparer : SortTypeComparer<Feed>
        {
            public TitleComparer (SortType type) : base (type)
            {
            }
            
            public override int Compare (Feed lhs, Feed rhs)
            {
                int ret = String.Compare (lhs.Title, rhs.Title);   
                return (SortType == SortType.Ascending) ? ret * -1 : ret;
            }
        } 
    }
}
