//
// HostStatConfiguration.cs
//
// Author:
//       Carsten Sonne Larsen <cs@innolan.dk>
//
// Copyright (c) 2013-2016 Carsten Sonne Larsen
//
// 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.Linq;
using Ntp.Analyzer.Config.Root;
using Ntp.Analyzer.Localize;
using Ntp.Config;

namespace Ntp.Analyzer.Config.Stats
{
    public sealed class HostStatConfiguration : StatsConfiguration
    {
        private HostStatConfiguration(
            string configName,
            int indentLevel,
            HostConfiguration server,
            ReadingBulkConfiguration bulk,
            DateTimeKind timeStamp,
            int frequency,
            bool initialRun,
            bool fixedRun
            )
            : base(configName, indentLevel, server, bulk, timeStamp, frequency, initialRun, fixedRun)
        {
        }

        public const string Identifier = ConfigurationKeyword.HostStats;

        private static readonly String[] Params =
        {
            ConfigurationKeyword.HostStats,
            ConfigurationKeyword.Frequency,
            ConfigurationKeyword.TimeStamp,
            ConfigurationKeyword.InitialRun,
            ConfigurationKeyword.FixedRun
        };

        protected override string InstanceName
        {
            get { return Identifier; }
        }

        public static HostStatConfiguration Create(
            HostConfiguration server,
            ReadingBulkConfiguration[] bulks,
            ConfigurationBlock config)
        {
            OptionSet options = GetOptions(Params, config);

            string configName = GetOptionConfigName(options, ConfigurationKeyword.HostStats, String.Empty, false);

            bool initialRun = false;
            bool fixedRun = false;
            int frequency;

            ReadingBulkConfiguration bulkConfig = null;

            if (Int32.TryParse(options[ConfigurationKeyword.Frequency], out frequency))
            {
                frequency = GetOptionInteger(options, ConfigurationKeyword.Frequency, Identifier, true);
                initialRun = GetOptionBoolean(options, ConfigurationKeyword.InitialRun, Identifier, false,
                    DefaultInitialRun);
                fixedRun = GetOptionBoolean(options, ConfigurationKeyword.FixedRun, Identifier, false, DefaultFixedRun);
            }
            else
            {
                string bulkName = options[ConfigurationKeyword.Frequency];
                bulkConfig = bulks.SingleOrDefault(b => b.Name == bulkName);
                if (bulkConfig == null)
                {
                    ConfigError(String.Format(
                        ConfigurationMessage.WrongReference,
                        ConfigurationKeyword.Frequency, Identifier, configName));
                }
            }

            return new HostStatConfiguration(
                configName,
                config.IndentLevel,
                server,
                bulkConfig,
                GetTimezone(options, ConfigurationKeyword.TimeStamp, Identifier),
                frequency,
                initialRun,
                fixedRun);
        }
    }
}