package com.dora.service;

import com.dora.dto.AdminUserDto;
import com.dora.dto.ApiResponse;
import com.dora.dto.PageResultDto;

/**
 * 后台用户管理服务接口
 */
public interface AdminUserService {

    /**
     * 获取用户列表
     * @param request 查询请求
     * @return 用户列表响应
     */
    ApiResponse<AdminUserDto.UserListResponse> getUserList(AdminUserDto.UserListRequest request);

    /**
     * 获取用户详情
     * @param userId 用户ID
     * @return 用户详情响应
     */
    ApiResponse<AdminUserDto.UserDetailResponse> getUserDetail(Long userId);

    /**
     * 更新用户信息
     * @param request 更新请求
     * @return 更新结果
     */
    ApiResponse<String> updateUser(AdminUserDto.UserUpdateRequest request);

    /**
     * 更新用户状态（启用/禁用）
     * @param request 状态更新请求
     * @return 更新结果
     */
    ApiResponse<String> updateUserStatus(AdminUserDto.UserStatusUpdateRequest request);

    /**
     * 获取用户统计信息
     * @return 用户统计信息
     */
    ApiResponse<AdminUserDto.UserStatistics> getUserStatistics();

    /**
     * 重置用户密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 重置结果
     */
    ApiResponse<String> resetUserPassword(Long userId, String newPassword);

    /**
     * 批量更新用户角色
     * @param userIds 用户ID列表
     * @param role 角色
     * @param membershipExpiresAt 会员到期时间
     * @return 更新结果
     */
    ApiResponse<String> batchUpdateUserRole(java.util.List<Long> userIds, Integer role, java.time.LocalDateTime membershipExpiresAt);

    /**
     * 批量更新用户推广等级
     * @param userIds 用户ID列表
     * @param promotionLevel 推广等级
     * @return 更新结果
     */
    ApiResponse<String> batchUpdatePromotionLevel(java.util.List<Long> userIds, Integer promotionLevel);

    /**
     * 导出用户数据
     * @param request 查询请求
     * @return 导出文件URL
     */
    ApiResponse<String> exportUserData(AdminUserDto.UserListRequest request);

    /**
     * 获取用户操作日志
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 操作日志列表
     */
    ApiResponse<PageResultDto<AdminUserDto.UserOperationLog>> getUserOperationLogs(Long userId, Integer page, Integer size);
}
