﻿/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace Kafka.Client.Consumers
{
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Reflection;
    using System.Text;
    using System.Web.Script.Serialization;
    using log4net;

    internal class TopicCount
    {
        private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        private readonly IDictionary<string, int> topicCountMap;
        private readonly string consumerIdString;

        public TopicCount(string consumerIdString, IDictionary<string, int> topicCountMap)
        {
            this.topicCountMap = topicCountMap;
            this.consumerIdString = consumerIdString;
        }

        public static TopicCount ConstructTopicCount(string consumerIdString, string json)
        {
            Dictionary<string, int> result = null;
            var ser = new JavaScriptSerializer();
            try
            {
                result = ser.Deserialize<Dictionary<string, int>>(json);
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat(CultureInfo.CurrentCulture, "error parsing consumer json string {0}. {1}", json, ex);
            }

            return new TopicCount(consumerIdString, result);
        }

        public IDictionary<string, IList<string>> GetConsumerThreadIdsPerTopic()
        {
            var result = new Dictionary<string, IList<string>>();
            foreach (KeyValuePair<string, int> item in topicCountMap)
            {
                var consumerSet = new List<string>();
                for (int i = 0; i < item.Value; i++)
                {
                    consumerSet.Add(consumerIdString + "-" + i);
                }

                result.Add(item.Key, consumerSet);
            }

            return result;
        }

        public override bool Equals(object obj)
        {
            var o = obj as TopicCount;
            if (o != null)
            {
                return this.consumerIdString == o.consumerIdString && this.topicCountMap == o.topicCountMap;
            }

            return false;
        }

        /*
         return json of
         { "topic1" : 4,
           "topic2" : 4
         }
        */
        public string ToJsonString()
        {
            var sb = new StringBuilder();
            sb.Append("{ ");
            int i = 0;
            foreach (KeyValuePair<string, int> entry in this.topicCountMap)
            {
                if (i > 0)
                {
                    sb.Append(",");
                }

                sb.Append("\"" + entry.Key + "\": " + entry.Value);
                i++;
            }

            sb.Append(" }");
            return sb.ToString();
        }
    }
}
