package com.softwarebr.nunu.service.user;

import com.brframework.webapppatch.domain.RequestFlag;
import com.softwarebr.nunu.entity.user.Member;
import com.brframework.commondb.core.EntityService;
import com.softwarebr.nunu.json.admin.visual.MemberRegisterResult;
import com.softwarebr.nunu.json.admin.visual.VisitorsResult;
import com.softwarebr.nunu.dto.user.MemberParamDTO;
import com.softwarebr.nunu.json.api.user.ThirdPartyLoginResult;
import me.chanjar.weixin.common.error.WxErrorException;

import java.io.IOException;

/**
 * 用户
 * @Author lilin
 * @Date 2020-02-17 14:07:07
 */

public interface MemberService extends EntityService<Member, Long, Object> {


    /**
     * 检查手机号码是否注册
     * @param phone 手机号码
     * @param type 第三方登录类型1.PC微信 2.h5微信
     * @return
     */
    Integer checkRegister(String phone, Integer type);

    /**
     * 注册
     * @param param
     * @return
     */
    String register(MemberParamDTO param) ;

    /**
     * 登录
     * @param phone 手机号码
     * @param password 密码
     * @return
     */
    String login(String phone, String password);

    /**
     * 找回密码
     * @param phone 手机号码
     * @param password 新密码
     */
    void passwordReset(String phone, String password);

    /**
     * 第三方登录
     * @param type 登录类型  {@link Member}
     * @param thirdPartyId code
     * @return
     */
    ThirdPartyLoginResult thirdPartyLogin(Integer type, String thirdPartyId) throws WxErrorException;

    /**
     * 第三方账号绑定
     * @param type
     * @param thirdPartyId
     * @throws WxErrorException
     */
    void saveThirdParty(Integer type, String thirdPartyId, String phone) throws WxErrorException;

    /**
     * 生成jwt
     *
     * @param user
     * @return
     */
    String genJwt(Member user);

    /**
     * 根据手机号码查询用户信息
     *
     * @param phone
     * @return
     */
    Member findByPhone(String phone);

    /**
     * 手机号码查询用户Id
     * @param phone
     * @return
     */
    Long findMemberIdByPhone(String phone);

    /**
     * 禁用用户
     * @param id
     */
    void prohibitMember(Long id);

    /**
     * 启用用户
     * @param id
     */
    void enableMember(Long id);

    /**
     * 获取微信用户的openid
     *
     * @param code
     * @param type 微信登录类型 1.PC微信登录 2.h5微信登录
     * @return
     * @throws WxErrorException
     */
    String getWeiXinUnionId(Integer type, String code) throws WxErrorException;


    /**
     * 第三方信息查询用户
     *
     * @param type         1.微信
     * @param thirdPartyId 第三方登录id
     */
    Member findThirdParty(Integer type, String thirdPartyId);

    /**
     * 绑定用户推送并且查询用户信息
     *
     * @param memberId
     * @param flag
     * @return
     */
    Member bindingPushAndfindUser(String memberId, RequestFlag flag);

    /**
     * 处理用户昵称,如果昵称为空则返处理过的手机号
     *
     * @param user
     * @return
     */
    String nicknameHandle(Member user);

    /**
     * 处理用户昵称,如果昵称为空则返回处理过的手机号;用户不存在则返回空字符串;后台使用
     *
     * @param memberId
     * @return
     */
    String nicknameHandle(Long memberId);

    /**
     * 可视化数据用户注册
     * @param minDateTime 时间最小区间
     * @param maxDateTime 时间最大区间
     * @param days 默认天数
     * @return
     */
    MemberRegisterResult getMemberRegisterTotal(String minDateTime, String maxDateTime, Long days);

    /**
     * 保存访问人数
     */
    void saveAccessStatistics();

    /**
     * 访问人数统计
     * @param minDateTime 时间区间最小
     * @param maxDateTime 时间区间最大
     * @param days 默认天数
     */
    VisitorsResult getMemberVisitorsTotal(String minDateTime, String maxDateTime, Long days);

    /**
     * 个人信息修改
     * @param memberId 用户id
     * @param headImgUri 头像
     * @param nickname 昵称
     * @param username 用户名
     * @param companyName 公司名称
     * @param password 密码
     */
    void updateMember(Long memberId, String headImgUri, String nickname, String username, String companyName, String password);
}