package com.ycwl.basic.mapper;

import com.ycwl.basic.model.pc.device.resp.DeviceSourceStatsVO;
import com.ycwl.basic.model.pc.device.resp.DeviceSourceTimelineVO;
import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.pc.source.entity.SourceWatermarkEntity;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @Author：longbinbin
 * @Date：2024/12/2 11:21
 * 视频源
 */
@Mapper
public interface SourceMapper {
    List<SourceRespVO> list(SourceReqQuery sourceReqQuery);

    SourceRespVO getById(Long id);
    SourceRespVO userGetById(Long id, Long userId);

    List<SourceEntity> listBySampleIds(List<Long> sourceIds);

    int add(SourceEntity source);

    int deleteById(Long id);

    int update(SourceEntity source);

    /**
     * @param sourceReqQuery
     * @return
     */
    List<SourceRespVO> listGroupByType(SourceReqQuery sourceReqQuery);

    /**
     * 用户素材数量
     *
     * @param userId
     * @return
     */
    int countByMemberId(String userId);

    List<SourceEntity> listVideoBySampleIds(List<Long> sampleId);

    SourceEntity findBySampleId(Long faceSampleId);

    int addRelation(MemberSourceEntity source);

    List<SourceRespVO> listUser(SourceReqQuery sourceReqQuery);
    Integer countUser(SourceReqQuery sourceReqQuery);
    SourceRespVO listUserOne(Long userId, Long sourceId);

    int addRelations(List<MemberSourceEntity> list);

    List<MemberSourceEntity> filterExistingRelations(List<MemberSourceEntity> list);

    boolean sourceExists(Long sourceId);

    List<MemberSourceEntity> filterValidSourceRelations(List<MemberSourceEntity> list);

    int updateRelation(MemberSourceEntity memberSourceEntity);
    int freeRelations(List<Long> ids, int type);

    List<SourceRespVO> queryByRelation(SourceReqQuery sourceReqQuery);

    /**
     * 按 faceId 和 type 分组查询源素材,每组返回最新的一条记录
     * @param sourceReqQuery 查询参数
     * @return 分组后的素材列表
     */
    List<SourceRespVO> queryGroupedByFaceAndType(SourceReqQuery sourceReqQuery);

    SourceEntity querySameVideo(Long faceSampleId, Long deviceId);

    int hasRelationTo(Long memberId, Long sourceId, int type);

    List<SourceEntity> listVideoByScenicFaceRelation(Long scenicId, Long faceId);
    List<SourceEntity> listVideoByFaceRelation(Long faceId);

    List<SourceEntity> listImageByFaceRelation(Long faceId);
    List<SourceEntity> listAiCamImageByFaceRelation(Long faceId);
    List<MemberSourceEntity> listByFaceRelation(Long faceId, Integer type);

    SourceEntity getEntity(Long id);

    int deleteNotRelateSource(int type, Date endDate);

    int deleteNotBuyRelations(Long scenicId, Date endDate);

    int deleteNotBuyFaceRelation(Long userId, Long faceId);
    List<SourceWatermarkEntity> listSourceWatermark(List<Long> sourceIds, Long faceId, String watermarkType);

    void addSourceWatermark(Long sourceId, Long faceId, String type, String url);

    int deleteUselessSource();
    
    int updateMemberIdByFaceId(Long faceId, Long memberId);
    
    /**
     * 根据faceId查询type=2的source列表
     * @param faceId 人脸ID
     * @return type=2的source列表
     */
    List<SourceEntity> listImageSourcesByFaceId(Long faceId);

    /**
     * 从ZT-Source消息添加素材
     * @param source 素材实体
     * @return 影响行数
     */
    int addFromZTSource(SourceEntity source);

    SourceEntity getBySampleIdAndType(Long faceSampleId, Integer type);

    /**
     * 统计faceId关联的不同设备数量
     * @param faceId 人脸ID
     * @return 设备数量
     */
    Integer countDistinctDevicesByFaceId(Long faceId);

