package com.snack.server.module.order.controller;

import com.snack.server.module.order.service.AlipayService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Map;

/**
 * 支付宝回调（电脑网站支付）
 *
 * 1. 支付成功后支付宝 POST 异步通知 /api/payment/alipay/notify
 * 2. 服务端验签后更新订单状态，返回 "success" 给支付宝
 * 3. 用户支付完成同步跳转 /api/payment/alipay/return，再重定向到前端
 */
@Slf4j
@RestController
@RequestMapping("/api/payment")
@RequiredArgsConstructor
public class PaymentNotifyController {

    private final AlipayService alipayService;

    /**
     * 支付宝支付成功异步通知（必须返回纯文本 success / fail）
     */
    @PostMapping("/alipay/notify")
    public String alipayNotify(@RequestParam Map<String, String> params) {
        log.info("收到支付宝支付异步通知 out_trade_no={} trade_status={}",
                params.get("out_trade_no"), params.get("trade_status"));
        return alipayService.handleNotify(params);
    }

    /**
     * 支付宝退款异步通知（必须返回纯文本 success / fail）
     */
    @PostMapping("/alipay/refund/notify")
    public String alipayRefundNotify(@RequestParam Map<String, String> params) {
        log.info("收到支付宝退款异步通知 out_trade_no={}", params.get("out_trade_no"));
        return alipayService.handleRefundNotify(params);
    }

    /**
     * 支付宝电脑网站支付同步返回（用户支付后从支付宝跳回）
     */
    @GetMapping("/alipay/return")
    public void alipayReturn(@RequestParam Map<String, String> params,
                             HttpServletResponse response) throws IOException {
        String redirectUrl = alipayService.handleReturn(params);
        response.sendRedirect(redirectUrl);
    }
}
