package com.dora.mapper;

import com.dora.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.time.LocalDateTime;
import java.math.BigDecimal;

/**
 * 用户Mapper接口
 */
@Mapper
@Repository
public interface UserMapper {
    
    /**
     * 根据ID获取用户信息
     */
    User selectById(@Param("id") Long id);
    
    /**
     * 根据ID列表批量获取用户信息
     */
    List<User> selectByIds(@Param("ids") List<Long> ids);
    
    /**
     * 根据手机号获取用户信息
     */
    User selectByPhone(@Param("phone") String phone);
    
    /**
     * 根据手机号获取用户信息（包含禁用用户）
     */
    User selectByPhoneAnyStatus(@Param("phone") String phone);
    
    /**
     * 根据用户名获取用户信息
     */
    User selectByUsername(@Param("username") String username);
    
    /**
     * 根据推广码获取用户信息
     */
    User selectByInviteCode(@Param("inviteCode") String inviteCode);
    
    /**
     * 根据微信openid获取用户信息
     */
    User selectByWechatOpenid(@Param("wechatOpenid") String wechatOpenid);
    
    /**
     * 根据微信openid获取用户信息（包含禁用用户）
     */
    User selectByWechatOpenidAnyStatus(@Param("wechatOpenid") String wechatOpenid);
    
    /**
     * 插入新用户
     */
    int insert(User user);
    
    /**
     * 更新用户信息
     */
    int updateById(User user);
    
    /**
     * 更新用户角色和会员到期时间
     */
    int updateRoleAndMembership(@Param("id") Long id, 
                               @Param("role") Integer role, 
                               @Param("membershipExpiresAt") LocalDateTime membershipExpiresAt);
    
    /**
     * 更新用户实名认证状态
     */
    int updateVerificationStatus(@Param("id") Long id, @Param("isVerified") Integer isVerified);
    
    /**
     * 更新用户积分
     */
    int updateBalance(@Param("id") Long id, @Param("balance") BigDecimal balance);
    
    /**
     * 更新用户积分
     */
    int updateUserPoints(@Param("userId") Long userId, @Param("pointsChange") Integer pointsChange);
    
    /**
     * 更新推广等级
     */
    int updatePromotionLevel(@Param("id") Long id, @Param("promotionLevel") Integer promotionLevel);

    /**
     * 根据用户ID获取推广等级
     */
    Integer selectPromotionLevelById(@Param("id") Long id);

    /**
     * 更新用户推广人ID
     */
    int updateInviterId(@Param("id") Long id, @Param("inviterId") Long inviterId);
    
    /**
     * 批量更新过期会员状态
     * 将已过期的VIP用户角色改为普通用户(角色1)
     */
    int updateExpiredMembership(@Param("currentTime") LocalDateTime currentTime);
    
    /**
     * 统计用户的粉丝数量
     */
    int countFansByInviterId(@Param("inviterId") Long inviterId);
    
    /**
     * 统计用户的付费粉丝数量
     */
    int countPaidFansByInviterId(@Param("inviterId") Long inviterId);
    
    /**
     * 获取用户的总提成金额
     */
    BigDecimal getTotalCommissionByUserId(@Param("userId") Long userId);
    
    /**
     * 分页获取用户的粉丝列表
     */
    List<com.dora.dto.FanDto> selectFansByInviterId(@Param("inviterId") Long inviterId, 
                                                     @Param("offset") int offset, 
                                                     @Param("size") int size);
    
    /**
     * 分页获取用户的付费粉丝列表（只统计真正付费的）
     */
    List<com.dora.dto.FanDto> selectPaidFansByInviterId(@Param("inviterId") Long inviterId, 
                                                        @Param("offset") int offset, 
                                                        @Param("size") int size);
    
    /**
     * 根据状态筛选粉丝列表
     */
    List<com.dora.dto.FanDto> selectFansByInviterIdAndStatus(@Param("inviterId") Long inviterId,
                                                             @Param("status") String status,
                                                             @Param("offset") int offset, 
                                                             @Param("size") int size);
    
    /**
     * 统计指定状态的粉丝数量
     */
    int countFansByInviterIdAndStatus(@Param("inviterId") Long inviterId, @Param("status") String status);

    // ==================== 后台管理相关方法 ====================

    /**
     * 分页查询用户列表（后台管理）
     */
    List<com.dora.dto.AdminUserDto.UserListItem> selectUserListForAdmin(
            @Param("keyword") String keyword,
            @Param("role") Integer role,
            @Param("isVerified") Integer isVerified,
            @Param("promotionLevel") Integer promotionLevel,
            @Param("createTimeStart") LocalDateTime createTimeStart,
            @Param("createTimeEnd") LocalDateTime createTimeEnd,
            @Param("membershipType") String membershipType,
            @Param("sortField") String sortField,
            @Param("sortOrder") String sortOrder,
            @Param("offset") int offset,
            @Param("size") int size,
            @Param("isDeleted") Integer isDeleted);

    /**
     * 统计用户列表总数（后台管理）
     */
    int countUserListForAdmin(
            @Param("keyword") String keyword,
            @Param("role") Integer role,
            @Param("isVerified") Integer isVerified,
            @Param("promotionLevel") Integer promotionLevel,
            @Param("createTimeStart") LocalDateTime createTimeStart,
            @Param("createTimeEnd") LocalDateTime createTimeEnd,
            @Param("membershipType") String membershipType,
            @Param("isDeleted") Integer isDeleted);

    /**
     * 获取用户详情（后台管理）
     */
    com.dora.dto.AdminUserDto.UserDetailResponse selectUserDetailForAdmin(@Param("userId") Long userId);

    /**
     * 更新用户状态（启用/禁用）
     */
    int updateUserStatus(@Param("userId") Long userId, @Param("isDeleted") Integer isDeleted);

    /**
     * 获取用户统计信息
     */
    com.dora.dto.AdminUserDto.UserStatistics selectUserStatistics();

    /**
     * 获取今日新增用户数
     */
    int countTodayNewUsers();

    /**
     * 获取本周新增用户数
     */
    int countWeekNewUsers();

    /**
     * 获取本月新增用户数
     */
    int countMonthNewUsers();

    /**
     * 获取VIP用户数
     */
    int countVipUsers();

    /**
     * 获取SVIP用户数
     */
    int countSvipUsers();

    /**
     * 获取已实名认证用户数
     */
    int countVerifiedUsers();

    /**
     * 获取未实名认证用户数
     */
    int countUnverifiedUsers();

    /**
     * 获取有推广等级用户数
     */
    int countPromotionUsers();

    User findById(@Param("id") Long id);
} 