package com.czg.market.service;

import com.czg.account.entity.ShopUser;
import com.czg.constant.TableValueConstant;
import com.czg.exception.CzgException;
import com.czg.market.dto.MemberConfigDTO;
import com.czg.market.dto.MemberLevelDTO;
import com.czg.market.vo.*;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.TbMemberConfig;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 会员基础配置 服务层。
 *
 * @author zs
 * @since 2025-09-10
 */
public interface TbMemberConfigService extends IService<TbMemberConfig> {

    MemberConfigVO detail(Long shopId);

    UMemberConfigVO detail(Long shopId, Long userId);

    Boolean edit(Long shopId, MemberConfigDTO memberDTO);

    Boolean addLevel(Long shopId, MemberLevelDTO levelDTO) throws CzgException;

    Boolean editLevel(Long shopId, MemberLevelDTO levelDTO);

    ArrayList<MemberLevelVO> listLevel(Long shopId);

    /**
     * 根据传入的用户Id，校验是否符合条件，符合加入会员
     *
     * @param shopId 店铺id
     * @param userId 用户id
     * @return 是否加入成功
     */
    boolean joinMember(Long shopId, Long userId, Long memberOrderId);

    boolean joinMemberByCondition(Long shopId, Long userId, ShopUser shopUser);

    /**
     * 发放会员奖励
     *
     * @param money  实际消费金额
     * @param expVal 经验值，只有当type为pay的时候才生效
     * @return 是否成功
     */
    boolean deliver(ShopUser shopUser, TableValueConstant.MemberExpFlow.Type type, BigDecimal money, Integer expVal, Long sourceId);

    /**
     * 获取用户会员列表
     */
    List<MemberListVO> getMemberList(Long userId);

    /**
     * 获取用户会员详情
     */
    MemberDetailVO getUserDetail(Long userId, Long shopId);
}
