package com.palmnest.service.estateserve;

import com.palmnest.application.bean.AppResultDto;
import com.palmnest.application.bean.Page;
import com.palmnest.application.bean.Pagenation;
import com.palmnest.application.dto.output.app.AppUserDto;
import com.palmnest.model.User;
import com.palmnest.model.estateserve.AppUser;
import com.palmnest.service.GenericManager;

import org.hibernate.criterion.Criterion;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 用户管理服务接口
 *
 * @author yubing
 */
public interface AppUserManager extends GenericManager<AppUser, Integer> {

	/**
	 * 查询会员用户-分页
	 *
	 * @param pageNo     当前页码
	 * @param filterList 分页过滤条件
	 */
	public Pagenation<AppUser> queryAppUser(int pageNo, List<Criterion> filterList);

	/**
	 * 查询会员用户
	 *
	 * @param developId 公众号原始ID
	 * @param openId    用户OpenId
	 * @return
	 */
	public AppUser getAppUserByOpenId(String developId, String openId);

	/**
	 * 根据手机号码查询用户
	 *
	 * @param userMobile
	 */
	public AppUser getAppUsersByPhone(String userMobile);

	/**
	 * 保存或者更新用户
	 *
	 * @param appUser
	 */
	public Integer saveOrUpdateAppUser(AppUser appUser);

	/**
	 * 更新用户资料信息
	 *
	 * @param appUser         用户
	 * @param imgServerIds    微信图片ID
	 * @param headRealtiveUrl 人脸头像相对存储路径
	 * @param developId       微信开发者ID
	 * @return
	 */
	public String updateAppUser(AppUser appUser, String imgServerIds, String headRealtiveUrl, String developId, String dataUrl);

	/**
	 * 绑定手机号码
	 *
	 * @param openId
	 * @param developId
	 * @param userMobile 电话号码
	 * @param authCode   验证码
	 */
	public Map<String, Object> assignBindPhone(String openId, String developId, String userMobile, String authCode);

	/**
	 * 更新用户的状态
	 *
	 * @param userId     用户的ID
	 * @param status     用户的状态
	 * @param suggestion 审核建议
	 * @param modifier   更改者
	 * @param actType    操作类型 （2-微信前端操作、1-后台管理员操作）
	 * @return
	 */
	public String updateAppUser(int userId, String status, String suggestion, String modifier, String actType);

	/**
	 * 更新用户的号码
	 *
	 * @param useId      用户ID
	 * @param userMobile 电话号码
	 * @param authCode   验证码
	 * @return
	 */
	public String updateAppUserMobile(int userId, String userMobile, String authCode);

	/**
	 * 下载导入员工信息的excel模板
	 *
	 * @param fileFullPath
	 * @param organizationId
	 * @return
	 */
	public String exportUserModel(String fileFullPath, String organizationId);

	/**
	 * 导入员工信息
	 *
	 * @param ins
	 * @return
	 */
	public Map<String, Object> saveImportUserData(InputStream ins);

	/**
	 * 验证人脸头像是否规范
	 *
	 * @param imgServerId
	 * @param developId
	 * @return
	 */
	public String validateHeadStandard(String imageUrl, String virtualArchId);

	/**
	 * 新增用户信息
	 *
	 * @param appuserList
	 * @return
	 */
	public Map<String, Object> saveAppUser(List<AppUser> appuserList) throws Exception;

	/**
	 * 更新用户信息
	 *
	 * @param appUser
	 * @param imageUrlids
	 * @param removeUrlids
	 * @param addimgUrls
	 * @return
	 * @throws Exception
	 */
	public Map<String, Object> updateAppUserInfo(AppUser appUser, String imageUrlids, String removeUrlids, String addimgUrls) throws Exception;

	/**
	 * 处理face++ 绑定和解绑的操作
	 *
	 * @param appUser   用户信息
	 * @param pohto_ids face++底库集合
	 * @return
	 */
	//public boolean assignOperateForFace(AppUser appUser, String status, List<Integer> pohto_ids) throws Exception;

