package com.red.circle.order.infra.database.mongo.order;

import com.red.circle.order.infra.database.mongo.order.entity.InAppPurchaseDetails;
import com.red.circle.order.infra.database.mongo.order.entity.assist.CountUserInAppPurchase;
import com.red.circle.order.infra.database.mongo.order.entity.assist.InAppPurchaseEventNotice;
import com.red.circle.order.infra.database.mongo.order.query.InAppPurchaseDetailsQuery;
import com.red.circle.order.inner.model.enums.inapp.InAppPurchaseStatus;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @author pengliang on 2022/10/24
 */
public interface InAppPurchaseDetailsService {

  /**
   * 创建付款意图.
   */
  void create(InAppPurchaseDetails inAppPurchaseDetails);

  /**
   * 获取订单信息.
   */
  InAppPurchaseDetails getById(String id);

  /**
   * 订单id.
   */
  InAppPurchaseDetails getByOrderId(String orderId);

  /**
   * 是否存在通知日志.
   */
  boolean existsPayNotice(String id, String eventId, String noticeType);

  /**
   * 是否存在通知日志.
   */
  boolean existsPayNoticeByEventId(String id, String eventId);

  /**
   * 是否存在通知日志.
   */
  boolean existsPayNoticeByNoticeType(String id, String noticeType);

  /**
   * 添加通知日志.
   */
  void addPayNotices(String id, InAppPurchaseEventNotice payNotice);

  /**
   * 添加通知日志-根据orderId.
   */
  void addPayNoticesByOrderId(String orderId, InAppPurchaseEventNotice payNotice);

  /**
   * 修改订单状态.
   */
  void updateStatus(String id, InAppPurchaseStatus status);

  /**
   * 修改订单状态和原因.
   */
  void updateStatusReason(String id, InAppPurchaseStatus status, String reason);

  /**
   * 添加元数据.
   */
  boolean addMetadata(String id, String key, String val);

  /**
   * 订单信息查询.
   */
  List<InAppPurchaseDetails> list(InAppPurchaseDetailsQuery query);

  /**
   * 订单统计查询 - 返回金额总数和订单总数
   */
  Map<String, Object> statistics(InAppPurchaseDetailsQuery query);

  /**
   * 统计用户内购.
   */
  List<CountUserInAppPurchase> countUserInAppPurchase(String sysOrigin, LocalDateTime startTime,
      LocalDateTime endTime, Integer limit);

  List<InAppPurchaseDetails> listAll();

  void updateMetadata(String id, Map<String, String> metadata);

  /**
   * 批量统计用户充值.
   *
   * @param userIds 用户ID列表
   * @param sysOrigin 系统来源
   * @param startTime 开始时间（可选）
   * @param endTime 结束时间（可选）
   * @return 用户充值统计列表（按用户ID分组）
   */
  List<CountUserInAppPurchase> batchUserRechargeStatistics(
      List<Long> userIds,
      String sysOrigin,
      LocalDateTime startTime,
      LocalDateTime endTime);
}
