using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.SearchModel.PRD;
using Ropin.Inspection.Model.ViewModel.PRD;
using Ropin.Inspection.Repository.Interface;
using Ropin.Inspection.Repository.PRD.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Repository.PRD
{
    public class BoxApiRepository : RepositoryBase<TSYS_User, Guid>, IBoxApiRepository
    {
        public BoxApiRepository(InspectionDbContext dbContext) : base(dbContext)
        {

        }
        public Task<PrivModel> GetUserPriv(string openId, string deviceCode)
        {
            PrivModel privModel = new PrivModel();
            var user = DbContext.TSYS_User.Where(u => u.C_WechatID == openId).FirstOrDefault();
            var device = DbContext.TDEV_Device.Where(u => u.C_Code == deviceCode).FirstOrDefault();
            if (user != null && device != null)
            {
                var userRole = DbContext.TSYS_UserRole.Where(u => u.C_UserCode == user.C_UserID).FirstOrDefault();
                var storeOrg = DbContext.TPNT_StoreOrg.Where(u => u.C_OrgCode == user.C_OrgCode).FirstOrDefault();
                var product = DbContext.TPRD_Product.Where(u => u.C_Code.Equals(device.C_ProductCode)).FirstOrDefault();
                if (userRole != null || storeOrg != null || product != null)
                {
                    if (storeOrg.C_StoreCode == product.C_StoreCode)
                    {
                        var priv = DbContext.TSYS_Priv.Where(u => u.C_Module == "SYS_PRIV_MODULE_003" && u.C_Type == "SYS_PRIV_TYPE_001").FirstOrDefault();//菜单权限                        
                        var rolePriv = DbContext.TSYS_RolePriv.Where(u => u.C_RoleCode.Equals(userRole.C_RoleCode) && u.C_PrivilegeCode == priv.C_Code).FirstOrDefault();
                        if (rolePriv != null)
                        {
                            var priv2 = DbContext.TSYS_Priv.Where(u => u.C_Module == "SYS_PRIV_MODULE_003" && u.C_Type == "SYS_PRIV_TYPE_002").FirstOrDefault();//操作权限
                            var rolePriv2 = DbContext.TSYS_RolePriv.Where(u => u.C_RoleCode.Equals(userRole.C_RoleCode) && u.C_PrivilegeCode == priv2.C_Code).FirstOrDefault();
                            if (rolePriv2 != null)
                            {
                                privModel.openId = openId;
                                privModel.type = "SYS_PRIV_TYPE_002";
                                privModel.status = "true";
                            }
                            else
                            {
                                privModel.openId = openId;
                                privModel.type = "SYS_PRIV_TYPE_001";
                                privModel.status = "true";
                            }
                            return Task.FromResult(privModel);
                        }
                    }
                }
            }
            privModel.type = "";
            privModel.status = "false";
            return Task.FromResult(privModel);
        }
        public Task<bool> AddDevData(TDEV_DevData devData)
        {
            DbContext.TDEV_DevData.Add(devData);
            var query = DbContext.SaveChanges();
            if (query > 0)
            {
                return Task.FromResult(true);
            }
            return Task.FromResult(false);
        }

        public Task<bool> AddDevAlert(TDEV_DevAlert devAlert)
        {
            DbContext.TDEV_DevAlert.Add(devAlert);
            var query = DbContext.SaveChanges();
            if (query > 0)
            {
                return Task.FromResult(true);
            }
            return Task.FromResult(false);
        }

        public Task<TDEV_Device> GetDeviceInfo(string C_MachineCode)
        {
            var device = DbContext.TDEV_Device.Where(u => u.C_MachineCode == C_MachineCode).FirstOrDefault();
            return Task.FromResult(device);
        }
        public Task<List<TDEV_Device>> GetAllDeviceInfo()
        {
            var device = DbContext.TDEV_Device;
            return Task.FromResult(device.ToList());
        }

        public Task<List<TSYS_User>> GetAllUser()
        {
            var users = DbContext.TSYS_User.ToList();
            return Task.FromResult(users);
        }

        public Task<TDEV_DevAlertConfig> GetDevAlertConfig(string C_ConfigCode)
        {
            var devAlertConfig = DbContext.TDEV_DevAlertConfig.Where(u => u.C_Code == C_ConfigCode).FirstOrDefault();
            return Task.FromResult(devAlertConfig);
        }

        public Task<List<ProductModel>> GetProductInfo(List<epcModel> models)
        {
            List<ProductModel> productModels = new List<ProductModel>();
            List<string> lstepc = models.Select(u => u.C_QRCode).ToList();
            List<TPRD_Product> lstProduct = DbContext.TPRD_Product.Where(u => lstepc.Contains(u.C_QRCode)).ToList();
            if (lstProduct.Count>0)
            {
                foreach (var product in lstProduct)
                {
                    var prodSKU = DbContext.TPRD_ProdSKU.Where(u => u.C_SKUCode == product.C_SKUCode).FirstOrDefault();
                    var store = DbContext.TPNT_Store.Where(u => u.C_Code == product.C_StoreCode).FirstOrDefault();
                    if (prodSKU != null && store != null)
                    {
                        ProductModel productModel = new ProductModel();
                        productModel.C_QRCode = product.C_QRCode;
                        productModel.C_SKUCode = product.C_SKUCode;
                        productModel.C_StoreCode = product.C_StoreCode;
                        productModel.C_DeviceCode = product.C_DeviceCode;
                        productModel.D_ProdDate = product.D_ProdDate;
                        productModel.D_ValiDate = product.D_ValiDate;
                        productModel.C_ImageUrl = product.C_ImageUrl;
                        productModel.D_LastISP = product.D_LastISP;
                        productModel.I_IsAlarm = product.I_IsAlarm;
                        productModel.C_AlarmMsg = product.C_AlarmMsg;
                        productModel.I_Status = product.I_Status;
                        productModel.C_CreateBy = product.C_CreateBy;
                        productModel.D_CreateOn = product.D_CreateOn;
                        productModel.C_Name = prodSKU.C_Name;
                        productModel.C_Spec = prodSKU.C_Spec;
                        productModel.C_Brand = prodSKU.C_Brand;
                        productModel.C_Vender = prodSKU.C_Vender;
                        productModel.C_ProdArea = prodSKU.C_ProdArea;
                        productModel.C_Unit = prodSKU.C_Unit;
                        productModel.C_ImagePath = prodSKU.C_ImagePath;
                        productModel.C_IconPath = prodSKU.C_IconPath;
                        productModel.I_MinStock = prodSKU.I_MinStock;
                        productModel.I_ValiDays = prodSKU.I_ValiDays;
                        productModel.I_AlarmDays = prodSKU.I_AlarmDays;
                        productModel.TypeCode = prodSKU.C_TypeCode;
                        productModel.C_Status = prodSKU.C_Status;
                        productModel.C_StoreName = store.C_Name;
                        productModels.Add(productModel);
                    }
                }
            }
            return Task.FromResult(productModels);
        }

        public Task<List<ProductModel>> GetDevProductInfo(string c_DeviceCode)
        {
            //var page = 1;
            //var pageSize = 10;
            //var query = (from product in DbContext.Set<TPRD_Product>()
            //             join prodSKU in DbContext.Set<TPRD_ProdSKU>() on product.C_SKUCode equals prodSKU.C_SKUCode
            //             join store in DbContext.Set<TPNT_Store>() on product.C_StoreCode equals store.C_Code
            //             where product.C_DeviceCode == c_DeviceCode
            //             orderby product.C_Code descending
            //             select new
            //             {
            //                 product.C_SKUCode,
            //                 prodSKU.C_Name,
            //                 storename = store.C_Name,
            //             }).Skip((page - 1) * pageSize).Take(pageSize);

            List<ProductModel> productModels = new List<ProductModel>();
            var product = DbContext.TPRD_Product.Where(u => u.C_DeviceCode == c_DeviceCode && u.I_Status == 2).ToList();
            if (product.Count > 0)
            {
                foreach (var item in product)
                {
                    var prodSKU = DbContext.TPRD_ProdSKU.Where(u => u.C_SKUCode == item.C_SKUCode).FirstOrDefault();
                    var store = DbContext.TPNT_Store.Where(u => u.C_Code == item.C_StoreCode).FirstOrDefault();
                    if (prodSKU != null && store != null)
                    {
                        ProductModel productModel = new ProductModel();
                        productModel.C_QRCode = item.C_QRCode;
                        productModel.C_SKUCode = item.C_SKUCode;
                        productModel.C_StoreCode = item.C_StoreCode;
                        productModel.C_DeviceCode = item.C_DeviceCode;
                        productModel.D_ProdDate = item.D_ProdDate;
                        productModel.D_ValiDate = item.D_ValiDate;
                        productModel.C_ImageUrl = item.C_ImageUrl;
                        productModel.D_LastISP = item.D_LastISP;
                        productModel.I_IsAlarm = item.I_IsAlarm;
                        productModel.C_AlarmMsg = item.C_AlarmMsg;
                        productModel.I_Status = item.I_Status;
                        productModel.C_CreateBy = item.C_CreateBy;
                        productModel.D_CreateOn = item.D_CreateOn;
                        productModel.C_Name = prodSKU.C_Name;
                        productModel.C_Spec = prodSKU.C_Spec;
                        productModel.C_Brand = prodSKU.C_Brand;
                        productModel.C_Vender = prodSKU.C_Vender;
                        productModel.C_ProdArea = prodSKU.C_ProdArea;
                        productModel.C_Unit = prodSKU.C_Unit;
                        productModel.C_ImagePath = prodSKU.C_ImagePath;
                        productModel.C_IconPath = prodSKU.C_IconPath;
                        productModel.I_MinStock = prodSKU.I_MinStock;
                        productModel.I_ValiDays = prodSKU.I_ValiDays;
                        productModel.I_AlarmDays = prodSKU.I_AlarmDays;
                        productModel.TypeCode = prodSKU.C_TypeCode;
                        productModel.C_Status = prodSKU.C_Status;
                        productModel.C_StoreName = store.C_Name;
                        productModels.Add(productModel);
                    }
                }
            }
            return Task.FromResult(productModels);
        }

        public Task<bool> UpOffRackProduct(ProductInfoModel model)
        {
            List<string> lstepc = model.goods.Select(u => u.C_QRCode).ToList();
            List<TPRD_Product> lstProduct = DbContext.TPRD_Product.Where(u => lstepc.Contains(u.C_QRCode)).ToList();
            foreach (var item in lstProduct)
            {
                item.C_DeviceCode = model.C_DeviceCode;
                item.I_Status = model.goods.Where(u => u.C_QRCode == item.C_QRCode).FirstOrDefault().I_Status;
                item.C_LastUpdatedBy = model.C_CreateBy;
                item.D_LastUpdatedOn = DateTime.Now;
            }
            var query = DbContext.SaveChanges();
            if (query > 0)
            {
                return Task.FromResult(true);
            }
            return Task.FromResult(false);
        }

        public Task<UserModel> GetUserInfo(string openid)
        {
            var user = DbContext.TSYS_User.Where(u => u.C_WechatID == openid && u.C_Status == "1").FirstOrDefault();
            UserModel model = new UserModel();
            model.C_UserID = user.C_UserID;
            model.C_UserName = user.C_UserName;
            model.I_Render = user.I_Render;
            model.D_Birthday = user.D_Birthday;
            model.C_Post = user.C_Post;
            model.C_ProgramID = user.C_ProgramID;
            model.C_OrgCode = user.C_OrgCode;
            model.C_IDNum = user.C_IDNum;
            model.C_Address = user.C_Address;
            model.C_Email = user.C_Email;
            model.C_ImagePath = user.C_ImagePath;
            model.C_Mobile = user.C_Mobile;
            model.C_Phone = user.C_Phone;
            model.C_Status = user.C_Status;
            return Task.FromResult(model);
        }
    }
}