using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Ropin.Inspection.Api.Common;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.SearchModel.PRD;
using Ropin.Inspection.Model.ViewModel.PRD;
using Ropin.Inspection.Service.PRD.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Ropin.Inspection.Api.Controllers.PRD
{
    [Route("api/[controller]")]
    [ApiController]
    public class BoxApiController : ControllerBase
    {
        public ILogger<BoxApiController> _logger { get; }
        private readonly IBoxApiService _service;

        public BoxApiController(IBoxApiService service,ILogger<BoxApiController> logger)
        {
            _service = service;
            _logger = logger;
        }

        /// <summary>
        /// 扫码登录获取权限
        /// </summary>
        /// <param name="openId"></param>
        /// <param name="deviceCode"></param>
        /// <returns></returns>
        [Route("GetUserPriv")]
        [HttpPost]
        public async Task<object> GetUserPriv(string openId, string deviceCode)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(openId) && string.IsNullOrEmpty(deviceCode))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var userpriv = await _service.GetUserPriv(openId, deviceCode);
                dataInfo.Add(DataEnum.code.ToString(), "000000");
                dataInfo.Add(DataEnum.data.ToString(), userpriv);
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 新增运行数据记录
        /// </summary>
        /// <param name="C_DeviceCode"></param>
        /// <param name="C_ConfigCode"></param>
        /// <param name="C_Value"></param>
        /// <returns></returns>
        [Route("AddDevData")]
        [HttpPost]
        public async Task<object> AddDevData(string C_DeviceCode, string C_ConfigCode, string C_Value)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(C_DeviceCode) && string.IsNullOrEmpty(C_ConfigCode) && string.IsNullOrEmpty(C_Value))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var devData = await _service.AddDevData(C_DeviceCode, C_ConfigCode, C_Value);
                if (devData)
                {
                    dataInfo.Add(DataEnum.code.ToString(), "000000");
                    dataInfo.Add(DataEnum.data.ToString(), "操作成功!");
                }
                else
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100002");
                    dataInfo.Add(DataEnum.data.ToString(), "操作失败!");
                }
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 新增报警记录
        /// </summary>
        /// <param name="C_DeviceCode"></param>
        /// <param name="C_ConfigCode"></param>
        /// <param name="C_Value"></param>
        /// <returns></returns>
        [Route("AddDevAlert")]
        [HttpPost]
        public async Task<object> AddDevAlert(string C_DeviceCode, string C_ConfigCode, string C_Value)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(C_DeviceCode) && string.IsNullOrEmpty(C_ConfigCode) && string.IsNullOrEmpty(C_Value))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var devAlert = await _service.AddDevAlert(C_DeviceCode, C_ConfigCode, C_Value);
                if (devAlert)
                {
                    dataInfo.Add(DataEnum.code.ToString(), "000000");
                    dataInfo.Add(DataEnum.data.ToString(), "操作成功!");
                }
                else
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100002");
                    dataInfo.Add(DataEnum.data.ToString(), "操作失败!");
                }
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }
        /// <summary>
        /// 根据设备编码获取设备信息
        /// </summary>
        /// <param name="C_MachineCode"></param>
        /// <returns></returns>
        [Route("GetDeviceInfo")]
        [HttpPost]
        public async Task<object> GetDeviceInfo(string C_MachineCode)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(C_MachineCode))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var deviceInfo = await _service.GetDeviceInfo(C_MachineCode);
                dataInfo.Add(DataEnum.code.ToString(), "000000");
                dataInfo.Add(DataEnum.data.ToString(), deviceInfo);
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 根据openid获取用户信息
        /// </summary>
        /// <param name="openid"></param>
        /// <returns></returns>
        [Route("GetUserInfo")]
        [HttpPost]
        public async Task<object> GetUserInfo(string openid)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(openid))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var userInfo = await _service.GetUserInfo(openid);
                dataInfo.Add(DataEnum.code.ToString(), "000000");
                dataInfo.Add(DataEnum.data.ToString(), userInfo);
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 根据epc获取器具信息
        /// </summary>
        /// <param name="models"></param>一个或多个epc
        /// <returns></returns>
        [Route("GetProductInfo")]
        [HttpPost]
        public async Task<object> GetProductInfo(List<epcModel> models)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (models.Count > 0)
                {
                    var productInfo = await _service.GetProductInfo(models);
                    dataInfo.Add(DataEnum.code.ToString(), "000000");
                    dataInfo.Add(DataEnum.data.ToString(), productInfo);
                    return dataInfo;
                }
                else
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 根据设备号获取所有器具信息
        /// </summary>
        /// <param name="C_DeviceCode"></param>  
        /// <returns></returns>
        [Route("GetDevProductInfo")]
        [HttpPost]
        public async Task<object> GetDevProductInfo(string C_DeviceCode)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (string.IsNullOrEmpty(C_DeviceCode))
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
                var devProductInfo = await _service.GetDevProductInfo(C_DeviceCode);
                dataInfo.Add(DataEnum.code.ToString(), "000000");
                dataInfo.Add(DataEnum.data.ToString(), devProductInfo);
                return dataInfo;
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }

        /// <summary>
        /// 上架/下架/盘点
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [Route("UpOffRackProduct")]
        [HttpPost]
        public async Task<object> UpOffRackProduct(ProductInfoModel model)
        {
            Dictionary<string, object> dataInfo = new Dictionary<string, object>();
            try
            {
                if (model.goods.Count > 0)
                {
                    foreach (var item in model.goods)
                    {
                        if (string.IsNullOrEmpty(item.C_QRCode))
                        {
                            dataInfo.Add(DataEnum.code.ToString(), "100001");
                            dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                            return dataInfo;
                        }
                    }
                    var devAlert = await _service.UpOffRackProduct(model);
                    if (devAlert)
                    {
                        dataInfo.Add(DataEnum.code.ToString(), "000000");
                        dataInfo.Add(DataEnum.data.ToString(), "操作成功!");
                    }
                    else
                    {
                        dataInfo.Add(DataEnum.code.ToString(), "100002");
                        dataInfo.Add(DataEnum.data.ToString(), "操作失败!");
                    }
                    return dataInfo;
                }
                else
                {
                    dataInfo.Add(DataEnum.code.ToString(), "100001");
                    dataInfo.Add(DataEnum.data.ToString(), "传入参数为空!");
                    return dataInfo;
                }
            }
            catch (Exception ex)
            {
                dataInfo.Add(DataEnum.code.ToString(), "100003");
                dataInfo.Add(DataEnum.data.ToString(), ex.Message);
                return dataInfo;
            }
        }
        /// <summary>
        /// 获取所有的设备
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetAllDeviceInfo")]
        public async Task<ApiResult> GetAllDeviceInfo()
        {
            try
            {
                var items = await _service.GetAllDeviceInfo();
                return new ApiResult<IEnumerable<TDEV_Device>>(items);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
    }
}