package cn.nianxx.thhotel.platform.hotel.repository;

import cn.nianxx.thhotel.platform.common.dto.PlatformPageSnapshot;
import cn.nianxx.thhotel.platform.hotel.domain.PlatformHotelEntity;
import cn.nianxx.thhotel.platform.hotel.domain.PlatformUserHotelEntity;
import java.util.List;
import java.util.Optional;

/**
 * 平台酒店仓储。负责酒店基础信息和用户酒店授权关系。
 */
public interface PlatformHotelRepository {

    /**
     * 按酒店业务 ID 查询酒店。
     */
    Optional<PlatformHotelEntity> findHotelByHotelId(String hotelId);

    /**
     * 按酒店内部 ID 查询酒店。
     */
    Optional<PlatformHotelEntity> findHotelById(Long id);

    /**
     * 查询全部启用酒店。
     */
    List<PlatformHotelEntity> listActiveHotels();

    /**
     * 查询全部酒店。
     */
    List<PlatformHotelEntity> listAllHotels();

    /**
     * 管理后台分页查询酒店。
     */
    PlatformPageSnapshot<PlatformHotelEntity> queryHotels(String keyword, String hotelStatus, int pageNum, int pageSize);

    /**
     * 根据酒店业务 ID 列表查询酒店。
     */
    List<PlatformHotelEntity> listHotelsByHotelIds(List<String> hotelIds);

    /**
     * 查询普通用户授权酒店 ID 列表。
     */
    List<String> listUserHotelIds(Long userId);

    /**
     * 查询指定用户 ID 列表对应用户酒店授权关系。
     */
    List<PlatformUserHotelEntity> listUserHotelRelationsByUserIds(List<Long> userIds);

    /**
     * 统计酒店授权用户数量。
     */
    long countAuthorizedUsersByHotelId(String hotelId);

    /**
     * 统计启用酒店数量。
     */
    long countActiveHotels();

    /**
     * 统计排除指定酒店后的启用酒店数量。
     */
    long countActiveHotelsExcluding(String hotelId);

    /**
     * 查询普通用户默认酒店 ID。
     */
    Optional<String> findUserDefaultHotelId(Long userId);

    /**
     * 新增酒店。
     */
    void insertHotel(PlatformHotelEntity hotel);

    /**
     * 更新酒店。
     */
    void updateHotel(PlatformHotelEntity hotel);

    /**
     * 确保用户酒店授权关系存在。
     */
    void ensureUserHotel(Long userId, String hotelId, boolean defaultHotel);

    /**
     * 覆盖普通用户酒店授权关系，并设置唯一默认酒店。
     */
    void replaceUserHotels(Long userId, List<String> hotelIds, String defaultHotelId);
}
