// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Build.Shared;

namespace Microsoft.Build.Framework
{
    /// <summary>
    /// Arguments for telemetry events.
    /// </summary>
    [Serializable]
    public sealed class TelemetryEventArgs : BuildEventArgs
    {
        /// <summary>
        /// Gets or sets the name of the event.
        /// </summary>
        public string? EventName { get; set; }

        /// <summary>
        /// Gets or sets a list of properties associated with the event.
        /// </summary>
        public IDictionary<string, string?> Properties { get; set; } = new Dictionary<string, string?>();

        internal override void WriteToStream(BinaryWriter writer)
        {
            base.WriteToStream(writer);

            writer.WriteOptionalString(EventName);
            int count = Properties?.Count ?? 0;
            writer.Write7BitEncodedInt(count);

            if (Properties == null)
            {
                return;
            }

            foreach (var kvp in Properties)
            {
                writer.Write(kvp.Key);
                writer.WriteOptionalString(kvp.Value);
            }
        }
        internal override void CreateFromStream(BinaryReader reader, int version)
        {
            base.CreateFromStream(reader, version);

            EventName = reader.ReadOptionalString();
            int count = reader.Read7BitEncodedInt();

            for (int i = 0; i < count; i++)
            {
                string key = reader.ReadString();
                string? value = reader.ReadOptionalString();
                Properties.Add(key, value);
            }
        }
    }
}
