package com.zsElectric.boot.business.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsElectric.boot.business.model.vo.AppletStationDetailVO;
import com.zsElectric.boot.business.model.vo.StationInfoMapVO;
import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
import com.zsElectric.boot.charging.entity.ThirdPartyStationInfo;
import com.zsElectric.boot.business.model.query.StationInfoQuery;
import com.zsElectric.boot.business.model.vo.StationInfoVO;
import com.zsElectric.boot.business.model.query.ThirdPartyStationInfoQuery;
import com.zsElectric.boot.business.model.vo.ThirdPartyStationInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 第三方充电站信息Mapper接口
 *
 * @author system
 * @since 2025-12-11
 */
@Mapper
public interface ThirdPartyStationInfoMapper extends BaseMapper<ThirdPartyStationInfo> {

    /**
     * 分页查询充电站信息（联表查询设备数量）
     *
     * @param page 分页对象
     * @param query 查询条件
     * @return 充电站信息分页列表
     */
    IPage<ThirdPartyStationInfoVO> selectStationInfoPage(Page<ThirdPartyStationInfoVO> page, @Param("query") ThirdPartyStationInfoQuery query);

    /**
     * 分页查询充电站信息（联表查询设备数量，固定设备所属方）
     *
     * @param page 分页对象
     * @param query 查询条件
     * @return 充电站信息分页列表
     */
    IPage<ThirdPartyStationInfoVO> selectStationInfoPageByEquipment(Page<ThirdPartyStationInfoVO> page, @Param("query") ThirdPartyStationInfoQuery query);

    /**
     * 小程序首页分页查询站点信息
     * 只返回已配置PolicyFee的站点
     *
     * @param page 分页对象
     * @param query 查询条件
     * @param currentTime 当前时间(HHmmss格式)
     * @param firmId 企业ID（可为null）
     * @return 站点信息分页列表
     */
    IPage<StationInfoVO> selectAppletStationInfoPage(
            Page<StationInfoVO> page,
            @Param("query") StationInfoQuery query,
            @Param("currentTime") String currentTime,
            @Param("firmId") Long firmId
    );

    /**
     * 小程序首页地图模式查询站点列表（按距离排序）
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param currentTime 当前时间(HHmmss格式)
     * @return 站点列表
     */
    java.util.List<StationInfoMapVO> selectStationMapList(
            @Param("longitude") java.math.BigDecimal longitude,
            @Param("latitude") java.math.BigDecimal latitude,
            @Param("currentTime") String currentTime
    );

    /**
     * 小程序查询站点详情基本信息
     *
     * @param stationId 站点ID
     * @param longitude 经度
     * @param latitude 纬度
     * @param currentTime 当前时间(HHmmss格式)
     * @param firmId 企业ID（可为null）
     * @return 站点详情
     */
    AppletStationDetailVO selectStationDetail(
            @Param("stationId") Long stationId,
            @Param("longitude") java.math.BigDecimal longitude,
            @Param("latitude") java.math.BigDecimal latitude,
            @Param("currentTime") String currentTime,
            @Param("firmId") Long firmId
    );

    /**
     * 查询用户当前正在充电中的订单实时费用
     * 一次查询获取所有需要的信息，减少数据库IO
     *
     * @param userId 用户ID
     * @return 实时充电费用信息
     */
    AppChargingCostVO selectCurrentChargingCost(@Param("userId") Long userId);

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