//--------------------------------------------------------------------
//     此代码由T4模板自动生成  byzhouhang 20210918
//	   生成时间 2023-02-13 10:33:22 
//     对此文件的更改可能会导致不正确的行为，并且如果重新生成代码，这些更改将会丢失。
//--------------------------------------------------------------------

using IRaCIS.Core.Application.ViewModel;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Core.Application.Service
{
    /// <summary>
    /// 快捷键服务
    /// </summary>	
    [ApiExplorerSettings(GroupName = "Reading")]
    public class ShortcutKeyService(IRepository<Dictionary> _dictionaryRepository,
        IRepository<ShortcutKey> _shortcutKeyRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
    {



        /// <summary>
        /// 获取医生快捷键
        /// </summary>
        /// <param name="inQuery"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<List<DefaultShortcutKeyView>> GetDoctorShortcutKey(DefaultShortcutKeyQuery inQuery)
        {
            var shortcutKeyList = await _shortcutKeyRepository.Where(x => x.ImageToolType == inQuery.ImageToolType)
                .Where(x => x.UserId == _userInfo.UserRoleId)
                .ToListAsync();

            var defaultshortcutKeyList = this.GetDefaultShortcutKey();

            var shortcutKeydic = await _dictionaryRepository.Where(x => x.Parent.Code == "ShortcutKey")
                .Where(x=>x.ChildGroup.Contains(inQuery.ImageToolType.ToString()))
                .WhereIf(inQuery.ShortcutKeyEnum != null, x => x.Code == inQuery.ShortcutKeyEnum.ToString()).ToListAsync();


            List<DefaultShortcutKeyView> result = new List<DefaultShortcutKeyView>();

            shortcutKeydic.OrderBy(x => x.ShowOrder).ForEach(x =>
            {
                var key = shortcutKeyList.Where(y => y.ShortcutKeyEnum == int.Parse(x.Code)).FirstOrDefault();
                var defaultkey = defaultshortcutKeyList.Where(y => y.ShortcutKeyEnum == int.Parse(x.Code)).FirstOrDefault();
                var isnull = key == null;

                result.Add(new DefaultShortcutKeyView()
                {
                    Id = x.Id,
                    ImageToolType = inQuery.ImageToolType,
                    ShortcutKeyEnum = int.Parse(x.Code),
                    Keyboardkey = isnull ? defaultkey!.Keyboardkey : key!.Keyboardkey,
                    AltKey = isnull ? false : key!.AltKey,
                    CtrlKey = isnull ? false : key!.CtrlKey,
                    MetaKey = isnull ? false : key!.MetaKey,
                    ShiftKey = isnull && int.Parse(x.Code) == 11 ? true : isnull ? false : key!.ShiftKey,
                    Text = isnull ? defaultkey!.Text : key!.Text,
                    Code = isnull ? defaultkey!.Code : key!.Code,
                });

            });



            return result;
        }

        /// <summary>
        /// 获取默认快捷键
        /// </summary>
        /// <returns></returns>
        private List<ShortcutKey> GetDefaultShortcutKey()
        {
            List<ShortcutKey> shortcutKeys = new List<ShortcutKey>() {
            new ShortcutKey (){

        Keyboardkey= "ArrowLeft",
        ShortcutKeyEnum = 1,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "←",
        Code= "ArrowLeft"
    }, new ShortcutKey (){

        Keyboardkey= "ArrowRight",
        ShortcutKeyEnum = 2,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "→",
        Code= "ArrowRight"
         }, new ShortcutKey (){

        Keyboardkey= "PageUp",
        ShortcutKeyEnum = 3,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "Page Up",
        Code= "PageUp"
         }, new ShortcutKey (){

        Keyboardkey= "PageDown",
        ShortcutKeyEnum = 4,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "Page Down",
        Code= "PageDown"
         }, new ShortcutKey (){

        Keyboardkey= "ArrowUp",
        ShortcutKeyEnum = 5,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "↑",
        Code= "ArrowUp"
         }, new ShortcutKey (){

        Keyboardkey= "ArrowDown",
        ShortcutKeyEnum = 6,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "↓",
        Code= "ArrowDown"
         }, new ShortcutKey (){

        Keyboardkey= "l",
        ShortcutKeyEnum = 7,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "L",
        Code= "KeyL"
         }, new ShortcutKey (){

        Keyboardkey= "r",
        ShortcutKeyEnum = 8,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "R",
        Code= "KeyR"
         }, new ShortcutKey (){

        Keyboardkey= "h",
        ShortcutKeyEnum = 9,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "H",
        Code= "KeyH"
         }, new ShortcutKey (){

        Keyboardkey= "v",
        ShortcutKeyEnum = 10,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "V",
        Code= "KeyV"
         }, new ShortcutKey (){

        Keyboardkey= "+",
        ShortcutKeyEnum = 11,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = true,
        MetaKey = false,
        Text= "+",
        Code= "Equal"
         }, new ShortcutKey (){

        Keyboardkey= "-",
        ShortcutKeyEnum = 12,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "-",
        Code= "Minus"
         }, new ShortcutKey (){

        Keyboardkey= "=",
        ShortcutKeyEnum = 13,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "=",
        Code= "Equal"
         }, new ShortcutKey (){

        Keyboardkey= "f",
        ShortcutKeyEnum = 14,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "F",
        Code= "KeyF"
         }, new ShortcutKey (){

        Keyboardkey= "s",
        ShortcutKeyEnum = 15,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "S",
        Code= "KeyS"
         }, new ShortcutKey (){

        Keyboardkey= "i",
        ShortcutKeyEnum = 16,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "I",
        Code= "KeyI"
         }, new ShortcutKey (){

        Keyboardkey= "c",
        ShortcutKeyEnum = 17,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "C",
        Code= "KeyC"
         }, new ShortcutKey (){

        Keyboardkey= "",
        ShortcutKeyEnum = 18,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "Space",
        Code= "Space"
         },
        new ShortcutKey (){

        Keyboardkey= "m",
        ShortcutKeyEnum = 19,
        ImageToolType= 0,
        AltKey = false,
        CtrlKey = false,
        ShiftKey = false,
        MetaKey = false,
        Text= "M",
        Code= "KeyM"
         },
            };


            return shortcutKeys;


        }


        /// <summary>
        /// 重置为默认快捷键
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> RestoreDefaultShortcutKey(RestoreDefaultShortcutKeyInDto inDto)
        {
            var shortcutKeys = GetDefaultShortcutKey();
            shortcutKeys.ForEach(x =>
            {
                x.UserId = _userInfo.UserRoleId;
            });

            await _shortcutKeyRepository.BatchDeleteNoTrackingAsync(x => x.ImageToolType == inDto.ImageToolType && x.UserId == _userInfo.UserRoleId);

            await _shortcutKeyRepository.AddRangeAsync(shortcutKeys.Select(x => new ShortcutKey()
            {
                ImageToolType = inDto.ImageToolType,
                Keyboardkey = x.Keyboardkey,
                ShortcutKeyEnum = x.ShortcutKeyEnum,
                UserId = _userInfo.UserRoleId,
                AltKey = x.AltKey,
                CtrlKey = x.CtrlKey,
                MetaKey = x.MetaKey,
                ShiftKey = x.ShiftKey,
                Text = x.Text,
                Code = x.Code,
            }));

            return await _shortcutKeyRepository.SaveChangesAsync();
        }

        /// <summary>
        /// 设置快捷键
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> SetShortcutKey(SetDefaultShortcutKey inDto)
        {
            await _shortcutKeyRepository.BatchDeleteNoTrackingAsync(x => x.ImageToolType == inDto.ImageToolType && x.UserId == _userInfo.UserRoleId);

            await _shortcutKeyRepository.AddRangeAsync(inDto.ShortcutKeyList.Select(x => new ShortcutKey()
            {
                ImageToolType = inDto.ImageToolType,
                Keyboardkey = x.Keyboardkey,
                ShortcutKeyEnum = x.ShortcutKeyEnum,
                UserId = _userInfo.UserRoleId,
                AltKey = x.AltKey,
                CtrlKey = x.CtrlKey,
                MetaKey = x.MetaKey,
                ShiftKey = x.ShiftKey,
                Text = x.Text,
                Code = x.Code,
            }));

            return await _shortcutKeyRepository.SaveChangesAsync();
        }




    }
}
