package com.ruoyi.app.flashdelivery.controller;

import com.ruoyi.app.flashdelivery.dto.*;
import com.ruoyi.app.flashdelivery.exception.FlashDeliveryQuoteChangedException;
import com.ruoyi.app.flashdelivery.service.FlashDeliveryApplicationService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.system.utils.Auth;
import com.ruoyi.system.utils.JwtUtil;
import org.springframework.web.bind.annotation.*;

/** 用户端闪送接口；用户身份始终从请求头 token 解析。 */
@RestController
@RequestMapping("/system/flashDelivery")
@Anonymous
public class FlashDeliveryUserController extends BaseController {
    private final FlashDeliveryApplicationService service;
    public FlashDeliveryUserController(FlashDeliveryApplicationService service) { this.service = service; }

    /** 获取当前启用的服务类型和公开计价摘要。 */
    @GetMapping("/home")
    @Auth
    public AjaxResult home(@RequestHeader String token) { return success(service.home()); }

    /** 根据取送坐标获取服务端实时报价。 */
    @PostMapping("/quote")
    @Auth
    public AjaxResult quote(@RequestHeader String token, @RequestBody FlashDeliveryQuoteRequest request) {
        userId(token);
        return success(service.quote(request));
    }

    /** 幂等创建闪送订单，客户端不能指定用户、距离或金额。 */
    @PostMapping("/orders")
    @Auth
    public AjaxResult create(@RequestHeader String token, @RequestBody FlashDeliveryCreateRequest request) {
        try {
            return success(service.create(userId(token), request));
        } catch (FlashDeliveryQuoteChangedException exception) {
            return AjaxResult.error(MessageUtils.message("flash.delivery.quote.changed"),
                    exception.getLatestQuote());
        }
    }

    /** 分页查询当前用户自己的闪送订单。 */
    @GetMapping("/orders")
    @Auth
    public AjaxResult orders(@RequestHeader String token,
                             @RequestParam(defaultValue = "1") int page,
                             @RequestParam(defaultValue = "10") int size,
                             @RequestParam(required = false) String role) {
        return success(service.userOrders(userId(token), page, size, role));
    }

    /** 查询本人订单详情，直接返回订单字段和按类型分组的履约图片。 */
    @GetMapping("/orders/{id}")
    @Auth
    public AjaxResult detail(@RequestHeader String token, @PathVariable Long id) {
        return success(service.userDetail(userId(token), id));
    }

    /** 在待接单或已接单阶段取消本人订单。 */
    @PostMapping("/orders/{id}/cancel")
    @Auth
    public AjaxResult cancel(@RequestHeader String token, @PathVariable Long id,
                             @RequestBody FlashDeliveryReasonRequest request) {
        service.userCancel(userId(token), id, request);
        return success();
    }

    /** 用户确认已经收到物品，将已送达订单置为已完成。 */
    @PostMapping("/orders/{id}/confirmReceipt")
    @Auth
    public AjaxResult confirmReceipt(@RequestHeader String token, @PathVariable Long id) {
        service.confirmReceipt(userId(token), id);
        return success();
    }

    private Long userId(String token) { return Long.valueOf(new JwtUtil().getusid(token)); }
}