	/**
	 * 处理用户信息同步（一键服务系统）
	 *
	 * @param appuser
	 * @param operateType 操作类型（1-新增，2修改更新，3删除）
	 * @return
	 */
	public boolean assignSyncUser(AppUser appUser, String operateType);

	/**
	 * 初始化用户信息数据
	 * 到一键服务平台
	 */
	public void initAppUserToOneKeyService();

	/**
	 * 获取管理员管理的用户集合
	 *
	 * @param userId 管理员ID
	 * @return
	 */
	public Page queryAppUserList(int userId, int virtualId, int pageNo, int pageSize);

	/**
	 * 审核用户
	 *
	 * @param userId       管理员ID
	 * @param acceptUserId 接受处理的用户ID
	 * @param status       审核状态 0-待审核，1-通过，2-不通过
	 * @return
	 */
	public Map<String, String> assignReviewUser(int userId, int acceptUserId, String status);

	/**
	 * 设置普通用户为管理员操作
	 *
	 * @param userId       管理员ID
	 * @param acceptUserId 接受处理的用户ID
	 * @return
	 */
	public Map<String, String> assignSetRoleAppUser(int userId, int acceptUserId);

	/**
	 * 根据企业ID和状态查询未审核和审核通过的人数
	 *
	 * @param virtualArchId
	 * @param status
	 * @return
	 */
	public Integer getAppUserNonCheckedCount(String virtualArchId, String status);


	/**
	 * 处理邀请用户加入企业的业务
	 *
	 * @param paramsMap 参数
	 * @return
	 */
	public Map<String, String> assignJoinVirtual(Map<String, String> paramsMap);


	public AppResultDto updateTelByHisTel(String userMobile, String code, String developId, String openId);

	public AppUserDto convertToAppDto(AppUser user);

	/**
	 * 更新密码
	 *
	 * @param telephone
	 * @param oldPwd
	 * @param newPwd
	 */
	public boolean updateUserPwd(String telephone, String newPwd);


	public List<AppUser> getAppUserByVirId(int virtualId);

	/**
	 * 订餐-账号列表
	 *
	 * @param paramets
	 * @param pageSize
	 * @param pageNo
	 * @return
	 */
	Page findList(Map<String, Object> paramets, int pageSize, int pageNo);
//	/**
//	 * 根据项目及openId获取用户
//	 * @param orgId
//	 * @param openId
//	 * @return
//	 */
//	public AppUser getAUByOpenId(String orgId,String openId);

	public AppUser getAppUsersByPhoneAndOrg(String userMobile, Integer orgId);

	/**
	 * 根据微信用户id和项目id
	 * 查询未被禁用的用户(isEnable=1)或者是被禁用的白名单用户(userType=2)
	 *
	 * @param wxUserId
	 * @param orgId
	 * @return
	 */
	public AppUser getAppUserByWxUserAndOrg(Integer wxUserId, Integer orgId);

	/**
	 * 获取该项目下所有角色类型用户
	 *
	 * @param orgId
	 * @return
	 */
	List<AppUser> getUserByOrgIdAndRoleType(String orgId, String roleTypes);

	/**
	 * 根据手机号码和项目id查询用户
	 *
	 * @param userMobile
	 * @return
	 */
	public AppUser getAppUsersByPhoneAndOrg(String userMobile, String orgId, String isEnabled);

	/**
	 * 当前账户登录后 将其它与该账户绑定项目项目id和微信用户id的账户登录状态置为离线状态等
	 *
	 * @param userId   当前登录账户id
	 * @param wxUserId 微信表用户id
	 * @param orgId    项目id
	 */
	public void updateAppUser(Integer userId, Integer wxUserId, Integer orgId);

	/**
	 * 获取以下项目下且wxUserId不为空的wxUser
	 *
	 * @param orgIds
	 * @return
	 */
	List<AppUser> getWxUserByOrgIds(String orgIds);

