package com.uas.account.service;

import com.uas.account.core.Page;
import com.uas.account.entity.*;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.ui.ModelMap;

import java.util.List;

public interface UserService {

	/**
	 * @param user
	 * @param userDetail
	 * @return 用户的全部账户信息
	 */
	List<User> save(User user, UserDetail userDetail);

	void delete(User user);

	/**
	 * @param user
	 * @return 用户的全部账户信息
	 */
	User findOne(User user);

	/**
	 * 通过appid查询用户信息（众创的或个人注册的不存在绑定企业的关系）
	 *
	 * @return
	 */
	User findByAppId(User user);

	/**
	 * 修改密码，
	 *
	 * <pre>
	 * 修改所有应用下的所有绑定企业下的登录密码
	 * </pre>
	 *
	 * @param app
	 *            源应用
	 * @param user
	 * @param noEncryPwd
	 */
	void changePassword(App app, User user, String noEncryPwd);

	/**
	 * 修改密码
	 *
	 * <pre>
	 * 只修改指定应用下的，且不同步
	 * </pre>
	 *
	 * @param app
	 * @param user
	 * @param noEncryPwd
	 */
	void changePasswordAlone(App app, User user, String noEncryPwd);

    @CacheEvict(value = { "users", "userView" }, allEntries = true)
    List<User> saveAllInfo(User user, UserDetail userDetail);

    String setPasswordBySameApp(App app, User user, UserDetail detail);

	/**
	 * 同步当前密码到其他应用
	 *
	 * @param user
	 * @param noEncryPwd
	 */
	void syncUserPassword(User user, String noEncryPwd);

	User findOne(String appId, String spaceUID, String uid);

	User findOne(String appId, Long spaceId, String uid);

	User findDialectOne(String appId, Long spaceId, String dialectUID);

	UserView findOneView(String appId, Long spaceId, String uid);

	UserView findOneViewBySecondUID(String appId, Long spaceId, String secondUID);

	UserView findOneViewByDialectUID(String appId, Long spaceId, String dialectUID);

	List<User> findByUID(String uid);

	List<User> findByDialectUID(String dialectUID);

	List<User> findBySecondUID(String secondUID);

	List<UserView> findViewByUID(String uid);

	List<UserView> findViewBySecondUID(String secondUID);

	List<UserView> findByAppAndUID(String appId, String uid);

	List<UserView> findByAppAndSecondUID(String appId, String secondUID);

	List<UserView> findByAppAndDialectUID(String appId, String dialectUID);

	/**
	 * 按应用、企业删除用户关系
	 *
	 * @param appId
	 * @param spaceId
	 */
	void deleteByAppAndSpace(String appId, long spaceId);

	Page<User> findAll(String appId, String spaceId, int pageNumber, int pageSize);

	Page<UserDetail> findAllDetail(String name, String mobile, int pageNumber, int pageSize);

	/**
	 * 获取密码密文
	 *
	 * @param format
	 *            加密格式
	 * @param noEncryPwd
	 *            明文
	 * @param salt
	 *            盐值
	 * @return
	 */
	String getEncryPassword(String format, String noEncryPwd, String salt);

	/**
	 * 调用应用接口，传输用户数据过去
	 *
	 * @param app
	 *            应用
	 * @param user
	 *            跟应用相关的用户信息
	 * @param userDetail
	 *            通用的用户信息
	 * @return
	 * @throws Exception
	 */
	User syncUserToApp(App app, User user, UserDetail userDetail) throws Exception;

	UserDetail findOne(String mobile);

	List<UserDetail> findByEmail(String email);

	/**
	 * 重置secondUID
	 *
	 * @param uid
	 * @param newSecondUID
	 */
	void changeSecondUID(String uid, String newSecondUID);

	void applyApp(User user);

	/**
	 * 用户开通应用统计
	 *
	 * @return
	 */
	ModelMap getUserAppCount();

	/**
	 * 获取当前用户开通的应用
	 * @param uid_
	 * @return
	 */
	List<User> findUserAppByUID(String uid_);

	/**
	 * 注册个人用户
	 * @param user
	 * @return
	 */
	UserDetail register(UserDetail user);

	/**
	 * 注册初始化账号
	 * @param uid_
	 * @param password
	 */
	void initUser(String uid_, String password);

	/**
	 * 通过企业名称查询员工的信息
	 *
	 * @param name
	 * @param pageNumber
	 * @return
	 */
	List<UserSpaceDetailInfo> findByEnName(String name, Integer pageNumber);

	/**
	 * 通过企业营业执照查询员工的信息
	 *
	 * @param businessCode
	 * @return
	 */
	List<User> findByBusinessCode(String businessCode);

	Integer getEnterpriseCount();

	Integer getPersonalUserCount();

	Integer getUuUserCount();

	/**
	 * uu众创注册数据同步
	 *
	 * @param userDetail
	 */
	UuzcUserDeatil initUserForUUzc(UserDetail userDetail, String password);

	/**
	 * 保存用户详情
	 *
	 * @param detail
	 * @return
	 */
	UserDetail save(UserDetail detail);

	/**
	 * 查询当前企业是否已经存在hr账号
	 *
	 * @param businessCode
	 * @return
	 */
	Integer findHrAccount(String businessCode);

	void setHrAccount(UserDetail detail, UuzcUserSpaceDetail userSpaceDetail) throws Exception;

	/**
	 * 根据手机号查询用户UU号
	 * @param tel
	 * @return
	 */
	Long findUserUUByMobile(String tel);

	/**
	 * 锁定账号
	 * @param account 需要锁定的账号
	 */
	void lock(String account);

	/**
	 * 判断账号是否被锁定
	 * @param account 需要判断的账号
	 * @return
	 */
	boolean isLock(String account);

    /**
     * 获取当前企业HR的信息
     * @param businessCode
     * @return
     */
    User findHrInfo(String businessCode);

    /**
     * 更新企业hr信息
     *
     * @param hrInfo
     * @param flag
     */
    void updateHrInfo(User hrInfo, boolean flag);

	/**
	 * 同步用户信息到b2b
	 * @param userDetail
	 * @param password
	 * @return
	 */
	User syncUserToB2B(UserDetail userDetail, String password);

    String getUserUUByImId(Long imId);
}
