using System;
using System.Runtime.Serialization;
using Kreta.Framework.Localization;
using Kreta.Framework.Logging;

namespace Kreta.Framework.Entities
{
    /// <summary>
    /// Hivatkozás lejárt entitás verziója.
    /// </summary>
    [FriendlyName(1000029, "Az entitás verziója eltér a megadottól.")]
    [ErrorCode(Events.ENTITY_EXPIREDVERSION)]
    [Serializable]
    public sealed class EntityExpiredException : EntityException
    {
        const string _errorMessage = "The referred entity version is not up-to date.";

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="entityName">Az entitás neve</param>
        /// <param name="entityId">Az entitás adatbázisbeli azonosítója</param>
        /// <param name="entitySerial">Az entitás verziószáma</param>
        public EntityExpiredException(string entityName, int entityId, int entitySerial)
            : base(_errorMessage + " [EntityName: {EntityName}, EntityId: {EntityId}, EntitySerial: {EntitySerial}]")
        {
            SetValue("EntityName", entityName);
            SetValue("EntityId", entityId);
            SetValue("EntitySerial", entitySerial);
        }

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="entityName">Az entitás neve</param>
        /// <param name="entityId">Az entitás adatbázisbeli azonosítója</param>
        /// <param name="entitySerial">Az entitás verziószáma</param>
        /// <param name="requestedSerial">Az entitás hivatkozott verziószáma</param>
        public EntityExpiredException(string entityName, int entityId, int entitySerial, int requestedSerial)
            : base(_errorMessage + " [EntityName: {EntityName}, EntityId: {EntityId}, EntitySerial: {EntitySerial}, RequestedSerial: {RequestedSerial}]")
        {
            SetValue("EntityName", entityName);
            SetValue("EntityId", entityId);
            SetValue("EntitySerial", entitySerial);
            SetValue("RequestedSerial", requestedSerial);
        }

        /// <summary>
        /// Az osztály alapértelmezett konstruktora.
        /// </summary>        
        [Obsolete("Ezt a konstruktort ne használd!")]
        public EntityExpiredException() { }

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="message">A kivétel üzenete</param>
        [Obsolete("Ezt a konstruktort ne használd!")]
        public EntityExpiredException(string message)
            : base(message) { }

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="message">A kivétel üzenete</param>
        /// <param name="innerException">A belső kivétel</param>
        [Obsolete("Ezt a konstruktort ne használd!")]
        public EntityExpiredException(string message, Exception innerException)
            : base(message, innerException) { }

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="info">Sorosítási adatok</param>
        /// <param name="context">Sorosítási adatfolyam</param>
        EntityExpiredException(SerializationInfo info, StreamingContext context)
            : base(info, context) { }
    }
}