﻿// MIT License. Copyright (c) 2016 Maxim Kuzmin. Contacts: https://github.com/maxim-kuzmin

// Author: Maxim Kuzmin

using Makc2016.Core.Logging;
using System;
using System.Collections.Generic;

namespace Makc2016.Core.Execution.Operations
{
    /// <summary>
    /// Ядро. Выполнение. Операции. Операция с выходными данными.
    /// </summary>
    /// <typeparam name="TOutputData">Тип выходных данных.</typeparam>    
    public class CoreExecutionOperationWithOutputData<TOutputData>
        : CoreExecutionOperation
    {
        #region Properties

        /// <summary>
        /// Функция получения сообщений об успехах.
        /// </summary>
        public Func<TOutputData, IEnumerable<string>> FuncSuccessMessagesGetting { get; private set; }

        /// <summary>
        /// Функция получения сообщений о предупреждениях.
        /// </summary>
        public Func<TOutputData, IEnumerable<string>> FuncWarningMessagesGetting { get; private set; }

        #endregion Properties

        #region Constructors

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="funcErrorMessagesGetting">Функция получения сообщений об ошибках.</param>
        /// <param name="funcSuccessMessagesGetting">Функция получения сообщений об успехах.</param>
        /// <param name="funcWarningMessagesGetting">Функция получения сообщений о предупреждениях.</param>
        public CoreExecutionOperationWithOutputData(
            Func<Exception, IEnumerable<string>> funcErrorMessagesGetting,
            Func<TOutputData, IEnumerable<string>> funcSuccessMessagesGetting,
            Func<TOutputData, IEnumerable<string>> funcWarningMessagesGetting
            ) : base(funcErrorMessagesGetting)
        {
            FuncSuccessMessagesGetting = funcSuccessMessagesGetting;
            FuncWarningMessagesGetting = funcWarningMessagesGetting;
        }

        #endregion Constructors

        #region Public methods

        /// <summary>
        /// Обработать положительный результат.
        /// </summary>
        /// <param name="log">Журнал.</param>
        /// <param name="result">Результат выполнения.</param>   
        /// <param name="outputData">Выходные данные.</param>
        public void HandleOk(
            ICoreLoggingLog log,
            CoreExecutionResult result,
            TOutputData outputData
            )
        {
            Func<IEnumerable<string>> funcSuccessMessagesGetting = null;

            if (FuncSuccessMessagesGetting != null)
            {
                funcSuccessMessagesGetting = () => FuncSuccessMessagesGetting.Invoke(outputData);
            }

            Func<IEnumerable<string>> funcWarningMessagesGetting = null;

            if (FuncWarningMessagesGetting != null)
            {
                funcWarningMessagesGetting = () => FuncWarningMessagesGetting.Invoke(outputData);
            }

            HandleOk(
                log,
                result,
                funcSuccessMessagesGetting,
                funcWarningMessagesGetting
                );
        }

        #endregion Public methods
    }
}
