/*
<copyright file="BGFieldBigInteger.cs" company="BansheeGz">
    Copyright (c) 2018-2021 All Rights Reserved
</copyright>
*/

using System;
using System.Globalization;
using System.Numerics;

namespace BansheeGz.BGDatabase
{
    /// <summary>
    /// Field for entity name
    /// </summary>
    [FieldDescriptor(Name = "bigInteger", Folder = "Special", ManagerType = "BansheeGz.BGDatabase.Editor.BGFieldManagerBigInteger")]
    public class BGFieldBigInteger : BGFieldCachedStructA<BigInteger>
    {
        private static readonly BGBinaryWriter Writer = new BGBinaryWriter(1024);
        private static readonly BGBinaryReader Reader = new BGBinaryReader(null);

        public override bool SupportMultiThreadedLoading => false;

        protected override int ValueSize => 0;


        public BGFieldBigInteger(BGMetaEntity meta, string name) : base(meta, name)
        {
        }

        private BGFieldBigInteger(BGMetaEntity meta, BGId id, string name) : base(meta, id, name)
        {
        }

        //================================================================================================
        //                                              Serialization
        //================================================================================================
        /// <inheritdoc />
        public override byte[] ToBytes(int entityIndex)
        {
            Writer.Clear();
            Writer.AddByteArray(this[entityIndex].ToByteArray());
            return Writer.ToArray();
        }

        /// <inheritdoc />
        public override void FromBytes(int entityIndex, ArraySegment<byte> segment)
        {
            Reader.Reset(segment);
            var array = BGUtil.ToArray(Reader.ReadByteArray());
            if (array == null || array.Length == 0) ClearValueNoEvent(entityIndex);
            else this[entityIndex] = new BigInteger(array);
            Reader.Dispose();
        }

        /// <inheritdoc />
        public override string ToString(int entityIndex) => this[entityIndex].ToString(CultureInfo.InvariantCulture);

        /// <inheritdoc />
        public override void FromString(int entityIndex, string value)
        {
            if (string.IsNullOrEmpty(value)) ClearValueNoEvent(entityIndex);
            else
            {
                if (!BigInteger.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var result)) ClearValueNoEvent(entityIndex);
                else this[entityIndex] = result;
            }
        }

        //================================================================================================
        //                                              Factory
        //================================================================================================
        protected override Func<BGMetaEntity, BGId, string, BGField> CreateFieldFactory() => (meta, id, name) => new BGFieldBigInteger(meta, id, name);
    }
}