package com.yuchen.saas.payment.api.feign;

import com.yuchen.saas.payment.api.dto.CommonBaseDTO;
import com.yuchen.saas.payment.api.dto.wallet.*;
import com.yuchen.saas.payment.api.entity.PmgBatParkPayUserWalletBill;
import com.yuchen.saas.payment.api.vo.wallet.*;
import org.nest.springwrap.core.launch.app.AppNameConstant;
import org.nest.springwrap.core.mp.support.NestPage;
import org.nest.springwrap.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;


@FeignClient(
        value = AppNameConstant.SAAS_PAYMENT,
        fallbackFactory = ParkPayUserWalletFeignFallback.class
)
public interface ParkPayUserWalletFeign {

    /**
     * 获取个人钱包账单明细列表
     * @param reqDTO 入参
     * @return 分页列表
     */
    @PostMapping("/userWalletBill/findPageUserWalletBillInfo")
    R<NestPage<UserWalletBillInfoVO>> findPageUserWalletBillInfo(@Validated @RequestBody PageUserWalletBillReqDTO reqDTO);

    /**
     * 获取个人钱包账单收支总数
     * @param reqDTO 入参
     * @return 账单收支统计
     */
    @PostMapping("/userWalletBill/getUserWalletBillCount")
    R<UserWalletBillCountVO> getUserWalletBillCount(@Validated @RequestBody PageUserWalletBillReqDTO reqDTO);

    /**
     * 创建钱包账单
     * @param reqDTO 入参
     * @return 账单明细数据
     */
    @PostMapping("/userWalletBill/createUserWalletBillData")
    R<PmgBatParkPayUserWalletBill> createUserWalletBillData(@RequestBody CreateUserWalletBillReqDTO reqDTO);

    /**
     * 发起钱包退款
     * @param walletId 钱包id
     * @return 钱包退款信息
     */
    @GetMapping("/userWalletBill/startUserWalletRefund/{walletId}")
    R<UserWalletRefundVO> startUserWalletRefund(@PathVariable Long walletId);

    /**
     * 创建钱包退款审核
     * @return false/true
     */
    @PostMapping("/userWalletBill/createUserWalletRefundProcess")
    R<Boolean> createUserWalletRefundProcess(@Validated @RequestBody CreateUserWalletRefundReqDTO reqDTO);


    /**
     * 冻结或解冻钱包金额
     * @return false/true
     */
    @PostMapping("/userWalletBill/freezeOrThawUserWalletCost")
    R<Boolean> freezeOrThawUserWalletCost(@Validated @RequestBody FreezeUserWalletCostReqDTO reqDTO);

    // 用户钱包

    /**
     * 生成个人钱包信息
     * @return 钱包信息
     */
    @PostMapping("/userWallet/createUserWalletInfo")
    R<UserWalletInfoVO> createUserWalletInfo(@RequestBody CommonBaseDTO baseDTO);

    /**
     * 获取个人钱包信息
     * @return 钱包信息
     */
    @GetMapping("/userWallet/getUserWalletInfo")
    R<UserWalletInfoVO> getUserWalletInfo();

    /**
     * 获取个人钱包列表
     * @return 钱包信息
     */
    @PostMapping("/userWallet/findPageUserWalletInfoList")
    R<NestPage<UserWalletInfoListVO>> findPageUserWalletInfoList(@RequestBody PageUserWalletReqDTO reqDTO);


    /**
     * 根据钱包id获取个人钱包信息
     * @return 钱包信息
     */
    @GetMapping("/userWallet/getUserWalletInfoById/{walletId}")
    R<UserWalletInfoListVO> getUserWalletInfoById(@PathVariable Long walletId);

    /**
     * 根据平台id获取个人钱包信息
     * @return 钱包信息
     */
    @PostMapping("/userWallet/getUserWalletInfoByUserDetailId")
    R<UserWalletInfoVO> getUserWalletInfoByUserDetailId(@RequestBody Long userDetailId);
}
