package com.ylx.massage.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.common.core.domain.R;
import com.ylx.massage.domain.TOrder;
import com.ylx.massage.domain.vo.HomeBlock;
import com.ylx.massage.domain.vo.OrderVerificationVo;
import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;


/**
 * 订单表 服务类
 */
public interface TOrderService extends IService<TOrder> {
    /**
     * 添加订单
     */
    public TOrder addOrder(TOrder order);

    /**
     * 支付订单
     */
    public R payOrder(TOrder order) throws Exception;

    /**
     * 拒绝订单
     */
    public Boolean jujue(TOrder order);

    /**
     * 确认服务完成
     * @param order
     * @return
     */
    public Boolean confirm(TOrder order);

    /**
     * 取消订单
     * @param order
     * @return
     */
    public Boolean cancle(TOrder order);


    public TOrder getByNo(String orderNo);

    /**
     * 分页查询订单数据
     * @param page
     * @param param
     * @return Page<TOrder>
     */
    public Page<TOrder> getAll(Page<TOrder>page, TOrder order);

    void takingOrders(TOrder order);

    /**
     *
     * @param outTradeNo
     */
    void payNotifyOrder(String outTradeNo);

    Object updateAddressById(TOrder borrow);

    Object depart(TOrder order);

    Integer getOrderNum(String jsid, Date startDate, Date endDate);

    Integer getAddNum(String jsid, Date startDate, Date endDate);

    Integer getUpgradeNum(String id, Date startDate, Date endDate);

    BigDecimal getTurnover(String id, Date startDate, Date endDate);

    TOrder transferOrder(TOrder order);

    List<HomeBlock> getBlock(Date start, Date end, String deptId);

    OrderVerificationVo verification(TOrder order);

    /**
     * 获取技师当天可预约时间
     * @param technicianId 技师ID
     * @param dateStr 查询日期（格式：yyyy-MM-dd），为null则查询当天
     * @return 技师当天可预约时间VO
     */
    TechnicianAvailabilityVo getTechnicianAvailability(String technicianId, String dateStr);

    /**
     * 申请取消订单（退单申请）
     * @param cId 订单ID
     * @param cancelReason 退单原因
     * @return 申请结果
     */
    Boolean applyCancle(String cId, String cancelReason);

    /**
     * 取消退单申请
     * 用户主动取消退单申请，恢复订单状态
     *
     * 业务流程：
     * 1. 参数校验（订单ID不能为空）
     * 2. 查询订单和退单申请记录
     * 3. 校验订单状态必须为"退单待审核"(6)
     * 4. 校验退单申请状态必须为"待审核"(0)
     * 5. 调用退单申请服务取消申请
     * 6. 恢复订单状态到申请前的原始状态
     *
     * @param order 订单对象，需要包含cId（订单ID）
     * @return 操作结果
     */
    Boolean cancelApplyCancle(TOrder order);

    int countCompletedOrders(String openId, Date queryTime);
}
