package com.zsElectric.boot.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zsElectric.boot.business.model.query.StationInfoQuery;
import com.zsElectric.boot.business.model.vo.AppletConnectorListVO;
import com.zsElectric.boot.business.model.vo.AppletStationDetailVO;
import com.zsElectric.boot.business.model.vo.AppletStationPriceListVO;
import com.zsElectric.boot.business.model.vo.BannerInfoVO;
import com.zsElectric.boot.business.model.vo.StationInfoMapVO;
import com.zsElectric.boot.business.model.vo.StationInfoVO;
import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
import com.zsElectric.boot.business.model.vo.applet.AppletConnectorDetailVO;

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

public interface AppletHomeService {

    /**
     * 用户端分页查询站点信息
     * */
    IPage<StationInfoVO> getStationInfoPage(StationInfoQuery queryParams);

    /**
     * 首页地图模式-获取站点列表（按距离排序）
     * */
    List<StationInfoMapVO> getStationInfoMapList(BigDecimal longitude, BigDecimal latitude);

    /**
     * 获取启用状态的Banner列表
     * @return Banner列表
     */
    List<BannerInfoVO> getBannerList(Integer location);

    /**
     * 获取电站详情
     * @param stationId 站点ID
     * @param longitude 经度（用于计算距离）
     * @param latitude 纬度（用于计算距离）
     * @return 电站详情
     */
    AppletStationDetailVO getStationDetail(Long stationId, BigDecimal longitude, BigDecimal latitude);

    /**
     * 获取电站充电终端列表
     * @param stationId 站点ID
     * @return 充电终端列表
     */
    AppletConnectorListVO getConnectorList(Long stationId);

    /**
     * 获取电站价格列表
     * @param stationId 站点ID
     * @return 价格列表
     */
    AppletStationPriceListVO getStationPriceList(Long stationId);

    /***
     * 获取用户当前充电订单费用信息
     * 根据当前登录用户ID查询正在充电中的订单
     * @return 实时充电费用信息，如果没有正在充电的订单则返回null
     * */
    AppChargingCostVO getCurrentChargingCost();

    /**
     * 搜索充电站
     * 根据站点名称和地址进行模糊查询
     *
     * @param keyword 搜索关键词（站点名称或地址）
     * @param longitude 经度（用于计算距离，可为null）
     * @param latitude 纬度（用于计算距离，可为null）
     * @return 搜索结果列表
     */
    List<AppStationSearchVO> searchStations(String keyword, BigDecimal longitude, BigDecimal latitude);

    /**
     * 获取充电设备接口详情
     * @return 设备接口详情
     */
    AppletConnectorDetailVO getConnectorDetail(String connectorCode);

    /**
     * 计算当前用户可用充电金额
     * 公式：可用余额 = 当前用户余额 - 安全价 - [((当前用户余额 - 安全价) / (电费 + 服务费)) × (运营费 + 增值费用)]
     * 说明：
     * 1. 先计算可充电度数 = (余额 - 安全价) / (电费 + 服务费)
     * 2. 根据度数计算运营费总额 = 度数 × 运营费
     * 3. 根据度数计算增值费用总额 = 度数 × 增值费用
     * 4. 可用余额 = 余额 - 安全价 - 运营费总额 - 增值费用总额
     * 注意：需要处理跨时段情况，不同时段价格不同，需要分段计算
     *
     * @param connectorId 充电设备接口ID
     * @return 可用充电金额（元）
     */
    BigDecimal calculateAvailableChargingAmount(Long connectorId);

}
