namespace OASystem.API.Controllers
{
    /// <summary>
    /// 系统设置
    /// </summary>
    [Authorize]
    [Route("api/[controller]/[action]")]
    public class SystemController : ControllerBase
    {
      
        private readonly CompanyRepository _syscomRep;
        private readonly DepartmentRepository _sysDepRep;
        private readonly UsersRepository _userRep;
        private readonly IMapper _mapper;

        public SystemController( CompanyRepository syscom,DepartmentRepository sysDepRep, UsersRepository userRep,
            IMapper mapper)
        {
            _syscomRep = syscom;
            _sysDepRep = sysDepRep;
            _userRep = userRep;
            _mapper = mapper;
        }

        #region user 操作
        /// <summary>
        /// 查询所有员工(web)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetUserList(DtoBase dto)
        {
            try
            {
                var result = _userRep.GetUserList(dto.PortType,string.Empty);
                if (result.Result.Code != 0)
                {
                    return Ok(JsonView(false, "暂无数据!"));

                }
                return Ok(JsonView(true,"查询成功!",result.Result.Data));
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        #endregion

        #region 企业操作
        /// <summary>
        /// 查询企业数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> getCompanyList(DtoBase dto)
        {
            try
            {
                if (dto.PortType == 1)
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
                else if (dto.PortType == 2)
                {
                    var companyList = _sysDepRep.QueryDto<Sys_Company, CompanyView>(a=>a.IsDel!=null).ToList();
                    if (companyList.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    return Ok(JsonView(true,"查询成功!",companyList));
                }
                else if (dto.PortType == 3)
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
                else
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        /// <summary>
        /// 添加企业数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView),StatusCodes.Status200OK)]
        public async Task<IActionResult> AddCompany(AddCompanyDto dto)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(dto.CompanyName) || dto.CreateUserId == 0 || string.IsNullOrWhiteSpace(dto.CompanyCode))
                {
                    return Ok(JsonView(false, "请检查信息是否输入完整!"));
                }
                else if (string.IsNullOrWhiteSpace(dto.Tel))
                {
                    return Ok(JsonView(false, "请检查联系方式是否输入正确!"));
                }
                else
                {
                    Sys_Company _Company = _mapper.Map<Sys_Company>(dto);
                    int id = await _syscomRep.AddAsyncReturnId(_Company);
                    if (id == 0)
                    {
                        return Ok(JsonView(false, "添加失败!"));

                    }
                    return Ok(JsonView(true,"添加成功", new { Id = id }));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
            
            
        }

        /// <summary>
        /// 企业修改
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult>EditCompany(EditCompanyDto dto)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(dto.CompanyName) || string.IsNullOrWhiteSpace(dto.CompanyCode) || string.IsNullOrWhiteSpace(dto.Address) || dto.ParentCompanyId == 0 || dto.ContactUserId == 0)
                {
                    return Ok(JsonView(false, "请检查信息是否输入完整!"));
                }
                else if (string.IsNullOrWhiteSpace(dto.Tel))
                {
                    return Ok(JsonView(false, "请检查联系方式是否输入正确!"));
                }
                else
                {
                    bool res = await _syscomRep.UpdateAsync(a => a.Id == dto.Id, a => new Sys_Company
                    {
                        CompanyName = dto.CompanyName,
                        CompanyCode = dto.CompanyCode,
                        Address = dto.Address,
                        ParentCompanyId = dto.ParentCompanyId,
                        Tel = dto.Tel,
                        ContactUserId = dto.ContactUserId,
                    });
                    if (!res) { return Ok(JsonView(false, "修改失败")); }
                    return Ok(JsonView(true,"修改成功!"));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
            
            
        }

         /// <summary>
        /// 企业删除
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelCompany(DelCompanyDto dto)
        {
            try
            {
                bool res = await _syscomRep.SoftDeleteAsync<Sys_Company>(dto.Id.ToString());
                if (!res) { return Ok(JsonView(false, "删除失败")); }
                return Ok(JsonView(true, "删除成功"));
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
           
            

        }
        #endregion

        #region 部门操作

        /// <summary>
        /// 查询部门数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        //[Authorize]
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QueryDepartmentList(DepartmentDto dto)
        {
            try
            {
                if (dto.PortType==1)
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
                else if (dto.PortType==2)
                {
                    var result = _sysDepRep.QueryDto<Sys_Department, DepartmentIView>(s => s.CompanyId == dto.CompanyId).ToList();
                    if (result.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    return Ok(JsonView(true,"查询成功!",result));
                }
                else if (dto.PortType == 3)
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
                else
                {
                    return Ok(JsonView(false, "暂无数据!"));
                }
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
         
        }
        /// <summary>
        /// 部门添加
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> AddDepartment(AddDepartmentDto dto)
        {
            try
            {
                if (dto.CreateUserId == 0 || string.IsNullOrWhiteSpace(dto.DepName) || dto.CompanyId == 0 || string.IsNullOrWhiteSpace(dto.DepCode))
                {
                    return Ok(JsonView(false, "请检查信息是否输入完整!"));
                }
                else
                {
                    Sys_Department _Department = _mapper.Map<Sys_Department>(dto);
                    int id = await _sysDepRep.AddAsyncReturnId(_Department);
                    if (id == 0)
                    {
                        return Ok(JsonView(false, "添加失败!"));
                    }
                    return Ok(JsonView(true, "添加成功!", new { Id = id }));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
            
           
        }

        /// <summary>
        /// 部门修改
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> EditDepartment(EditDepartmentDto dto)
        {
            try
            {
                if (dto.Id==0 || string.IsNullOrWhiteSpace(dto.DepName) || dto.CompanyId == 0 || string.IsNullOrWhiteSpace(dto.DepCode))
                {
                    return Ok(JsonView(false, "请检查信息是否输入完整!"));
                }
                else
                {
                    bool res = await _sysDepRep.UpdateAsync<Sys_Department>(a => a.Id == dto.Id, a => new Sys_Department
                    {
                        CompanyId=dto.CompanyId,
                        DepCode=dto.DepCode,
                        DepName=dto.DepName,
                        ParentDepId=dto.ParentDepId,
                        Remark=dto.Remark,
    });
                    if (!res)
                    {
                        return Ok(JsonView(false, "修改失败!"));
                    }
                    return Ok(JsonView(true, "修改成功!"));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }


        }

        /// <summary>
        /// 部门删除
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelDepartment(DelDepartmentDto dto)
        {
            try
            {
                if (dto.Id == 0)
                {
                    return Ok(JsonView(-1, "请检查信息是否输入完整!", null));
                }
                else
                {
                    bool res =await _sysDepRep.SoftDeleteAsync<Sys_Department>(dto.Id.ToString());
                    if (!res)
                    {
                        return Ok(JsonView(false, "删除失败!"));
                    }
                    return Ok(JsonView(true, "删除成功!"));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }


        }
        #endregion

        #region 用户操作
        /// <summary>
        /// 查询用户数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QueryUserList(UserDto dto)
        {
            try
            {
                string sqlWhere = string.Empty;
                if (dto.CompanyId!=0)
                {
                    sqlWhere += string.Format(@" And su.CompanyId={0}", dto.CompanyId);
                }
                if (dto.DepId != 0)
                {
                    sqlWhere += string.Format(@" And su.DepId={0}", dto.DepId);
                }
                if (!string.IsNullOrEmpty(sqlWhere.Trim()))
                {
                    Regex r = new Regex("And");
                    sqlWhere = r.Replace(sqlWhere, "Where", 1);
                }
                var result=_userRep.GetUserList(dto.PortType,sqlWhere);
                if (result.Result.Code!=0)
                {
                    return Ok(JsonView(false, "暂无数据!"));

                }
                return Ok(JsonView(true,"查询成功!",result.Result.Data));
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
           
        }

        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> AddUser(AddUserDto dto)
        {
            int id = 0;
            return Ok(JsonView(true, "添加成功!", new { Id = id }));
        }
        #endregion

    }
}