package com.bizzan.bitrade.controller.staking;

import com.bizzan.bitrade.controller.common.BaseAdminController;
import com.bizzan.bitrade.entity.AirdropRecord;
import com.bizzan.bitrade.service.AirdropPoolService;
import com.bizzan.bitrade.util.MessageResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * 管理员空投管理接口，支持向指定用户分配空投及查看领取记录
 *
 * @author auto
 * @date 2026-05-17
 */
@RestController
@RequestMapping("/airdrop")
@Slf4j
public class AirdropAdminController extends BaseAdminController {

    @Autowired
    private AirdropPoolService airdropPoolService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    // ========================= 空投分配 =========================

    /**
     * 向指定用户分配空投（创建待领取记录）
     *
     * @param record 分配信息（memberId、coinUnit、amount 必填）
     * @return 操作结果
     */
    @RequiresPermissions("airdrop:distribute")
    @PostMapping("/distribute")
    public MessageResult distribute(@RequestBody AirdropRecord record) {
        if (record.getMemberId() == null) {
            return error("用户ID不能为空");
        }
        if (record.getStakingOrderId() == null) {
            return error("质押订单ID不能为空");
        }
        if (record.getCoinUnit() == null || record.getCoinUnit().isEmpty()) {
            return error("币种不能为空");
        }
        if (record.getAmount() == null || record.getAmount().compareTo(java.math.BigDecimal.ZERO) <= 0) {
            return error("分配金额必须大于0");
        }
        return airdropPoolService.distribute(record);
    }

    // ========================= 领取记录查询 =========================

    /**
     * 分页查询所有用户的空投记录（支持按状态过滤）
     *
     * @param status   状态筛选：0=待领取，1=已发放，2=审核中，3=已拒绝，不传则查全部
     * @param pageNo   页码（从1开始）
     * @param pageSize 每页条数
     * @return 记录分页数据
     */
    @RequiresPermissions("airdrop:record")
    @PostMapping("/records")
    public MessageResult listRecords(@RequestParam(required = false) Integer status,
                                     @RequestParam(defaultValue = "1") int pageNo,
                                     @RequestParam(defaultValue = "20") int pageSize) {
        Page<AirdropRecord> page = airdropPoolService.getAuditList(status, pageNo, pageSize);
        return success(page);
    }

    // ========================= 审核操作 =========================

    /**
     * 查询待审核的空投申请列表（status=2）
     *
     * @param pageNo   页码（从1开始）
     * @param pageSize 每页条数
     * @return 待审核记录分页
     */
    @RequiresPermissions("airdrop:audit")
    @PostMapping("/audit/list")
    public MessageResult auditList(@RequestParam(defaultValue = "1") int pageNo,
                                   @RequestParam(defaultValue = "20") int pageSize) {
        Page<AirdropRecord> page = airdropPoolService.getAuditList(2, pageNo, pageSize);
        return success(page);
    }

    /**
     * 审核通过：将空投记录入账至质押钱包并标记为已发放
     *
     * @param id 空投记录ID
     * @return 操作结果
     */
    @RequiresPermissions("airdrop:audit")
    @PostMapping("/audit/approve/{id}")
    public MessageResult approve(@PathVariable Long id) {
        MessageResult result = airdropPoolService.approveAudit(id);
        if (result.getCode() == 0) {
            // 通知合约账户缓存刷新（从 AirdropRecord 中取 memberId 需重新查，此处通过返回 data 传递）
            AirdropRecord record = (AirdropRecord) result.getData();
            if (record != null) {
                kafkaTemplate.send("trading-account-change", record.getMemberId() + "");
            }
        }
        return result;
    }

    /**
     * 审核拒绝：将空投记录标记为已拒绝并记录拒绝理由
     *
     * @param id     空投记录ID
     * @param remark 拒绝理由（可为空）
     * @return 操作结果
     */
    @RequiresPermissions("airdrop:audit")
    @PostMapping("/audit/reject/{id}")
    public MessageResult reject(@PathVariable Long id,
                                @RequestParam(required = false) String remark) {
        return airdropPoolService.rejectAudit(id, remark);
    }
}
