﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.PooledObjects;

namespace Roslyn.Hosting.Diagnostics.PerfMargin
{
    internal class DataModel
    {
        public ActivityLevel RootNode { get; }

        private readonly ImmutableArray<ActivityLevel?> _activities;

        public DataModel()
        {
            var fields = from field in typeof(FunctionId).GetFields()
                         where !field.IsSpecialName
                         select field;

            var builder = new ArrayBuilder<ActivityLevel?>();

            var features = new Dictionary<string, ActivityLevel>();
            var root = new ActivityLevel("All");

            foreach (var field in fields)
            {
                var value = (int)field.GetRawConstantValue();
                var name = field.Name;
                var featureNames = name.Split('_');
                var featureName = featureNames.Length > 1 ? featureNames[0] : "Uncategorized";

                if (!features.TryGetValue(featureName, out var parent))
                {
                    parent = new ActivityLevel(featureName, root, createChildList: true);
                    features[featureName] = parent;
                }

                builder.SetItem(value, new ActivityLevel(name, parent, createChildList: false));
            }

            _activities = builder.ToImmutable();
            root.SortChildren();
            RootNode = root;
        }

        public void BlockStart(FunctionId functionId)
            => _activities[(int)functionId]!.Start();

        public void BlockDisposed(FunctionId functionId)
            => _activities[(int)functionId]!.Stop();
    }
}
