using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Ropin.Inspection.Api.Common;
using Ropin.Inspection.Api.Controllers;
using Ropin.Inspection.Model;
using Ropin.Inspection.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Ropin.Core.Extensions.Redis;
using Ropin.Core.Common;
using Ropin.Inspection.Service.DEV.Interface;
using Ropin.Inspection.Model.ViewModel.DEV;
using Newtonsoft.Json.Linq;
using Ropin.Inspection.Model.SearchModel.DEV;
using System.Text.RegularExpressions;

namespace Ropin.Inspection.Api
{

    public class TdevDevStoreController : BaseController
    {
        public ILogger<TdevDevStoreController> _logger { get; }
        private readonly ITdevDevStoreService _TdevDevStoreService;
        private readonly IPushMsgService _pushMsgService;
        private readonly IRedisBasketRepository _redisBasketRepository;
        private readonly ITdevDevOpeAccountService _tdevDevOpeAccountService;
        private readonly IDevDevOpeAccountConfigService _devDevOpeAccountConfigService;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="TdevDevStoreService"></param>
        /// <param name="logger"></param>
        public TdevDevStoreController(ITdevDevStoreService TdevDevStoreService, ITdevDevOpeAccountService tdevDevOpeAccountService,IRedisBasketRepository redisBasketRepository, IPushMsgService pushMsgService, ILogger<TdevDevStoreController> logger, IDevDevOpeAccountConfigService devDevOpeAccountConfigService)
        {
            _TdevDevStoreService = TdevDevStoreService;
            _logger = logger;
            _pushMsgService = pushMsgService;
            _redisBasketRepository = redisBasketRepository;
            _tdevDevOpeAccountService = tdevDevOpeAccountService;
            _devDevOpeAccountConfigService = devDevOpeAccountConfigService;
        }

        /// <summary>
        /// 通过id获取业主设备信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                var content = await _TdevDevStoreService.GetConditionAsync(new TdevDevStoreSearchModel { C_ID = id, type= "details" });
                var dev = content.FirstOrDefault();
                
                var user = await _TdevDevStoreService.GetUserByDevStoreIdAndRoleNameAsync(id,"设备管理员");
                if(dev != null)
                dev.DevManager = user?.C_Name;
                return new ApiResult<TdevDevStoreViewModel>(dev);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        /// <summary>
        /// 通过id获取业主设备二维码地址信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreQRCodeAsync/{id}")]
        public async Task<ApiResult> GetDevStoreQRCodeAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                var content = await _TdevDevStoreService.GetDevStoreQRCodeAsync(id);
                return new ApiResult<string>(content);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

