using CommonTools.Enums;
using CommonTools.OperationResultModels;
using System;

namespace CommonTools.Extensions
{
	/// <summary>
	/// Расширения для результата операции
	/// </summary>
	public static class OperationResultExtensions
	{
        /// <summary>
        /// Добавление простой ошибки
        /// </summary>
        /// <param name="model"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
		public static void AddError(this OperationResultModel model, string key, string value) => model.AddError(key, value, ResultServiceStatusCode.Error);

        /// <summary>
        /// Добавление простой ошибки со сменой статуса
        /// </summary>
        /// <param name="model"></param>
        /// <param name="key"></param>
        /// <param name="error"></param>
        /// <param name="statusCode"></param>
		public static void AddError(this OperationResultModel model, string key, string error, ResultServiceStatusCode statusCode)
        {
            model.Errors.Add((key, error));
            model.StatusCode = statusCode;
        }

		/// <summary>
		/// Добавление ошибки
		/// </summary>
		/// <param name="model"></param>
		/// <param name="error"></param>
		public static void AddError(this OperationResultModel model, Exception error) => model.AddError(error, ResultServiceStatusCode.Error);

		/// <summary>
		/// Добавление ошибки
		/// </summary>
		/// <param name="model"></param>
		/// <param name="error"></param>
		/// <param name="statusCode"></param>
		public static void AddError(this OperationResultModel model, Exception error, ResultServiceStatusCode statusCode) => model.AddError("Ошибка", error, statusCode);

        /// <summary>
        /// Добавление ошибки (включая вложеннные)
        /// </summary>
        /// <param name="model"></param>
        /// <param name="key"></param>
        /// <param name="error"></param>
        /// <param name="statusCode"></param>
        public static void AddError(this OperationResultModel model, string key, Exception error, ResultServiceStatusCode statusCode)
        {
            model.Errors.Add((key, error.Message));
            while (error.InnerException != null)
            {
                error = error.InnerException;
                model.Errors.Add(("Inner error:", error.Message));
            }
            model.StatusCode = statusCode;
        }
    }
}