package com.sonic.frog.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sonic.common.rpc.Page;
import com.sonic.frog.domain.entity.AiUserHeartbeatRelation;
import com.sonic.frog.domain.input.BuyHeartbeatValInput;
import com.sonic.frog.domain.input.HeartbeatRelationListInput;
import com.sonic.frog.domain.input.HeartbeatRelationSwitchInput;
import com.sonic.frog.domain.output.AiUserHeartbeatRelationOutput;
import com.sonic.frog.domain.output.HeartbeatLevelOutput;
import com.sonic.frog.domain.output.HeartbeatRelationListOutput;
import com.sonic.frog.enums.HeartbeatLevelEnum;
import com.sonic.frog.event.inner.payload.CalcHeartbeatLevelPayload;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 用户与AI的心动关系服务接口
 */
public interface AiUserHeartbeatRelationService extends IService<AiUserHeartbeatRelation> {

    /**
     * 获取用户与ai的心动关系
     *
     * @param userId
     * @param aiId
     * @return
     */
    AiUserHeartbeatRelation getHeartbeatRelation(Long userId, Long aiId);

    /**
     * 初始化用户与ai的心动关系
     *
     * @param userId
     * @param aiId
     */
    void initAiUserHeartbeatRelation(Long userId, Long aiId);

    /**
     * 获取用户与ai的心动关系
     *
     * @param userId
     * @param aiId
     * @return
     */
    AiUserHeartbeatRelationOutput getAiUserHeartbeatRelation(Long userId, Long aiId);

    /**
     * 获取用户与ai的心动等级
     *
     * @param userId
     * @param aiId
     * @return
     */
    HeartbeatLevelOutput getAiUserHeartbeatLevel(Long userId, @NotNull Long aiId);

    /**
     * 获取用户与ai的心动等级枚举
     *
     * @param userId
     * @param aiId
     * @return
     */
    HeartbeatLevelEnum getHeartbeatLevel(Long userId, Long aiId);

    /**
     * 计算用户与ai的心动等级
     *
     * @param payload
     */
    void calcAiUserHeartbeatLevel(CalcHeartbeatLevelPayload payload);

    /**
     * 购买心动值-已扣减的心动值购买
     *
     * @param userId
     * @param input
     */
    void buyHeartbeatVal(Long userId, BuyHeartbeatValInput input);

    /**
     * 用户与ai的心动关系开关
     *
     * @param userId
     * @param input
     */
    void heartbeatRelationSwitch(Long userId, HeartbeatRelationSwitchInput input);

    /**
     * 计算用户与ai的心动分
     *
     * @param userId
     * @param aiId
     */
    void calcAiUserHeartbeatScore(Long userId, Long aiId);

    /**
     * 查询当前用户下所有AI,如果聊天超过24小时未聊天则扣减心动值
     *
     * @param userId
     */
    void subtractHeartbeatVal(Long userId);

    /**
     * 24小时未聊天扣减心动值
     *
     * @param userId
     */
    void withoutChatSubtractHeartbeatVal(Long userId);

    /**
     * 心动关系列表
     *
     * @param userId
     * @param input
     * @return
     */
    Page<HeartbeatRelationListOutput> heartbeatRelationList(Long userId, HeartbeatRelationListInput input);

    /**
     * 24小时未聊天扣减心动值定时任务
     */
    void hours24NoChatSubtractHeartbeatValJob();

    /**
     * 查询用户和目标用户的心动值
     *
     * @param currentUserId
     * @param aiIds
     * @return
     */
    Map<Long, BigDecimal> queryAIHeartbeatVal(Long currentUserId, List<Long> aiIds);

    /**
     * 是否存在关系校验
     *
     * @param userId
     * @param aiId
     * @return
     */
    Boolean relationCheck(Long userId, Long aiId);
}