        /// <summary>
        /// 获取所有业主设备
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetDevStoresAsync")]
        public async Task<ApiResult> GetDevStoresAsync()
        {
            try
            {
                var contentList = await _TdevDevStoreService.GetAllAsync();
                return new ApiResult<IEnumerable<TdevDevStoreViewModel>>(contentList);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

        /// <summary>
        /// 通过业主设备名称条件查询
        /// </summary>
        /// <param name="searchModel"></param>
        /// <returns></returns>
        [HttpPost("GetDevStoresByAsync")]
        public async Task<ApiResult> GetDevStoresByAsync(TdevDevStoreSearchModel searchModel)
        {
            if (searchModel == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            //searchModel.IsPagination = false;
            try
            {
                var contentList = await _TdevDevStoreService.GetConditionAsync(searchModel);

                PagesModel<TdevDevStoreViewModel> pages = new PagesModel<TdevDevStoreViewModel>(searchModel.IsPagination ? contentList.Skip((searchModel.PageIndex - 1) * searchModel.PageSize).Take(searchModel.PageSize) : contentList, searchModel);

                return new ApiResult<PagesModel<TdevDevStoreViewModel>>(pages);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

        /// <summary>
        /// 通过业主设备名称条件查询(数据包时间)
        /// </summary>
        /// <param name="searchModel"></param>
        /// <returns></returns>
        [HttpPost("GetDevStoresByAsync1")]
        public async Task<ApiResult> GetDevStoresByAsync1(TdevDevStoreSearchModel searchModel)
        {
            if (searchModel == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            //searchModel.IsPagination = false;
            try
            {
                var contentList = await _TdevDevStoreService.GetConditionAsync(searchModel);
                foreach (var item in contentList)
                {
                    if (item!=null)
                    {
                        var content = await _redisBasketRepository.GetValue(RedisKey.Fanyibox_DevStore_ + item.C_ID);
                        if (content!=null)
                        {
                            try
                            {
                                JObject jsonObj = JObject.Parse(content);
                                if (jsonObj != null&& jsonObj["package"].Any())
                                {
                                    JObject address = (JObject)jsonObj["package"];
                                    item.packageTime = address["time"].ToString();
                                }
                            }
                            catch
                            {

                            }
                        }
                    }
                }
                PagesModel<TdevDevStoreViewModel> pages = new PagesModel<TdevDevStoreViewModel>(searchModel.IsPagination ? contentList.Skip((searchModel.PageIndex - 1) * searchModel.PageSize).Take(searchModel.PageSize) : contentList, searchModel);

                return new ApiResult<PagesModel<TdevDevStoreViewModel>>(pages);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        
        /// <summary>
        /// 业主设备状态统计
        /// </summary>
        /// <param name="searchModel"></param>
        /// <returns></returns>
        [HttpPost("GetDevStoreStatusCount")]
        public async Task<ApiResult> GetDevStoreStatusCount(TdevDevStoreSearchModel searchModel)
        {
            if (searchModel == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                var contentList = await _TdevDevStoreService.GetDevStoreStatusCount(searchModel);
                PagesModel<DevStoreStatusGroup> pages = new PagesModel<DevStoreStatusGroup>(searchModel.IsPagination ? contentList.Skip((searchModel.PageIndex - 1) * searchModel.PageSize).Take(searchModel.PageSize) : contentList, searchModel);
                return new ApiResult<PagesModel<DevStoreStatusGroup>>(pages);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        /// <summary>
        /// 创建业主设备
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        [HttpPost("CreateDevStoreAsync")]
        public async Task<ApiResult> CreateDevStoreAsync(TdevDevStoreViewModel content)
        {
            if (content == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                await _TdevDevStoreService.CreateOneAsync(content);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }

        /// <summary>
        /// 删除业主设备
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("DeleteDevStoreAsync/{id}")]
        public async Task<ApiResult> DeleteDevStoreAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreService.DeleteAsync(id);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }
        /// <summary>
        /// 更新业主设备
        /// </summary>
        /// <param name="id"></param>
        /// <param name="updateModel"></param>
        /// <returns></returns>
        [HttpPut("UpdateDevStoreAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> UpdateDevStoreAsync(string id, TdevDevStoreUpdateModel updateModel)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreService.UpdateAsync(id, updateModel);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }

        /// <summary>
        /// 通过二维码获取点及设备信息
        /// </summary>
        /// <param name="qRCode"></param>
        /// <param name="storeCode"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreByQRCodeAsync/{qRCode}/{storeCode}")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreByQRCodeAsync(string qRCode, string storeCode)
        {
            try
            {
                if (string.IsNullOrEmpty(qRCode) || string.IsNullOrEmpty(storeCode))
                {
                    return new ApiResult(ReturnCode.GeneralError);
                }
                var spot = await _TdevDevStoreService.GetDevStoreByQRCodeAsync(qRCode, storeCode);
                if (null == spot)
                {
                    return new ApiResult<TdevDevStoreDetailViewModel>(spot, ReturnCode.ResultError, "没找到此二维码对应的点,请联系管理员!");
                }
                return new ApiResult<TdevDevStoreDetailViewModel>(spot);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        /// <summary>
        /// 操作设备
        /// </summary>
        /// <param name="mode"></param>
        /// <returns></returns>
        [HttpPost("DevOperateByQRCodeAsync")]
        [AllowAnonymous]
        public async Task<ApiResult> DevOperateByQRCodeAsync(DevOperateCreateModel mode)
        {
            if (mode == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                await _TdevDevStoreService.DevOperateByQRCodeAsync(mode);
                //await _redisBasketRepository.Set(RedisKey.Fanyibox_Ope_DevStore + mode.C_DevStoreCode, mode.C_Type, TimeSpan.FromDays(7));
                await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel
                {
                    C_DevStoreCode = mode.C_DevStoreCode,
                    C_MsgTypeCode = "MSG_TYPE_011",
                    Msg = mode.C_Remark,
                    Subject = "设备启停 " + mode.C_LogMsg,
                    DevNumber = String.Empty,
                    DevName =String.Empty,
                    GenerationType = 2,
                    msgStatus = 4,
                }, "设备启停");
                //string strContent = "";
                //await _tdevDevOpeAccountService.CreateOneAsync(new TdevDevOpeAccountViewModel{ C_DevStoreCode = mode.C_DevStoreCode,C_Content = strContent });

            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }
        /// <summary>
        /// 获取设备运行点配置
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreRunSpotConfigAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreRunSpotConfigAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                //TDEV_DevRunSpot
                //var content = await _TdevDevStoreService.GetConditionAsync(new TdevDevStoreSearchModel { C_ID = id });
                //TdevDevStoreRunSpotConfigViewModel mode = new TdevDevStoreRunSpotConfigViewModel();
                ////RunSpotConfig f1 = new RunSpotConfig() { Name = "排污口编号",Value = "325465465" };
                ////RunSpotConfig f2 = new RunSpotConfig() { Name = "设施名称",Value = "VOCs治理设施" };
                ////mode.RunSpotConfigList = new List<RunSpotConfig>() { f1,f2};
                //if (content.FirstOrDefault().C_RunSpotConfig == null)
                //    return new ApiResult<IEnumerable<string>>(new List<string>());
                //else
                //return new ApiResult<TdevDevStoreRunSpotConfigViewModel>(JsonConvert.DeserializeObject<TdevDevStoreRunSpotConfigViewModel>(content.FirstOrDefault().C_RunSpotConfig));
                var content = await _devDevOpeAccountConfigService.GetDevOpeAccountConfigModelAsync(id);
                if (content == null|| string.IsNullOrEmpty(content.C_Config))
                {
                    return new ApiResult<IEnumerable<string>>(new List<string>());
                }
                else
                {
                    return new ApiResult<TdevDevOpeAccountConfigViewModel>(JsonConvert.DeserializeObject<TdevDevOpeAccountConfigViewModel>(content.C_Config));
                }
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        /// <summary>
        /// 更新设备运行点配置
        /// </summary>
        /// <param name="id"></param>
        /// <param name="updateModel"></param>
        /// <returns></returns>

        [HttpPut("UpdateDevStoreRunSpotConfigAsync/{id}")]
        public async Task<ApiResult> UpdateDevStoreRunSpotConfigAsync(string id, TdevDevStoreRunSpotConfigViewModel updateModel)
        {
            if (string.IsNullOrEmpty(id)|| updateModel == null || updateModel.RunSpotConfigList == null || updateModel.RunSpotConfigList.Count() == 0)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                string ZzEnglish = @"^[a-zA-Z]+$";
                string MsgStr = "";
                List<string> errorStr = new List<string>();
                foreach (var item in updateModel.RunSpotConfigList)
                {
                    bool isValid = Regex.IsMatch(item.Name, ZzEnglish);
                    if (!isValid)
                    {
                        errorStr.Add(item.Name);
                    }
                }
                List<string> RepeatNameList = updateModel.RunSpotConfigList.GroupBy(e => e.Name).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
                if (errorStr != null && errorStr.Count > 0)
                {
                    string errorMsg = string.Join(", ", errorStr);
                    MsgStr = $"【{errorMsg}】英文标签存在特殊字符。";
                }
                if (RepeatNameList != null && RepeatNameList.Count > 0)
                {
                    string RepeatMsg = string.Join(", ", RepeatNameList);
                    MsgStr = MsgStr + $"【{RepeatMsg}】英文标签重复。";
                }
                if (!string.IsNullOrEmpty(MsgStr))
                {
                    return new ApiResult(ReturnCode.ArgsError, MsgStr);
                }
                await _TdevDevStoreService.UpdateDevStoreRunSpotConfigAsync(id, updateModel);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }
        /// <summary>
        ///  更新设备用户配置
        /// </summary>
        /// <param name="id"></param>
        /// <param name="updateModel"></param>
        /// <returns></returns>
        [HttpPut("UpdateDevStoreUserConfigAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> UpdateDevStoreUserConfigAsync(string id, TdevDevStoreUserConfigViewModel updateModel)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreService.UpdateDevStoreUserConfigAsync(id, updateModel);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }
        /// <summary>
        /// 获取设备用户配置
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreUserConfigAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreUserConfigAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                var content = await _TdevDevStoreService.GetConditionAsync(new TdevDevStoreSearchModel { C_ID = id });
                if(content.FirstOrDefault().C_UserConfig == null)
                {
                    return new ApiResult<IEnumerable<DevStoreUser>>(new List<DevStoreUser>());
                }
                else
                {
                    IEnumerable<DevStoreUser> users = JsonConvert.DeserializeObject<IEnumerable<DevStoreUser>>(content.FirstOrDefault().C_UserConfig).OrderBy(t=>t.Sort);
                    return new ApiResult<IEnumerable<DevStoreUser>>(users);
                }
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

        /// <summary>
        /// 拷贝业主设备信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpPost("CopyDevStoreInfo")]
        [AllowAnonymous]
        public async Task<ApiResult> CopyDevStoreInfo(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreService.CopyCreateOneAsync(id);
                return new ApiResult(ReturnCode.Success);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

    }
}