package com.sptg.permissions.biz.service;

import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.sptg.common.core.beans.PageBean;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.common.core.beans.ResultEnum;
import com.sptg.permissions.api.dto.AccountDto;
import com.sptg.permissions.api.entity.Account;
import org.apache.commons.codec.digest.DigestUtils;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * title: AccountServiceInterface
 * package: com.sptg.permissions.biz.security
 * description: 账号服务接口
 *
 *                  
 *                 
 */
public interface AccountServiceInterface extends IService<Account> {

    /**
     * 功能描述: 根据登陆名获取用户
     * @param loginName 登陆名
     * @return Account
     *                  
     *                       
     */
    Account selectByLoginName(String loginName);

    /**
     * 功能描述: 根据机构Id获取用户列表
     * @param orgId 机构Id
     * @return List<Account>
     *                  
     *                       
     */
    default List<Account> selectByOrgId(Serializable orgId){
        Wrapper<Account> wrapper = new EntityWrapper<>();
        wrapper.eq("l_org_id",orgId);
        return this.selectList(wrapper);
    }

    /**
     * 功能描述:根据机构Id列表获取用户列表
     * @param orgIdList 机构Id列表
     * @return List<Account>
     *                  
     *                       
     */
    default List<Account> selectByOrgIdList(Collection<?> orgIdList){
        Wrapper<Account> wrapper = new EntityWrapper<>();
        wrapper.in("l_org_id",orgIdList);
        return this.selectList(wrapper);
    }

    /**
     * 功能描述: 批量修改
     * @param entityList 账号列表
     * @return true：成功,false：失败
     *                  
     *                       
     */
    boolean updateBatch(List<Account> entityList);

    /**
     * 功能描述: 分页获取账号列表,账号不含有指定的角色
     * @param pageBean 查询条件，默认查询当前用户所属机构下的用户列表
     * @return Page<Account>
     *                  
     *                       
     */
    Page<Account> pagingQueryByNotHaveRole(PageBean<Account,AccountDto> pageBean);

    /**
     * 功能描述: 根据条件分页查询账号列表
     * @param pageBean 查询条件
     * @return Page<Account>
     *                  
     *                      
     */
    Page<Account> pagingQuery(PageBean<Account,AccountDto> pageBean);

    /**
     * 功能描述: 添加账号
     * @param dto 账号信息
     * @return ResultBean<Account>
     *                  
     *                       
     */
    ResultBean<Account> addEntity(AccountDto dto);

    /**
     * 功能描述: 修改账号信息
     * @param dto 账号信息
     * @return ResultBean<Boolean>
     *                  
     *                       
     */
    ResultBean<Boolean> updateEntity(AccountDto dto);

    /**
     * 功能描述: 删除账号
     * @param dto 删除条件{ Id：必填 }
     * @return ResultBean<Boolean>
     *                  
     *                       
     */
    ResultBean<Boolean> deleteEntity(AccountDto dto);

    /**
     * 功能描述:根据Id集合批量删除账号
     * @param dto 删除条件{ Ids：必填 }
     * @return ResultBean<Boolean>
     *             
     *                      
     */
    ResultBean<Boolean> deleteAccountList(AccountDto dto);

    /**
     * 功能描述: 密码加密
     * @param password 明文密码
     * @return 密文
     *                  
     *                       
     */
    default String passwordEncrypt(String password){
        return DigestUtils.sha256Hex(password);
    }

    /**
     * 功能描述: 获取某机构下及其所有子机构的账号列表
     * @param position 机构的position字段
     * @return List<Account>
     *                  
     *                       
     */
    default List<Account> selectByOrgPosition(String position){
        Wrapper<Account> wrapper = new EntityWrapper<>();
        wrapper.like("s_org_position",position, SqlLike.RIGHT);
        return this.selectList(wrapper);
    }

    /**
     * 功能描述:获取下属机构的数量
     * @param position 机构位置
     * @return ResultBean<Integer>
     *             
     *                      
     */
    default ResultBean<Integer> selectCountByPosition(String position){
        Wrapper<Account> wrapper = new EntityWrapper<>();
        wrapper.like("s_org_position",position+"_%",SqlLike.CUSTOM);
        return new ResultBean<>(ResultEnum.SUCCESS,this.selectCount(wrapper));
    }

    /**
     * 功能描述:解绑微信
     * @param dto
     * @return ResultBean<Integer>
     *               
     *                      
     */
    ResultBean<Boolean> untiedWeChat(AccountDto dto);
    /**
     * 功能描述:根据openid获取账户信息
     * @param openid
     * @return ResultBean<Account>
     *               
     *                      
     */
    default ResultBean<Account> getByOpenid(String openid){
        Wrapper<Account> wrapper = new EntityWrapper<>();
        wrapper.eq("s_openid",openid);
        return new ResultBean<>(ResultEnum.SUCCESS,this.selectOne(wrapper));
    }

    /**
     * 功能描述:账号绑定微信--绑定openid
     * @param dto
     * @return ResultBean<Boolean>
     *               
     *                      
     */
    ResultBean<Boolean> bindOpenid(AccountDto dto);

    Page<Account> page(PageBean<Account, AccountDto> pageBean);

    ResultBean<String> resetPassword(Account dto);

    ResultBean<Boolean> modifyPassword(Account account);

    Account getByUserMobile(String mobile);
}
