﻿using System;
using System.Collections.Generic;
using JLGames.RocketDriver.Games.RpgMaterial.Material;

namespace JLGames.RocketDriver.Games.RpgMaterial.User
{
    public interface IUserMaterialSetMod : IUserMaterialSet
    {
        /// <summary>
        /// Get user material modifiable object
        /// 取可修改对象
        /// </summary>
        /// <param name="eKey"></param>
        /// <typeparam name="TUMod"></typeparam>
        /// <returns></returns>
        TUMod GetUserMaterialMod<TUMod>(string eKey) where TUMod : class, IUserMaterial, IUserMaterialMod;

        /// <summary>
        /// Get user material modifiable object
        /// 取可修改对象
        /// </summary>
        /// <param name="mId"></param>
        /// <param name="uId"></param>
        /// <typeparam name="TUMod"></typeparam>
        /// <returns></returns>
        TUMod GetUserMaterialMod<TUMod>(int mId, int uId = 0) where TUMod : class, IUserMaterial, IUserMaterialMod;

        /// <summary>
        /// Remove user material data.
        /// 移除用户材料数据
        /// </summary>
        /// <param name="eKey"></param>
        /// <returns></returns>
        TUMod RemoveUserMaterialAs<TUMod>(string eKey) where TUMod : class, IUserMaterial;

        /// <summary>
        /// Remove user material data.
        /// 移除用户材料数据
        /// </summary>
        /// <param name="mId"></param>
        /// <param name="uId"></param>
        /// <returns></returns>
        TUMod RemoveUserMaterialAs<TUMod>(int mId, int uId = 0) where TUMod : class, IUserMaterial;

        /// <summary>
        /// Remove user material data in batch
        /// 批量移除用户材料数据
        /// </summary>
        /// <param name="eKeyArr"></param>
        /// <returns></returns>
        TUMod[] RemoveUserMaterialsAs<TUMod>(string[] eKeyArr) where TUMod : class, IUserMaterial;

        /// <summary>
        /// Remove user material data in batch
        /// 批量移除用户材料数据
        /// </summary>
        /// <param name="eKeyArr"></param>
        /// <returns></returns>
        TUMod[] RemoveUserMaterialsAs<TUMod>(IEnumerable<string> eKeyArr) where TUMod : class, IUserMaterial;

        /// <summary>
        /// Remove matched user material data
        /// 移除匹配的用户材料数据
        /// </summary>
        /// <returns></returns>
        TUMod[] RemoveUserMaterialsAs<TUMod>(Predicate<TUMod> match) where TUMod : class, IUserMaterial;

        /// <summary>
        /// Remove all user material data
        /// 移除全部用户材料数据
        /// </summary>
        /// <returns></returns>
        TUMod[] RemoveUserMaterialsAs<TUMod>() where TUMod : class, IUserMaterial;

        /// <summary>
        /// Add user material data
        /// 添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="um"></param>
        void AddUserMaterialAs(IUserMaterial um);

        /// <summary>
        /// Add user material data in batch
        /// 批量添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="umArr"></param>
        void AddUserMaterialsAs<TUAs>(TUAs[] umArr) where TUAs : class, IUserMaterial;

        /// <summary>
        /// Add user material data in batch
        /// 批量添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="umArr"></param>
        void AddUserMaterialsAs<TUAs>(IEnumerable<TUAs> umArr) where TUAs : class, IUserMaterial;

        /// <summary>
        /// Replace user material data
        /// 替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="um"></param>
        void ReplaceUserMaterialAs(IUserMaterial um);

        /// <summary>
        /// Replace user material data in batch
        /// 批量替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="umArr"></param>
        void ReplaceUserMaterialsAs<TUAs>(TUAs[] umArr) where TUAs : class, IUserMaterial;

        /// <summary>
        /// Replace user material data in batch
        /// 批量替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="umArr"></param>
        void ReplaceUserMaterialsAs<TUAs>(IEnumerable<TUAs> umArr) where TUAs : class, IUserMaterial;
    }

    public interface IUserMaterialSetMod<TU, TM, TCfg> : IUserMaterialSetMod
        where TU : IUserMaterial<TM, TCfg> where TM : IMaterial<TCfg>
    {
        /// <summary>
        /// Remove user material data
        /// 移除用户材料数据
        /// </summary>
        /// <param name="eKey"></param>
        /// <returns></returns>
        TU RemoveUserMaterial(string eKey);

        /// <summary>
        /// Remove user material data in batch
        /// 批量移除用户材料数据
        /// </summary>
        /// <param name="eKeyArr"></param>
        /// <returns></returns>
        TU[] RemoveUserMaterials(string[] eKeyArr);

        /// <summary>
        /// Remove user material data in batch
        /// 批量移除用户材料数据
        /// </summary>
        /// <param name="eKeyArr"></param>
        /// <returns></returns>
        TU[] RemoveUserMaterials(IEnumerable<string> eKeyArr);

        /// <summary>
        /// Remove matched user material data
        /// 移除匹配的用户材料数据
        /// </summary>
        /// <param name="match"></param>
        /// <returns></returns>
        TU[] RemoveUserMaterials(Predicate<TU> match);

        /// <summary>
        /// Remove all user material data
        /// 移除全部用户材料数据
        /// </summary>
        /// <returns></returns>
        TU[] RemoveUserMaterials();

        /// <summary>
        /// Add user material data
        /// 批量添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="um"></param>
        void AddUserMaterial(TU um);

        /// <summary>
        /// Add user material data in batch
        /// 批量添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="umArr"></param>
        void AddUserMaterials(TU[] umArr);

        /// <summary>
        /// Add user material data in batch
        /// 批量添加用户材料数据
        /// Ignore if element key is exist
        /// 如果元素的EKey存在，忽略
        /// </summary>
        /// <param name="umArr"></param>
        void AddUserMaterials(IEnumerable<TU> umArr);

        /// <summary>
        /// Replace user material data
        /// 批量替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="um"></param>
        void ReplaceUserMaterial(TU um);

        /// <summary>
        /// Replace user material data in batch
        /// 批量替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="umArr"></param>
        void ReplaceUserMaterials(TU[] umArr);

        /// <summary>
        /// Replace user material data in batch
        /// 批量替换用户材料数据
        /// Add if element key is not exist, and replace if element key is exist.
        /// 如果元素的EKey不存在，直接添加
        /// </summary>
        /// <param name="umArr"></param>
        void ReplaceUserMaterials(IEnumerable<TU> umArr);
    }
}