﻿/*
 * Licensed 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 DotPulsar
{
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>
    /// Information about the schema.
    /// </summary>
    public sealed class SchemaInfo
    {
        internal SchemaInfo(Internal.PulsarApi.Schema schema)
            => PulsarSchema = schema;

        public SchemaInfo(string name, byte[] data, SchemaType type, IReadOnlyDictionary<string, string> properties)
        {
            PulsarSchema = new Internal.PulsarApi.Schema
            {
                Name = name,
                SchemaData = data,
                Type = (Internal.PulsarApi.Schema.SchemaType) type,
            };

            foreach (var property in properties)
            {
                var keyValue = new Internal.PulsarApi.KeyValue
                {
                    Key = property.Key,
                    Value = property.Value
                };

                PulsarSchema.Properties.Add(keyValue);
            }
        }

        internal Internal.PulsarApi.Schema PulsarSchema { get; }

        /// <summary>
        /// The name of the schema.
        /// </summary>
        public string Name => PulsarSchema.Name;

        /// <summary>
        /// The data of the schema.
        /// </summary>
        public byte[] Data => PulsarSchema.SchemaData;

        /// <summary>
        /// The type of the schema.
        /// </summary>
        public SchemaType Type => (SchemaType) PulsarSchema.Type;

        /// <summary>
        /// The properties of the schema.
        /// </summary>
        public IReadOnlyDictionary<string, string> Properties => PulsarSchema.Properties.ToDictionary(p => p.Key, p => p.Value);
    }
}
