using System;
using System.Collections.Generic;
using SmartStore.Core.Domain.Customers;
using SmartStore.Core.Domain.Logging;

namespace SmartStore.Core.Logging
{
	/// <summary>
	/// Customer activity service interface
	/// </summary>
	public partial interface ICustomerActivityService
    {
        /// <summary>
        /// Inserts an activity log type item
        /// </summary>
        /// <param name="activityLogType">Activity log type item</param>
        void InsertActivityType(ActivityLogType activityLogType);

        /// <summary>
        /// Updates an activity log type item
        /// </summary>
        /// <param name="activityLogType">Activity log type item</param>
        void UpdateActivityType(ActivityLogType activityLogType);

        /// <summary>
        /// Deletes an activity log type item
        /// </summary>
        /// <param name="activityLogType">Activity log type</param>
        void DeleteActivityType(ActivityLogType activityLogType);

        /// <summary>
        /// Gets all activity log type items
        /// </summary>
        /// <returns>Activity log type collection</returns>
        IEnumerable<ActivityLogType> GetAllActivityTypes();

        /// <summary>
        /// Gets an activity log type item
        /// </summary>
        /// <param name="activityLogTypeId">Activity log type identifier</param>
        /// <returns>Activity log type item</returns>
        ActivityLogType GetActivityTypeById(int activityLogTypeId);

        /// <summary>
        /// Gets an activity log type by it's system keyword
        /// </summary>
        /// <param name="systemKeyword">The system keyword</param>
        /// <returns>Activity log type item</returns>
        ActivityLogType GetActivityTypeBySystemKeyword(string systemKeyword);

        /// <summary>
        /// Inserts an activity log item
        /// </summary>
        /// <param name="systemKeyword">The system keyword</param>
        /// <param name="comment">The activity comment</param>
        /// <param name="commentParams">The activity comment parameters for string.Format() function.</param>
        /// <returns>Activity log item</returns>
        ActivityLog InsertActivity(string systemKeyword, string comment, params object[] commentParams);

        /// <summary>
        /// Inserts an activity log item
        /// </summary>
        /// <param name="systemKeyword">The system keyword</param>
        /// <param name="comment">The activity comment</param>
        /// <param name="customer">The customer</param>
        /// <param name="commentParams">The activity comment parameters for string.Format() function.</param>
        /// <returns>Activity log item</returns>
        ActivityLog InsertActivity(string systemKeyword,
            string comment, Customer customer, params object[] commentParams);

        /// <summary>
        /// Deletes an activity log item
        /// </summary>
        /// <param name="activityLog">Activity log</param>
        void DeleteActivity(ActivityLog activityLog);

		/// <summary>
		/// Gets all activity log items
		/// </summary>
		/// <param name="createdOnFrom">Log item creation from; null to load all customers</param>
		/// <param name="createdOnTo">Log item creation to; null to load all customers</param>
		/// <param name="customerId">Customer identifier; null to load all customers</param>
		/// <param name="activityLogTypeId">Activity log type identifier</param>
		/// <param name="pageIndex">Page index</param>
		/// <param name="pageSize">Page size</param>
		/// <param name="email">Customer email</param>
		/// <param name="customerSystemAccount">Customer system name</param>
		/// <returns>Activity log collection</returns>
		IPagedList<ActivityLog> GetAllActivities(
			DateTime? createdOnFrom,
            DateTime? createdOnTo,
			int? customerId,
            int activityLogTypeId,
			int pageIndex,
			int pageSize,
			string email = null,
			bool? customerSystemAccount = null);

        /// <summary>
        /// Gets an activity log item
        /// </summary>
        /// <param name="activityLogId">Activity log identifier</param>
        /// <returns>Activity log item</returns>
        ActivityLog GetActivityById(int activityLogId);

		/// <summary>
		/// Gets activity logs be identifier
		/// </summary>
		/// <param name="activityLogIds">Activity log identifiers</param>
		/// <returns>List of activity logs</returns>
		IList<ActivityLog> GetActivityByIds(int[] activityLogIds);

		/// <summary>
		/// Clears activity log
		/// </summary>
		void ClearAllActivities();
    }
}
