package com.zsElectric.boot.business.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsElectric.boot.business.model.dto.ChargeOrderInfoExportDTO;
import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
import com.zsElectric.boot.business.model.form.applet.AppStopChargeForm;
import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zsElectric.boot.business.model.vo.applet.AppChargeVO;
import com.zsElectric.boot.charging.entity.ThirdPartyStationInfo;

import java.util.List;

/**
 * 充电订单信息服务类
 *
 * @author zsElectric
 * @since 2025-12-17 19:13
 */
public interface ChargeOrderInfoService extends IService<ChargeOrderInfo> {

    /**
     *充电订单信息分页列表
     *
     * @return {@link IPage<ChargeOrderInfoVO>} 充电订单信息分页列表
     */
    IPage<ChargeOrderInfoVO> getChargeOrderInfoPage(ChargeOrderInfoQuery queryParams);

    /**
     * 获取充电订单信息表单数据
     *
     * @param id 充电订单信息ID
     * @return 充电订单信息表单数据
     */
     ChargeOrderInfoForm getChargeOrderInfoFormData(Long id);

    /**
     * 新增充电订单信息
     *
     * @param formData 充电订单信息表单对象
     * @return 是否新增成功
     */
    boolean saveChargeOrderInfo(ChargeOrderInfoForm formData);

    /**
     * 修改充电订单信息
     *
     * @param id   充电订单信息ID
     * @param formData 充电订单信息表单对象
     * @return 是否修改成功
     */
    boolean updateChargeOrderInfo(Long id, ChargeOrderInfoForm formData);

    /**
     * 删除充电订单信息
     *
     * @param ids 充电订单信息ID，多个以英文逗号(,)分割
     * @return 是否删除成功
     */
    boolean deleteChargeOrderInfos(String ids);

    IPage<ChargeOrderInfoVO> getPage(AppChargeOrderInfoQuery queryParams);

    AppChargeVO invokeCharge(AppInvokeChargeForm formData) throws JsonProcessingException;

    AppChargeVO stopCharge(AppStopChargeForm formData);

    /**
     * 订单结算后的账户余额扣减
     *
     * @param chargeOrderId 充电订单ID
     */
    void orderSettlement(Long chargeOrderId);

    ChargeOrderInfoVO queryOrder(String chargeOrderNo);

    /**
     * 获取充电订单信息导出列表
     *
     * @param queryParams 查询参数
     * @return 充电订单信息导出列表
     */
    List<ChargeOrderInfoExportDTO> listExportChargeOrderInfo(ChargeOrderInfoQuery queryParams);

    /**
     * 修复未处理的充电订单
     * 查找状态为5(未成功充电)且third_party_charge_status表中total_power>0的订单
     * 重新处理这些订单：更新状态、计算费用、扣减余额
     *
     * @return 修复结果描述
     */
    String repairUnprocessedOrders();

    /**
     * 根据充电订单号修复订单
     * 重新处理订单状态变更、数据修改及余额扣减
     * 优先通过third_party_api_log表获取推送数据，备选通过third_party_charge_status表查询
     *
     * @param chargeOrderNo 充电订单号
     * @return 修复结果描述
     */
    String repairOrderByOrderNo(String chargeOrderNo);

    /**
     * 补偿未处理的充电订单（定时任务调用）
     * 查找状态为3(已完成)或5(未成功充电)且充电数据为0的订单
     * 优先通过third_party_api_log表获取推送数据，备选通过third_party_charge_status表查询
     *
     * @return 补偿结果描述
     */
    String compensateUnprocessedOrders();

}
