package com.aircraft.modules.order.service;

import com.aircraft.modules.order.domain.OrderMain;
import com.aircraft.modules.order.domain.dto.OrderMainPageQueryDTO;
import com.aircraft.modules.order.domain.dto.UpdateOrderDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 订单主表 服务类
 * </p>
 *
 * @author cli
 * @since 2025-07-10
 */
public interface IOrderMainService extends IService<OrderMain> {

    /**
     * 查询订单数据
     *
     * @param pageQueryDTO  {@link OrderMainPageQueryDTO}
     * @return  {@link List<OrderMain>}
     */
    List<OrderMain> queryAll(OrderMainPageQueryDTO pageQueryDTO);

    List<OrderMain> queryAllOrders();

    /**
     * 新增订单
     *
     * @param orderMain  {@link OrderMain}
     * @return  {@link OrderMain}
     */
    OrderMain addOrder(OrderMain orderMain);

    /**
     * 修改订单
     *
     * @param updateOrderDTO  {@link UpdateOrderDTO}
     */
    void editOrder(UpdateOrderDTO updateOrderDTO);

    /**
     * 根据订单ID查询订单
     *
     * @param orderId  订单ID
     * @return  {@link OrderMain}
     */
    OrderMain obtainOrderMainById(Long orderId);

    /**
     * 根据订单ID删除
     *
     * @param orderId 订单ID
     */
    void deleteOrderMainById(Long orderId);

    /**
     * 修改订单状态
     *
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     */
    void updateOrderStatus(Long orderId, Integer orderStatus);

    /**
     * 查询订单列表
     *
     * @param pageQueryDTO  {@link OrderMainPageQueryDTO}
     * @return  {@link List<OrderMain>}
     */
    List<OrderMain> obtainOrderList(OrderMainPageQueryDTO pageQueryDTO);

    /**
     * 根据订单ID集合获取
     *
     * @param orderIds  订单ID集合
     * @return  List<OrderMain>
     */
    List<OrderMain> obtainOrderListByOrderIds(List<Long> orderIds);

    /**
     * 根据订单ID修改结算状态
     *
     * @param orderIds 订单ID集合
     * @param settlementStatus 结算状态
     */
    void updateSettlementStatus(List<Long> orderIds, Integer settlementStatus);

    /**
     * 完成订单
     *
     * @param updateOrderMain  {@link OrderMain}
     */
    void finishMainOrder(OrderMain updateOrderMain);

    /**
     * 获取订单状态为飞行员确认中且时间小于等于当前时间finishTime的
     *
     * @param finishTime 自动完成时间
     * @return  {@link List<OrderMain>}
     */
    List<OrderMain> obtainOrderNotFinish(Date finishTime);

    /**
     * 根据订单ID修改订单状态
     *
     * @param orderIds 订单ID集合
     * @param mainOrderStatus 结算状态
     */
    void updateAutoFinishOrder(List<Long> orderIds, Integer mainOrderStatus);

}
