﻿/*
 * 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);
}
