package com.xy.xyaicpzs.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xy.xyaicpzs.domain.dto.user.UserPhoneLoginRequest;
import com.xy.xyaicpzs.domain.dto.user.UserPhoneRegisterRequest;
import com.xy.xyaicpzs.domain.entity.User;
import com.xy.xyaicpzs.domain.vo.*;

import jakarta.servlet.http.HttpServletRequest;

/**
 * 用户服务
*/
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param userAccount   用户账户
     * @param userPassword  用户密码
     * @param checkPassword 校验密码
     * @return 新用户 id
     */
    long userRegister(String userAccount, String userName, String userPassword, String checkPassword);

    /**
     * 用户登录
     *
     * @param userAccount  用户账户
     * @param userPassword 用户密码
     * @param request
     * @return 脱敏后的用户信息
     */
    User userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 获取当前登录用户
     *
     * @param request
     * @return
     */
    User getLoginUser(HttpServletRequest request);

    /**
     * 用户注销
     *
     * @param request
     * @return
     */
    boolean userLogout(HttpServletRequest request);

    /**
     * 获取脱敏的用户信息
     *
     * @param originUser
     * @return
     */
    User getSafetyUser(User originUser);

    /**
     * 是否为管理员
     *
     * @param request
     * @return
     */
    boolean isAdmin(HttpServletRequest request);

    /**
     * 是否为管理员
     *
     * @param user
     * @return
     */
    boolean isAdmin(User user);
    
    /**
     * 手机号注册
     *
     * @param userPhoneRegisterRequest 手机号注册请求
     * @return 新用户 id
     */
    long userPhoneRegister(UserPhoneRegisterRequest userPhoneRegisterRequest);
    
    /**
     * 手机号登录
     *
     * @param userPhoneLoginRequest 手机号登录请求
     * @param request HTTP请求
     * @return 脱敏后的用户信息
     */
    User userPhoneLogin(UserPhoneLoginRequest userPhoneLoginRequest, HttpServletRequest request);
    
    /**
     * 加密用户密码
     *
     * @param password 原始密码
     * @return 加密后的密码
     */
    String encryptPassword(String password);
    
    // region 统计相关方法
    
    /**
     * 根据时间段获取新增用户统计
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate 结束日期 (格式: yyyy-MM-dd)
     * @return 新增用户统计数据
     */
    UserStatisticsVO getNewUsersStatistics(String startDate, String endDate);
    
    /**
     * 根据时间段获取新增会员统计
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate 结束日期 (格式: yyyy-MM-dd)
     * @return 新增会员统计数据
     */
    VipStatisticsVO getNewVipsStatistics(String startDate, String endDate);
    
    /**
     * 根据时间段获取用户注册趋势
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate 结束日期 (格式: yyyy-MM-dd)
     * @param granularity 时间粒度 (day/week/month)
     * @return 用户注册趋势数据
     */
    RegistrationTrendVO getRegistrationTrend(String startDate, String endDate, String granularity);
    
    /**
     * 获取即将到期的会员列表
     *
     * @param days 提前多少天提醒 (默认7天)
     * @param current 当前页
     * @param pageSize 页大小
     * @return 即将到期的会员列表
     */
    Page<UserVO> getExpiringVips(Integer days, Long current, Long pageSize);
    
    /**
     * 获取会员状态分布统计
     *
     * @return 会员状态分布数据
     */
    VipDistributionVO getVipDistribution();
    
    // endregion
}
