//------------------------------------------------------------------------------
// <copyright company="Telligent Systems">
//     Copyright (c) Telligent Systems Corporation.  All rights reserved.
// </copyright> 
//------------------------------------------------------------------------------

using System.Collections;
using CommunityServer.Components;
using CommunityServer.Galleries;
using CommunityServer.Galleries.Components;

namespace CommunityServer.Components.SearchBarrel
{
	/// <summary>
	/// Summary description for GallerySearchJob.
	/// </summary>
	public class GallerySearchJob : SearchJob
	{

		public GallerySearchJob() { }

        public override void IndexPosts(int setSize, int settingsID)
        {
            PostSet postSet =  GalleryDataProvider.Instance().SearchReindexPosts(setSize , settingsID);

            foreach (Post post in postSet.Posts) 
            {
                Hashtable words = new Hashtable();
                int totalBodyWords = 0;

            	GalleryPost galleryPost = post as GalleryPost;
                if(galleryPost != null)
                {
                    // Username
                    words = Index(galleryPost.Username, words, WordLocation.Author, settingsID);

					
					// Subject
                    words = Index(galleryPost.Subject, words, WordLocation.Subject, settingsID);

					if(galleryPost.GalleryPostType == GalleryPostType.Image)
					{
						// Count the attachment filename with the subject, if it doesn't equal the subject
						if(galleryPost.Subject != galleryPost.AttachmentFilename)
							words = Index(galleryPost.AttachmentFilename, words, WordLocation.Subject, settingsID);
					}

                    // Body
                    words = Index(galleryPost.Body, words, WordLocation.Body, settingsID);

                    // Get a count of the total words in the body
                    totalBodyWords = SearchTerms.CleanSearchTerms(post.Body).Length;
                    InsertIntoSearchBarrel(words, post, settingsID, totalBodyWords);
				
                }
            }
        }

        protected override double CalculateWordRank(Word word, Post post, int totalBodyWords)
        {
            int wordOccurrence = 0;
            double replyWeight = 0;
            double wordCount = 0;
            double rating = 0;
            int totalRatings = 0;

            // Word weighting:
            // ============================
            // Word Occurence:      20
            // Replies:             20
            // Total words in post: 20
            // Word in Subject:     10
            // Rating:              15
            //                    ----
            // Max score:           85

            // Assign a score for how many times the word occurs in the post
            //
            wordOccurrence = word.Occurence * 2;
            if(wordOccurrence > 20)
                wordOccurrence = 20;

            // Calculate the score for replies
            //
            if((post.PostLevel == 1) && (post.Replies == 0)) 
                replyWeight = 0;  // A post with no replies
            else 
            {
                replyWeight = ( (post.PostLevel - (post.Replies * 0.01)) / (post.PostLevel + post.Replies) ) * 20f;

                // If less than 0, weighting is 0
                if(replyWeight < 0)
                    replyWeight = 0;
            }

            // Calculate a score for the count of total words in the post
            //
            if (totalBodyWords > 65)
                wordCount = 20;
            else
                wordCount = (totalBodyWords / 65f) * 20f;

            // Calculate the score for the ratings
            //
            if(post is IThread) 
            {
                IThread thread = (IThread) post;

                // Handle ratings
                if(thread.TotalRatings > 0)
                {
                    // 5 points for rating greater than 10 ratings
                    if (thread.TotalRatings > 25)
                        totalRatings = 5;
                    else if (thread.TotalRatings > 20)
                        totalRatings = 4;
                    else if (thread.TotalRatings > 15)
                        totalRatings = 3;
                    else if (thread.TotalRatings > 10)
                        totalRatings = 2;
                    else
                        totalRatings = 1;

                    rating = (thread.RatingAverage * 2);
                }
            }

            // Calculate the final weight of the word
            //
            return (wordOccurrence + replyWeight + word.OccurenceWeight + wordCount + totalRatings + rating) / 85f;
        }


	}
}
