using Model.ModelDto.SysDto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using WMS.Entity.Context;
using WMS.Entity.SysEntity;
using WMS.IDAL;
using WMS.IDAL.ISysInterface;
using System.Security.Cryptography;
using System.Text.RegularExpressions;

namespace WMS.DAL.SysInfrastructure
{
    /// <summary>
    /// 功能设定仓储实践
    /// </summary>
    public class FunSettingRepository : BaseRepository<SysFunSetting>, IFunSettingRepository
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public FunSettingRepository() : base(Db)
        {
        }

        /// <summary>
        /// 获取功能设定信息列表
        /// </summary>
        /// <param name="FunSetName">功能名称</param>
        /// <param name="IsEnable">开启状态</param>
        /// <param name="GroupNo">组号</param>
        /// <returns></returns>
        public List<FunSettingDto> GetFunSettingList(string FunSetName, string IsEnable, string GroupNo)
        {
            string str = "select setting.*,user1.RealName CreateName from SysFunSetting setting left join SysUserInfor user1 on setting.CreateUser = user1.Id where setting.IsDel = @isdel";
            //判断功能名称是否为空
            if (!string.IsNullOrEmpty(FunSetName))
            {
                str += " and setting.FunSetName like @funsetname";
            }
            //判断开启状态
            if (!string.IsNullOrEmpty(IsEnable))
            {
                str += " and setting.IsEnable = @isenable";
            }
            //判断组号
            if (!string.IsNullOrEmpty(GroupNo))
            {
                str += " and setting.GroupNo like @groupno";
            }
            //排序
            str += " order by setting.GroupNo,setting.Ord,setting.Id";
            List<FunSettingDto> settinglist = Db.Ado.SqlQuery<FunSettingDto>(str, new
            {
                isdel = "0", //是否删除
                funsetname = "%" + FunSetName + "%", //功能名称
                isenable = IsEnable, //开启状态
                groupno = "%" + GroupNo + "%" //组号
            });
            return settinglist;
        }

        /// <summary>
        /// 根据id查询功能设定信息
        /// </summary>
        /// <param name="id">功能id</param>
        /// <returns></returns>
        public SysFunSetting GetFunSettingById(int id)
        {
            string str = "select * from SysFunSetting where IsDel = @isdel and Id = @id";
            SysFunSetting settinglist = Db.Ado.SqlQuery<SysFunSetting>(str, new
            {
                isdel = "0",
                id
            }).First();
            return settinglist;
        }

        ///// <summary>
        ///// 根据编号查询功能设定信息
        ///// </summary>
        ///// <param name="FunSetNo">功能编号</param>
        ///// <returns></returns>
        //public List<SysFunSetting> GetFunSettingByNo(string FunSetNo)
        //{
        //    string str = "select * from SysFunSetting where FunSetNo = @funsetno";
        //    List<SysFunSetting> settinglist = Db.Ado.SqlQuery<SysFunSetting>(str, new
        //    {
        //        funsetno = FunSetNo //功能编号
        //    });
        //    return settinglist;
        //}

