package com.pz.accompany;

import cn.dev33.satoken.annotation.SaIgnore;
import com.pz.common.core.controller.BaseController;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.domain.R;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.validate.EditGroup;
import com.pz.common.exception.ServiceException;
import com.pz.merchant.domain.bo.OrderBo;
import com.pz.merchant.domain.vo.OrderInfoVO;
import com.pz.merchant.service.IEmployeesService;
import com.pz.merchant.service.ISonOrderService;
import com.pz.merchant.service.impl.SonOrderServiceBuilder;
import com.pz.system.domain.bo.AccompanyAddressBo;
import com.pz.system.domain.bo.OrderCommonBo;
import com.pz.system.domain.bo.OrderFinishedBo;
import com.pz.system.domain.vo.AccompanyDemandVo;
import com.pz.system.domain.vo.OrderCommonVo;
import com.pz.system.service.IDbmyOrderService;
import com.pz.system.service.ITotalOrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;

/**
 * 陪诊员端[小程序]
 * <p>created in  2023/9/13 16:57
 *
 * @author WangMin
 * @version 1.0
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("app/accompany")
public class AccompanyController extends BaseController {

    private final ITotalOrderService totalOrderService;

    private final IEmployeesService employeesService;

    private final IDbmyOrderService dbmyOrderService;

    private final SonOrderServiceBuilder sonOrderServiceBuilder;


    /**
     * 需求广场 列表
     *
     * @param page 分页参数
     * @return 未分配陪诊员的业务订单
     */
    @GetMapping("/demands")
    public TableDataInfo<AccompanyDemandVo> demandSquareList(@RequestHeader("city_id") Integer cityCode, PageQuery page) {
        return totalOrderService.queryUndistributedOrder(cityCode, page);
    }

    /**
     * 订单评价 列表
     *
     * @param page 分页参数
     * @return 未分配陪诊员的业务订单
     */
    @GetMapping("/orderComment")
    public TableDataInfo<AccompanyDemandVo> orderCommentList(@NotNull(message = "陪诊员ID不能为空") Integer emId, PageQuery page) {
        return totalOrderService.queryOrderComment(emId, page);
    }

    /**
     * 获取需求广场订单详细信息
     *
     * @param orderId 订单ID
     * @return 待接单订单详情
     */
    public R<AccompanyDemandVo> getOrderInfoById(@NotNull(message = "订单ID不能为空") Long orderId) {
        return R.ok(totalOrderService.queryTotalOrderById(orderId));
    }

    /**
     * 陪诊员接单
     *
     * @param emId    陪诊员ID
     * @param orderId 主订单ID
     * @return 操作结果
     */
    @PostMapping("/order/receive")
    public R<Boolean> orderReceiving(@NotNull(message = "陪诊员ID不能为空") Integer emId, @NotNull(message = "订单ID不能为空") Integer orderId) {
        return R.ok(totalOrderService.orderReceiving(emId, orderId));
    }

    /**
     * 查询员工所有订单
     *
     * @param bo        筛选条件
     * @param pageQuery 分页
     * @return 订单列表
     */
    @GetMapping("/order/list")
    public TableDataInfo<OrderInfoVO> getAllOrders(OrderBo bo, PageQuery pageQuery) {
        return employeesService.queryAllOrder(bo, pageQuery);
    }

    /**
     * 陪诊员取消订单
     *
     * @param bo 订单参数
     * @return 操作结果
     */
    @PutMapping("/cancel")
    public R<Boolean> cancelOrder(@Validated(EditGroup.class) @RequestBody OrderCommonBo bo) {
        ISonOrderService orderService = sonOrderServiceBuilder.getSonOrderService(bo.getBusinessId());
        if (orderService == null) {
            throw new ServiceException("业务异常");
        }
        return R.ok(orderService.accompanyCancellationOfOrder(bo.getOrderId()));
    }

    /**
     * 陪诊员开始服务
     *
     * @param bo 订单参数
     * @return 操作结果
     */
    @PutMapping("/startService")
    public R<Boolean> startOrderService(@Validated(EditGroup.class) @RequestBody OrderCommonBo bo) {
        ISonOrderService orderService = sonOrderServiceBuilder.getSonOrderService(bo.getBusinessId());
        if (orderService == null) {
            throw new ServiceException("业务异常");
        }
        return R.ok(orderService.accompanyStartService(bo.getOrderId()));
    }

    /**
     * 陪诊员 完成服务
     *
     * @param bo 订单参数
     * @return 操作结果
     */
    @PutMapping("/finishedService")
    public R<Boolean> startOrderService(@Validated(EditGroup.class) @RequestBody OrderFinishedBo bo) {
        ISonOrderService orderService = sonOrderServiceBuilder.getSonOrderService(bo.getBusinessId());
        if (orderService == null) {
            throw new ServiceException("业务异常");
        }
        return R.ok(orderService.finishedService(bo));
    }

    /**
     * 设置代办买药 陪诊员地址
     *
     * @param bo 地址
     * @return 操作结果
     */
    @PutMapping("/setAddress")
    public R<Boolean> updateAccompanyAddress(@Validated(EditGroup.class) @RequestBody AccompanyAddressBo bo) {
        return R.ok(dbmyOrderService.updateAccompanyAddress(bo));
    }
}