﻿/*
 * 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.Internal.Compression
{
    using DotPulsar.Internal.Abstractions;
    using System.Collections.Generic;

    public static class CompressionFactories
    {
        private static readonly List<ICompressorFactory> _compressorFactories;
        private static readonly List<IDecompressorFactory> _decompressorFactories;

        static CompressionFactories()
        {
            _compressorFactories = new List<ICompressorFactory>();
            _decompressorFactories = new List<IDecompressorFactory>();


            if (Lz4Compression.TryLoading(out ICompressorFactory? compressorFactory, out IDecompressorFactory? decompressorFactory))
                Add(compressorFactory, decompressorFactory);

            if (SnappyCompression.TryLoading(out compressorFactory, out decompressorFactory))
                Add(compressorFactory, decompressorFactory);

            if (ZlibCompression.TryLoading(out compressorFactory, out decompressorFactory))
                Add(compressorFactory, decompressorFactory);

            if (ZstdCompression.TryLoading(out compressorFactory, out decompressorFactory))
                Add(compressorFactory, decompressorFactory);
        }

        private static void Add(ICompressorFactory? compressorFactory, IDecompressorFactory? decompressorFactory)
        {
            _compressorFactories.Add(compressorFactory!);
            _decompressorFactories.Add(decompressorFactory!);
        }

        public static IEnumerable<ICompressorFactory> CompressorFactories()
            => _compressorFactories;

        public static IEnumerable<IDecompressorFactory> DecompressorFactories()
            => _decompressorFactories;
    }
}