	/**
	 * 获取该项目下所有有效的用户
	 *
	 * @param orgId
	 * @return
	 */
	List<AppUser> getAppUserByOrgId(Integer orgId);

	/**
	 * 根据用户id修改这些用户的积分
	 *
	 * @param map
	 * @return
	 */
	int updateAppUserByUserIds(Map<String, String> map);

	/**
	 * 根据令令id查询用户
	 *
	 * @param lingLingId
	 * @return
	 */
	AppUser getAppUserByLingLingId(String lingLingId);

	/**
	 * 根据企业ID和手机号查询用户信息
	 *
	 * @param virtualArchId
	 * @param mobile
	 * @return
	 */
	public AppUser getUserByVicIdAndMobile(Integer virtualArchId, String mobile);

	/**
	 * 根据手机号与公众号developId查询白名单用户
	 *
	 * @param mobile
	 * @param developId
	 * @return
	 */
	List<Map<String, Object>> getWhiteUserByMobileAndOrg2(String mobile, String developId);

	/**
	 * 根据用户id获取用户信息
	 * 腾讯微校海纳后台人员信息同步用
	 *
	 * @param userIds
	 * @return
	 */
	List<Map<String, Object>> getWeiXiaoAppUsersByIds(String userIds, Integer orgId);

	List<Map<String, Object>> getUserMobileAndDepName(Integer orgId);

	/**
	 * 同步数据到腾讯微校海纳后台
	 *
	 * @param userIds
	 */
	public AppResultDto syncEmployeeInfo(String userIds, Integer orgId, User user);

	/**
	 * 航电用户注册
	 *
	 * @param mobile
	 * @param openId
	 * @return
	 * @throws Exception
	 */
	public Map<String, Object> hdRegister(String mobile, String openId);

	public Integer getUserNumer();

	/**
	 * 获取用户信息
	 *
	 * @param userIds 用户id串,逗号分隔 10002,10003,1004
	 * @return
	 */
	List<AppUser> getAppUserByIds(String userIds);

	/**
	 * 根据手机号查询白名单用户
	 *
	 * @param mobile
	 * @return
	 */
	List<AppUser> getWhiteUserByMobile(String mobile);

	List<AppUser> countOrgWhiteUser(String[] orgIds);

	/**
	 * 获取用户企业饭卡号码
	 *
	 * @param userMobile
	 * @return
	 */
	String getUserMealcard(String userMobile);

	User getByAccount(String account);

	/**
	 * 根据手机号与企业id查询白名单用户
	 *
	 * @param virId
	 * @param employeePhone
	 * @return
	 */
	AppUser getWhiteUserByMobileAndVirt(Integer virId, String employeePhone);
	
	AppUser getWhiteUserByMobileAndOrgId(Integer orgId, String employeePhone);

	/**
	 * 获取已配置通行人员new
	 *
	 * @param virtId
	 * @param name
	 * @return
	 */
	List<Map<String, Object>> getGroupUser(Integer groupId, Integer orgId, String name);

	/**
	 * 获取未配置通行人员new
	 *
	 * @param virtId
	 * @param name
	 * @return
	 */
	List<Map<String, Object>> getNotGroupUser(Integer groupId, Integer orgId, String name);


	/**
	 * 获取能够参会的参会人信息
	 *
	 * @param virtId
	 * @param name
	 * @return
	 */
	List<Map<String, Object>> getVirtDeptUser(Integer virtId, String name);
	
	/**
	 * 从新框架中获取用户
	 * @param userId
	 * @return
	 */
	AppUser findUserByNewFramework(Integer userId,String database);
	
	/**
	 * 获取项目下所有的用户
	 * @param orgIds
	 * userIds 获取项目下id为这些的用户
	 * @return
	 */
	List<Map<String, Object>> getAllUserByOrgIds(String orgIds,String userIds,String openIds);
	
	AppUser findLoginUserByOpenId(Integer orgId,String openId);

}
