package com.tzld.piaoquan.api.dao.mapper.contentplatform.ext;

import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformDemandVideo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ContentPlatformDemandVideoMapperExt {

    int batchInsert(@Param("list") List<ContentPlatformDemandVideo> list);

    int deleteByDt(@Param("dt") String dt);

    int deleteByDtLessThan(@Param("dt") String dt);

    int deleteByDtAndChannelName(@Param("dt") String dt, @Param("channelName") String channelName);

    List<ContentPlatformDemandVideo> selectByCondition(@Param("dt") String dt,
                                                       @Param("channelName") String channelName,
                                                       @Param("pointType") String pointType,
                                                       @Param("title") String title,
                                                       @Param("crowdSegment") String crowdSegment,
                                                       @Param("offset") int offset,
                                                       @Param("pageSize") int pageSize);

    int countByCondition(@Param("dt") String dt,
                         @Param("channelName") String channelName,
                         @Param("pointType") String pointType,
                         @Param("title") String title,
                         @Param("crowdSegment") String crowdSegment);

    String getMaxDt(@Param("channelName") String channelName);

    List<String> selectDistinctDtsLessThan(@Param("dt") String dt);

    /**
     * 按 ghName(channel_level3) 反查所属 channel_name,取该 gh 最新分区的一行。
     * 业务约定一个公众号只归属一个 channel,故 ORDER BY dt DESC LIMIT 1。
     * (不再先单独查全表 MAX(dt),省掉无 channel 过滤的全表扫描。)
     * 未命中返回 null,由调用方决定回退。
     */
    String selectChannelNameByGh(@Param("ghName") String ghName);

    /**
     * 推荐场景候选池查询：按 demand_strategy 取指定 crowd_segment 的候选行，
     * 按 total_rov DESC, score DESC 排，最多取 limit 行。
     * dimension：等值过滤；dimensionExclude：排除该 dimension（包含 NULL 视为通过）；
     * demandFilterSortStrategyLike：对 demand_filter_sort_strategy 做 LIKE 过滤；
     * excludeSelfTitle=true 时过滤掉 video.title == demand_content_title 的行。
     * excludeCategories：要剔除的 category 列表(SQL `NOT IN`,NULL 视为通过);为空/null 不做品类过滤。
     *   身份相关规则由 Service 层 `resolveExcludeCategories` 决定:
     *   - 渠道「公众号合作-Daily-自选」对所有身份返回空(白名单)
     *   - 内部/代理:["节日祝福"]
     *   - 合作方/其他:["早中晚好","节日祝福"]
     */
    List<ContentPlatformDemandVideo> selectForRecommend(@Param("dt") String dt,
                                                       @Param("channelName") String channelName,
                                                       @Param("crowdSegment") String crowdSegment,
                                                       @Param("demandStrategy") String demandStrategy,
                                                       @Param("dimension") String dimension,
                                                       @Param("dimensionExclude") String dimensionExclude,
                                                       @Param("demandFilterSortStrategyLike") String demandFilterSortStrategyLike,
                                                       @Param("channelLevel3") String channelLevel3,
                                                       @Param("driveDimensionTime") String driveDimensionTime,
                                                       @Param("category") String category,
                                                       @Param("matchMethod") String matchMethod,
                                                       @Param("demandType") String demandType,
                                                       @Param("crowdPackage") String crowdPackage,
                                                       @Param("limit") int limit,
                                                       @Param("excludeSelfTitle") boolean excludeSelfTitle,
                                                       @Param("excludeCategories") List<String> excludeCategories);

    List<String> selectDistinctCrowdPackages(@Param("dt") String dt, @Param("channelName") String channelName);

    /**
     * 搜索候选白名单:dt 最新分区下,该入口(channel + 入口维度)demand_strategy IN ('人群需求', '优质相似') 的视频行。
     * 非场景已看视频要求 rov >= demandMinRov;场景已看视频与列表下发一致,要求 rov > 0 且 scene_sum_rov >= priorSceneMinSumRov。
     * crowdSegment == "泛人群" 时翻译成 (NULL OR ''/'-'/'null'),与 selectForRecommend 一致。
     * ORDER BY rov DESC, id ASC,便于上层 putIfAbsent 直接取 max rov 代表行。
     * 小程序投流:crowdSegment=#{crowdPackage},channelLevel3=null
     * 公众号投流-稳定:crowdSegment=null,channelLevel3=#{ghName}
     */
    List<ContentPlatformDemandVideo> selectSearchWhitelist(@Param("dt") String dt,
                                                            @Param("channelName") String channelName,
                                                            @Param("crowdSegment") String crowdSegment,
                                                            @Param("channelLevel3") String channelLevel3,
                                                            @Param("demandMinRov") double demandMinRov,
                                                            @Param("priorSceneMinSumRov") double priorSceneMinSumRov);

    List<ContentPlatformDemandVideo> selectActiveVideos(@Param("dt") String dt);

    int updateStatusByVideoId(@Param("videoId") Long videoId, @Param("dt") String dt, @Param("status") Integer status, @Param("updateTimestamp") Long updateTimestamp);
}
