﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

namespace LLVM.ClangTidy
{
    public class CheckInfo
    {
        [YamlAlias("Name")]
        public string Name { get; set; }

        [YamlAlias("Label")]
        public string Label { get; set; }

        [YamlAlias("Description")]
        public string Desc { get; set; }

        [YamlAlias("Category")]
        public string Category { get; set; }
    }

    /// <summary>
    /// Reads the list of checks from Yaml and builds a description of each one.
    /// This list of checks is then used by the PropertyGrid to determine what
    /// items to display.
    /// </summary>
    public static class CheckDatabase
    {
        static CheckInfo[] Checks_ = null;

        class CheckRoot
        {
            [YamlAlias("Checks")]
            public CheckInfo[] Checks { get; set; }
        }

        static CheckDatabase()
        {
            using (StringReader Reader = new StringReader(Resources.ClangTidyChecks))
            {
                Deserializer D = new Deserializer(namingConvention: new PascalCaseNamingConvention());
                var Root = D.Deserialize<CheckRoot>(Reader);
                Checks_ = Root.Checks;

                HashSet<string> Names = new HashSet<string>();
                foreach (var Check in Checks_)
                {
                    if (Names.Contains(Check.Name))
                        continue;
                    Names.Add(Check.Name);
                }
            }
        }

        public static IEnumerable<CheckInfo> Checks
        {
            get
            {
                return Checks_;
            }
        }
    }
}
