package cn.novalon.gym.manage.member.service;

import cn.novalon.gym.manage.member.dto.SearchMemberDto;
import cn.novalon.gym.manage.member.dto.UpdateMemberInfoDto;
import cn.novalon.gym.manage.member.entity.Member;
import cn.novalon.gym.manage.member.es.entity.MemberES;
import cn.novalon.gym.manage.member.vo.MemberDetailVO;
import cn.novalon.gym.manage.member.vo.MemberInfoVO;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * 会员服务接口
 * 
 * @author 付嘉
 * @date 2026-05-01
 */
public interface MemberService {

    /**
     * 获取会员信息
     *
     * @param memberId 会员ID
     * @return 会员信息
     */
    Mono<MemberInfoVO> getMemberInfo(Long memberId);

    /**
     * 会员更新个人信息
     * 
     * @param memberId 会员ID
     * @param updateDto 更新信息DTO
     * @return 更新后的会员信息
     */
    Mono<MemberInfoVO> updateMemberInfo(Long memberId, UpdateMemberInfoDto updateDto);

    /**
     * 管理端更新会员手机号
     * 
     * @param memberId 会员ID
     * @param phone 明文手机号
     * @return 是否成功
     */
    Mono<Boolean> adminUpdatePhone(Long memberId, String phone);

    /**
     * 管理端查询会员（es查询）
     *
     * @param searchMemberDto 会员信息dto
     * @return 会员信息
     */
    Flux<MemberES> searchMember(SearchMemberDto searchMemberDto);

    /**
     * 管理端查询所有会员
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 所有会员信息
     */
    Flux<Member> findAll(Integer pageNum, Integer pageSize);

    /**
     * 前台管理端获取会员详情（含会员卡信息）
     *
     * @param memberId 会员ID
     * @return 会员详情
     */
    Mono<MemberDetailVO> getMemberDetail(Long memberId);

    /**
     * 前台管理端编辑会员信息
     *
     * @param memberId 会员ID
     * @param updateDto 更新信息DTO
     * @return 更新后的会员详情
     */
    Mono<Boolean> adminUpdateMemberInfo(Long memberId, UpdateMemberInfoDto updateDto);
}