        /// <summary>
        /// 新增功能信息
        /// </summary>
        /// <param name="setting">功能设定实体</param>
        /// <returns></returns>
        public async Task<int> AddFunSettings(SysFunSetting setting)
        {
            if (setting.FunSetNo == "Fun013")
            {
                if (int.Parse(setting.SetValue) < 5 || int.Parse(setting.SetValue) > 200)
                {
                    throw new Exception("该功能必须为5到200之间");
                }
            }
            string str = "insert into sysfunsetting values(@funsetno, @funsetname, @setvalue, @funtext, @isenable, @ord, @groupno, @isdel, @createtime, @createuser, null, null)";
            string sql = "select * from SysFunSetting where FunSetNo = @funsetno and Ord = @ord and IsDel = @isdel";
            SysFunSetting sett = new SysFunSetting();
            if (!string.IsNullOrEmpty(setting.GroupNo))
            {
                sett = Db.Ado.SqlQuerySingle<SysFunSetting>(sql, new
                {
                    funsetno = setting.GroupNo, //组号
                    ord = "1", //显示顺序
                    isdel = "0" //是否删除
                });
            }

            int i;
            //获取当前组显示顺序
            //string sql = "select max(ord) Ord from SysFunSetting where GroupNo = @groupno and IsDel = @isdel";
            //判断显示顺序数量是否符合
            if (Convert.ToInt32(setting.Ord) <= 5 && Convert.ToInt32(setting.Ord) >= 1)
            {
                if (sett != null || !string.IsNullOrEmpty(setting.GroupNo))
                {
                    string sql1 = "select Count(IsEnable) IsEnable from SysFunSetting where GroupNo = @group and IsDel = @isdel and IsEnable = @isenable";
                    SysFunSetting count = Db.Ado.SqlQuerySingle<SysFunSetting>(sql1, new
                    {
                        group = setting.GroupNo, //组号
                        isdel = "0", //是否删除
                        isenable = "No" //是否开启 每一组只能有一个开启
                    });
                    if (count.IsEnable == "0" || setting.IsEnable == "OFF")
                    {
                        i = await Db.Ado.ExecuteCommandAsync(str, new
                        {
                            funsetno = setting.FunSetNo, //功能编号
                            funsetname = setting.FunSetName, //功能名称
                            setvalue = setting.SetValue, //设定值
                            funtext = setting.FunText, //功能描述
                            isenable = setting.IsEnable, //是否开启
                            ord = setting.GroupNo == "" ? "1" : setting.Ord,
                            groupno = setting.GroupNo == "" ? setting.FunSetNo : setting.GroupNo, //组号 判断表单组号是否为空 是 当前编号 否 输入组号
                            isdel = "0", //是否删除
                            createtime = Db.GetDate(), //创建时间
                            createuser = setting.CreateUser //创建人
                        });
                    }
                    else
                    {
                        i = 6;
                    }
                }
                else
                {
                    i = 5;
                }
            }
            else
            {
                i = 4;
            }
            return i;
        }

        /// <summary>
        /// 删除功能信息
        /// </summary>
        /// <param name="setting">功能设定实体</param>
        /// <returns></returns>
        public async Task<int> DelFunSettings(SysFunSetting setting)
        {
            string str = "update SysFunSetting set IsDel = @isdel,UpdateTime = @updatetime,UpdateUser = @updateuser where id = @id";
            int i = await Db.Ado.ExecuteCommandAsync(str, new
            {
                isdel = "1", //是否删除
                updatetime = Db.GetDate(), //更改时间
                updateuser = setting.CreateUser, //更改人
                id = setting.Id //id
            });
            return i;
        }

        /// <summary>
        /// 编辑功能信息
        /// </summary>
        /// <param name="setting">功能设定实体</param>
        /// <returns></returns>
        public async Task<int> ExitFunSettings(SysFunSetting setting)
        {
            if (setting.FunSetNo == "Fun013")
            {
                if (int.Parse(setting.SetValue) < 5 || int.Parse(setting.SetValue) > 200)
                {
                    throw new Exception("该功能必须为5到200之间");
                }
            }
            string str = "update SysFunSetting set FunSetName = @funsetname, SetValue = @setvalue, FunText = @funtext, IsEnable = @isenable, Ord = @ord, GroupNo = @groupno, UpdateTime = @updatetime,UpdateUser = @updateuser where id = @id";
            int i;
            string sql1 = "select Count(IsEnable) IsEnable from SysFunSetting where GroupNo = @group and IsDel = @isdel and IsEnable = @isenable and Id!= @id ";
            SysFunSetting count = Db.Ado.SqlQuerySingle<SysFunSetting>(sql1, new
            {
                group = setting.GroupNo, //组号
                isdel = "0", //是否删除
                isenable = "No", //是否开启 每一组只能有一个开启
                id = setting.Id
            });
            if (count.IsEnable == "0" || setting.IsEnable == "OFF")
            {
                i = await Db.Ado.ExecuteCommandAsync(str, new
                {
                    funsetname = setting.FunSetName, //功能名称
                    setvalue = setting.SetValue, //设定值
                    funtext = setting.FunText, //功能描述
                    isenable = setting.IsEnable, //是否开启
                    ord = setting.Ord, //显示顺序
                    groupno = setting.GroupNo, //组号
                    updatetime = Db.GetDate(), //更改时间
                    updateuser = setting.CreateUser, //更改人
                    id = setting.Id //id
                });
            }
            else
            {
                i = 6;
            }
            return i;
        }
    }
}