    /**
     * 根据faceId和设备索引获取source
     * @param faceId 人脸ID
     * @param deviceIndex 设备索引(从0开始)
     * @param type 素材类型(1-视频,2-图片)
     * @param sortStrategy 排序策略
     * @return source实体
     */
    SourceEntity getSourceByFaceAndDeviceIndex(Long faceId, Integer deviceIndex, Integer type, String sortStrategy);

    /**
     * 获取faceId关联的所有设备ID列表
     * @param faceId 人脸ID
     * @return 设备ID列表
     */
    List<Long> getDeviceIdsByFaceId(Long faceId);

    /**
     * 获取faceId关联的图片素材的最大创建时间
     * @param faceId 人脸ID
     * @return 最大创建时间，无记录时返回null
     */
    Date getMaxCreateTimeByFaceId(Long faceId);

    /**
     * 根据faceId和设备ID获取source
     * @param faceId 人脸ID
     * @param deviceId 设备ID
     * @param type 素材类型(1-视频,2-图片)
     * @param sortStrategy 排序策略
     * @return source实体
     */
    SourceEntity getSourceByFaceAndDeviceId(Long faceId, Long deviceId, Integer type, String sortStrategy);

    /**
     * 根据faceSampleId列表和type查询source列表
     * @param faceSampleIds faceSampleId列表
     * @param type 素材类型
     * @return source实体列表
     */
    List<SourceEntity> listByFaceSampleIdsAndType(List<Long> faceSampleIds, Integer type);

    /**
     * 删除指定faceId和type的member_source关联记录
     * @param faceId 人脸ID
     * @param type 素材类型
     * @return 删除的记录数
     */
    int deleteRelationsByFaceIdAndType(Long faceId, Integer type);

    /**
     * 统计指定faceId和type的免费关联记录数
     * @param faceId 人脸ID
     * @param type 素材类型
     * @return 免费记录数
     */
    int countFreeRelationsByFaceIdAndType(Long faceId, Integer type);

    /**
     * 根据faceId和type直接查询关联的source列表（避免N+1查询）
     * @param faceId 人脸ID
     * @param type 素材类型
     * @return source实体列表
     */
    List<SourceEntity> listSourceByFaceRelation(Long faceId, Integer type);

    /**
     * 根据sourceId列表查询关联的faceId
     * @param sourceIds sourceId列表
     * @return member_source记录列表（包含sourceId和faceId）
     */
    List<MemberSourceEntity> listFaceIdsBySourceIds(List<Long> sourceIds);

    /**
     * 根据faceId分页查询关联的source记录
     * @param sourceReqQuery 查询参数（需设置faceId）
     * @return source响应列表
     */
    List<SourceRespVO> pageByFaceId(SourceReqQuery sourceReqQuery);

    int softDeleteRelation(Long id);

    int reactivateRelation(Long id);

    List<SourceRespVO> pageDeletedByFaceId(SourceReqQuery sourceReqQuery);

    MemberSourceEntity getMemberSourceById(Long id);

    /**
     * 设备拍摄统计：拍摄总数、拍摄人数、售出张数、赠送张数、售出人数
     * @param deviceId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    DeviceSourceStatsVO getDeviceSourceStats(Long deviceId, Date startTime, Date endTime);

    /**
     * 按 5 分钟分桶统计设备 type=2 的拍摄数量（仅返回有数据的桶）
     * @param deviceId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 有数据的时间桶列表
     */
    List<DeviceSourceTimelineVO> getDeviceSourceTimeline(Long deviceId, Date startTime, Date endTime);

    /**
     * 根据会员ID和素材ID查询 member_source 关联记录
     * @param memberId 会员ID
     * @param sourceId 素材ID
     * @return 关联记录（含 faceId 等信息）
     */
    MemberSourceEntity getMemberSourceByMemberAndSourceId(@Param("memberId") Long memberId, @Param("sourceId") Long sourceId);

    /**
     * 根据会员ID和素材ID更新 member_source 关联记录的购买状态
     * @param memberSourceEntity 包含 memberId、sourceId、isBuy、orderId
     * @return 影响行数
     */
    int updateRelationBySourceId(MemberSourceEntity memberSourceEntity);
}
